Sha256: d0015c6a8ac55b2a2cc5d4e4df3781d7e12adbfe7945269fcbb05fecaa0b944d

Contents?: true

Size: 1.52 KB

Versions: 3

Compression:

Stored size: 1.52 KB

Contents

require 'bigdecimal'
require 'date'
require 'set'

require 'dry-container'
require 'inflecto'

require 'dry/data/version'
require 'dry/data/container'
require 'dry/data/type'
require 'dry/data/struct'
require 'dry/data/dsl'

module Dry
  module Data
    class SchemaError < TypeError
      def initialize(key, value)
        super("#{value.inspect} (#{value.class}) has invalid type for :#{key}")
      end
    end

    class SchemaKeyError < KeyError
      def initialize(key)
        super(":#{key} is missing in Hash input")
      end
    end

    StructError = Class.new(TypeError)

    TYPE_SPEC_REGEX = %r[(.+)<(.+)>].freeze

    def self.container
      @container ||= Container.new
    end

    def self.register(name, type = nil, &block)
      container.register(name, type || block.call)
    end

    def self.register_class(klass)
      container.register(
        Inflecto.underscore(klass).gsub('/', '.'),
        Type.new(klass.method(:new), klass)
      )
    end

    def self.[](name)
      type_map.fetch(name) do
        result = name.match(TYPE_SPEC_REGEX)

        type =
          if result
            type_id, member_id = result[1..2]
            container[type_id].member(self[member_id])
          else
            container[name]
          end

        type_map[name] = type
      end
    end

    def self.type(*args, &block)
      dsl = DSL.new(container)
      block ? yield(dsl) : registry[args.first]
    end

    def self.type_map
      @type_map ||= {}
    end
  end
end

require 'dry/data/types' # load built-in types

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dry-data-0.2.1 lib/dry/data.rb
dry-data-0.2.0 lib/dry/data.rb
dry-data-0.1.0 lib/dry/data.rb