Sha256: 219bc46d20c0140ec8c79a907f0c0bbae3e7c7e848f133084abafe0f6b8bfa28

Contents?: true

Size: 1.71 KB

Versions: 2

Compression:

Stored size: 1.71 KB

Contents

require 'rom/model_builder'

module ROM

  # @api private
  class MapperBuilder

    class AttributeDSL
      attr_reader :attributes

      def initialize
        @attributes = []
      end

      def header
        Header.coerce(attributes)
      end

      def attribute(name, options = {})
        attributes << [name, options]
      end
    end

    attr_reader :name, :root, :prefix,
      :model_builder, :model_class, :attributes

    def initialize(name, root, options = {})
      @name = name
      @root = root
      @prefix = options[:prefix]
      @attributes = root.header.map { |attr| [prefix ? :"#{prefix}_#{attr}" : attr] }
    end

    def model(options)
      if options.is_a?(Class)
        @model_class = options
      else
        @model_builder = ModelBuilder[options.fetch(:type) { :poro }].new(options)
      end

      self
    end

    def attribute(name, options = {})
      options[:from] = :"#{prefix}_#{name}" if prefix
      attributes << [name, options]
    end

    def exclude(name)
      attributes.delete([name])
    end

    def group(options, &block)
      attribute_dsl(options, Array, &block)
    end

    def wrap(options, &block)
      attribute_dsl(options, Hash, &block)
    end

    def call
      header = Header.coerce(attributes)

      @model_class = model_builder.call(header) if model_builder

      Mapper.build(header, model_class)
    end

    private

    def attribute_dsl(options, type, &block)
      if block
        dsl = AttributeDSL.new
        dsl.instance_exec(&block)
        attributes << [options, header: dsl.header, type: type]
      else
        options.each do |name, header|
          attributes << [name, header: header.zip, type: type]
        end
      end
    end

  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rom-0.4.0 lib/rom/mapper_builder.rb
rom-0.3.1 lib/rom/mapper_builder.rb