Sha256: 724211e86023fb2f3c4f6d1b7781e128f77818fc79a6cc95361922918a14322a

Contents?: true

Size: 1.12 KB

Versions: 2

Compression:

Stored size: 1.12 KB

Contents

require 'rom/struct'

require 'rom/support/cache'
require 'rom/support/constants'
require 'rom/support/class_builder'

require 'rom/repository/struct_attributes'

module ROM
  class Repository
    # @api private
    class StructBuilder
      extend Cache

      def call(*args)
        fetch_or_store(*args) do
          name, header = args

          build_class(name) { |klass|
            klass.send(:include, StructAttributes.new(visit(header)))
          }
        end
      end
      alias_method :[], :call

      private

      def visit(ast)
        name, node = ast
        __send__("visit_#{name}", node)
      end

      def visit_header(node)
        node.map(&method(:visit))
      end

      def visit_relation(node)
        relation_name, meta, * = node
        meta[:combine_name] || relation_name.relation
      end

      def visit_attribute(node)
        node
      end

      def build_class(name, &block)
        ROM::ClassBuilder.new(name: class_name(name), parent: Struct).call(&block)
      end

      def class_name(name)
        "ROM::Struct[#{Inflector.classify(Inflector.singularize(name))}]"
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rom-repository-0.3.1 lib/rom/repository/struct_builder.rb
rom-repository-0.3.0 lib/rom/repository/struct_builder.rb