class AMA::Entity::Mapper::Type::BuiltIn::HashType

Predefined type for Hash class

Constants

INSTANCE

Public Class Methods

new() click to toggle source
Calls superclass method AMA::Entity::Mapper::Type::new
# File lib/ama-entity-mapper/type/builtin/hash_type.rb, line 20
def initialize
  super(::Hash)
  define_attribute
  define_enumerator
  define_injector
  define_normalizer
  define_denormalizer
end

Private Instance Methods

define_attribute() click to toggle source
# File lib/ama-entity-mapper/type/builtin/hash_type.rb, line 31
def define_attribute
  type = HashTupleType.new
  type = type.resolve(
    type.parameter!(:K) => parameter!(:K),
    type.parameter!(:V) => parameter!(:V)
  )
  attribute!(:_tuple, type, virtual: true)
end
define_denormalizer() click to toggle source
# File lib/ama-entity-mapper/type/builtin/hash_type.rb, line 58
def define_denormalizer
  denormalizer_block do |input, type, context = nil, *|
    input = input.to_h if input.respond_to?(:to_h)
    break input if input.is_a?(Hash)
    message = "Expected to receive hash, #{input.class} received"
    type.mapping_error(message, context: context)
  end
end
define_enumerator() click to toggle source
# File lib/ama-entity-mapper/type/builtin/hash_type.rb, line 40
def define_enumerator
  enumerator_block do |entity, type, *|
    ::Enumerator.new do |yielder|
      entity.each do |key, value|
        tuple = Aux::HashTuple.new(key: key, value: value)
        attribute = type.attributes[:_tuple]
        yielder << [attribute, tuple, Path::Segment.index(key)]
      end
    end
  end
end
define_injector() click to toggle source
# File lib/ama-entity-mapper/type/builtin/hash_type.rb, line 52
def define_injector
  injector_block do |entity, _, _, tuple, *|
    entity[tuple.key] = tuple.value
  end
end
define_normalizer() click to toggle source
# File lib/ama-entity-mapper/type/builtin/hash_type.rb, line 67
def define_normalizer
  normalizer_block do |entity, *|
    intermediate = entity.map do |key, value|
      [key, value]
    end
    Hash[intermediate]
  end
end