Sha256: 3a256884a994574c368e1de04935f61e9fefe8b33217f7e776b17ef6c1fcb884

Contents?: true

Size: 1.22 KB

Versions: 3

Compression:

Stored size: 1.22 KB

Contents

module ROM

  # @api private
  class Mapper
    attr_reader :header, :model

    class Basic < Mapper
      attr_reader :mapping

      def initialize(header, model)
        super
        @mapping = header.mapping
      end

      def load(tuple, mapping = self.mapping)
        model.new(Hash[call(tuple, mapping)])
      end

      def call(tuple, mapping = self.mapping)
        tuple.map { |key, value| [mapping[key], value] }
      end
    end

    class Recursive < Basic
      def call(tuple, mapping = self.mapping)
        tuple.map do |key, value|
          case value
          when Hash  then [key, Hash[call(value, mapping[key])]]
          when Array then [key, value.map { |v| Hash[call(v, mapping[key])] }]
          else
            [mapping[key], value]
          end
        end
      end
    end

    def self.build(header, model)
      klass =
        if header.any? { |attribute| attribute.embedded? }
          Recursive
        elsif header.any? { |attribute| attribute.aliased? }
          Basic
        else
          self
        end

      klass.new(header, model)
    end

    def initialize(header, model)
      @header = header
      @model = model
    end

    def load(tuple)
      model.new(tuple)
    end

  end

end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
rom-0.4.0 lib/rom/mapper.rb
rom-0.3.1 lib/rom/mapper.rb
rom-0.3.0 lib/rom/mapper.rb