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