Class: ReeMapper::Mapper
- Inherits:
-
Object
- Object
- ReeMapper::Mapper
- Defined in:
- lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb
Instance Attribute Summary collapse
-
#fields ⇒ Object
readonly
Returns the value of attribute fields.
-
#strategies ⇒ Object
readonly
Returns the value of attribute strategies.
-
#strategy_methods ⇒ Object
readonly
Returns the value of attribute strategy_methods.
-
#type ⇒ Object
readonly
Returns the value of attribute type.
Class Method Summary collapse
Instance Method Summary collapse
- #add_field(field) ⇒ Object
- #dto(strategy_method) ⇒ Object
- #find_strategy(strategy_method) ⇒ Object
-
#initialize(strategies, type) ⇒ Mapper
constructor
A new instance of Mapper.
- #name ⇒ Object
- #name=(name) ⇒ Object
- #prepare_dto ⇒ Object
Constructor Details
#initialize(strategies, type) ⇒ Mapper
Returns a new instance of Mapper.
102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 102 def initialize(strategies, type) @fields = {} @type = type @strategies = strategies @strategy_methods = strategies.map(&:method) strategies.each do |strategy| method = strategy.method instance_variable_set(:"@#{method}_strategy", strategy) end end |
Instance Attribute Details
#fields ⇒ Object (readonly)
Returns the value of attribute fields.
100 101 102 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 100 def fields @fields end |
#strategies ⇒ Object (readonly)
Returns the value of attribute strategies.
100 101 102 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 100 def strategies @strategies end |
#strategy_methods ⇒ Object (readonly)
Returns the value of attribute strategy_methods.
100 101 102 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 100 def strategy_methods @strategy_methods end |
#type ⇒ Object (readonly)
Returns the value of attribute type.
100 101 102 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 100 def type @type end |
Class Method Details
.build(strategies, type = nil) ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 8 def self.build(strategies, type = nil) if type strategies.each do |strategy| method = strategy.method next if type.respond_to?(method) raise ReeMapper::UnsupportedTypeError, "#{type.class} should implement method `#{method}`" end end klass = Class.new(self) klass.instance_eval do strategies.each do |strategy| method = strategy.method if type class_eval(<<~RUBY, __FILE__, __LINE__ + 1) def #{method}(obj, role: nil, only: nil, except: nil, fields_filters: nil) #{ if type.is_a?(ReeMapper::AbstractWrapper) "@type.#{method}(obj, role:, fields_filters:)" else "@type.#{method}(obj)" end } end RUBY else class_eval(<<~RUBY, __FILE__, __LINE__ + 1) def #{method}(obj, role: nil, only: nil, except: nil, fields_filters: nil) user_fields_filter = ReeMapper::FieldsFilter.build(only, except) if !user_fields_filter.nil? fields_filters = if fields_filters.nil? [user_fields_filter] else fields_filters + [user_fields_filter] end end @fields.each_with_object(@#{method}_strategy.build_object) do |(_, field), acc| next unless fields_filters.nil? || fields_filters.all? { _1.allow? field.name } next unless field.has_role?(role) value = if @#{method}_strategy.has_value?(obj, field) @#{method}_strategy.get_value(obj, field) else if !field.optional && !@#{method}_strategy.always_optional raise ReeMapper::TypeError.new( "is missing (required field)", field.location, [field.from_as_str] ) end next unless field.has_default? field.default end if !value.nil? || !field.null nested_fields_filters = fields_filters&.filter_map { _1.filter_for(field.name) } if field.fields_filter nested_fields_filters = if nested_fields_filters nested_fields_filters + [field.fields_filter] else [field.fields_filter] end end value = begin field.type.#{method}(value, role:, fields_filters: nested_fields_filters) rescue ReeMapper::ErrorWithLocation => e e.prepend_field_name field.name_as_str e.location ||= field.location raise e end end @#{method}_strategy.assign_value(acc, field, value) end end RUBY end end end klass.new(strategies, type) end |
Instance Method Details
#add_field(field) ⇒ Object
115 116 117 118 119 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 115 def add_field(field) raise ArgumentError if field.name.nil? @fields[field.name] = field nil end |
#dto(strategy_method) ⇒ Object
132 133 134 135 136 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 132 def dto(strategy_method) strategy = find_strategy(strategy_method) raise ArgumentError, "there is no :#{strategy_method} strategy" unless strategy strategy.dto end |
#find_strategy(strategy_method) ⇒ Object
146 147 148 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 146 def find_strategy(strategy_method) strategies.detect { _1.method == strategy_method } end |
#name ⇒ Object
122 123 124 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 122 def name @name end |
#name=(name) ⇒ Object
127 128 129 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 127 def name=(name) @name = name end |
#prepare_dto ⇒ Object
139 140 141 142 143 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 139 def prepare_dto raise ReeMapper::ArgumentError, "mapper should contain at least one field" if fields.empty? strategies.each { _1.prepare_dto(fields.keys) } nil end |