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
-
#__dbl_cast(field, value, nested_filters) ⇒ Object
Slow path of compiled db_load: full cast with the same error decoration as the generic per-field loop.
- #add_field(field) ⇒ Object
-
#db_load_trusted_check(var) ⇒ Object
Guard expression for the wrapped type, or nil when this mapper's db_load must always be called (composite mappers, wrappers, custom types).
- #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(" def \#{method}(obj, role: nil, only: nil, except: nil, fields_filters: nil)\n \#{\n if type.is_a?(ReeMapper::AbstractWrapper)\n \"@type.\#{method}(obj, role:, fields_filters:)\"\n else\n \"@type.\#{method}(obj)\"\n end\n }\n end\n RUBY\n else\n class_eval(<<~RUBY, __FILE__, __LINE__ + 1)\n def \#{method}(obj, role: nil, only: nil, except: nil, fields_filters: nil)\n user_fields_filter = ReeMapper::FieldsFilter.build(only, except)\n\n if !user_fields_filter.nil?\n fields_filters = if fields_filters.nil?\n [user_fields_filter]\n else\n fields_filters + [user_fields_filter]\n end\n end\n\n @fields.each_with_object(@\#{method}_strategy.build_object) do |(_, field), acc|\n next unless fields_filters.nil? || fields_filters.all? { _1.allow? field.name }\n next unless field.has_role?(role)\n\n value = if @\#{method}_strategy.has_value?(obj, field)\n @\#{method}_strategy.get_value(obj, field)\n else\n if !field.optional && !@\#{method}_strategy.always_optional\n raise ReeMapper::TypeError.new(\n \"is missing (required field)\",\n field.location,\n [field.from_as_str]\n )\n end\n\n next unless field.has_default?\n\n field.default\n end\n\n if !value.nil? || !field.null\n nested_fields_filters = fields_filters&.filter_map { _1.filter_for(field.name) }\n\n if field.fields_filter\n nested_fields_filters = if nested_fields_filters\n nested_fields_filters + [field.fields_filter]\n else\n [field.fields_filter]\n end\n end\n\n value = begin\n field.type.\#{method}(value, role:, fields_filters: nested_fields_filters)\n rescue ReeMapper::ErrorWithLocation => e\n e.prepend_field_name field.name_as_str\n e.location ||= field.location\n raise e\n end\n end\n\n @\#{method}_strategy.assign_value(acc, field, value)\n end\n end\n RUBY\n end\n end\n end\n\n klass.new(strategies, type)\nend\n", __FILE__, __LINE__ + 1) |
Instance Method Details
#__dbl_cast(field, value, nested_filters) ⇒ Object
Slow path of compiled db_load: full cast with the same error decoration as the generic per-field loop
162 163 164 165 166 167 168 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 162 def __dbl_cast(field, value, nested_filters) field.type.db_load(value, role: nil, fields_filters: nested_filters) rescue ReeMapper::ErrorWithLocation => e e.prepend_field_name(field.name_as_str) e.location ||= field.location raise e end |
#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 |
#db_load_trusted_check(var) ⇒ Object
Guard expression for the wrapped type, or nil when this mapper's db_load must always be called (composite mappers, wrappers, custom types)
155 156 157 158 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 155 def db_load_trusted_check(var) return nil if @type.nil? @type.respond_to?(:db_load_trusted_check) ? @type.db_load_trusted_check(var) : 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
171 172 173 |
# File 'lib/ree_lib/packages/ree_mapper/package/ree_mapper/mapper.rb', line 171 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 144 145 146 147 148 |
# 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) } if ReeMapper.db_load_performance_mode? && find_strategy(:db_load) ReeMapper::DbLoadCompiler.compile(self) end nil end |