class AMA::Entity::Mapper::Type::BuiltIn::PrimitiveType::Denormalizer
Standard denormalizer for primitive type
Public Class Methods
new(method_map)
click to toggle source
@param [Hash{Class, Array<Symbol>}] method_map
# File lib/ama-entity-mapper/type/builtin/primitive_type/denormalizer.rb, line 17 def initialize(method_map) @method_map = method_map end
Public Instance Methods
denormalize(source, type, context)
click to toggle source
@param [Object] source @param [AMA::Entity::Mapper::Type] type @param [AMA::Entity::Mapper::Context] context
# File lib/ama-entity-mapper/type/builtin/primitive_type/denormalizer.rb, line 24 def denormalize(source, type, context) return source if type.valid?(source, context) find_candidate_methods(source.class).each do |candidate| begin next unless source.respond_to?(candidate) value = source.send(candidate) return value if type.valid?(value, context) rescue StandardError => e message = "Method #{candidate} failed with error when " \ "denormalizing #{type.type} out of #{source.class}: " \ "#{e.message}" context.logger.warn(message) end end message = "Can't create #{type} instance from #{source.class}" mapping_error(message, context: context) end
Private Instance Methods
find_candidate_methods(klass)
click to toggle source
# File lib/ama-entity-mapper/type/builtin/primitive_type/denormalizer.rb, line 44 def find_candidate_methods(klass) chain = [] cursor = klass until cursor.nil? chain.push(cursor) cursor = cursor.superclass end winner = chain.find do |entry| @method_map.key?(entry) end winner.nil? ? [] : @method_map[winner] end