module Dry::Types

def self.Rule(options)

Returns:
  • (Dry::Logic::Rule) -

Parameters:
  • options (Hash) --
def self.Rule(options)
  rule_compiler.(
    options.map { |key, val| Logic::Rule::Predicate.new(Logic::Predicates[:"#{key}?"]).curry(val).to_ast }
  ).reduce(:and)
end

def self.[](name)

Returns:
  • (Type, Class) -

Parameters:
  • name (String, Class) --
def self.[](name)
  type_map.fetch_or_store(name) do
    case name
    when String
      result = name.match(TYPE_SPEC_REGEX)
      if result
        type_id, member_id = result[1..2]
        container[type_id].of(self[member_id])
      else
        container[name]
      end
    when Class
      type_name = identifier(name)
      if container.key?(type_name)
        self[type_name]
      else
        name
      end
    end
  end
end

def self.const_missing(const)

Other tags:
    Api: - private
def self.const_missing(const)
  underscored = Inflector.underscore(const)
  if type_keys.any? { |key| key.split('.')[0] == underscored }
    raise NameError,
          'dry-types does not define constants for default types. '\
          'You can access the predefined types with [], e.g. Dry::Types["strict.integer"] '\
          'or generate a module with types using Dry::Types.module'
  else
    super
  end
end

def self.container

Returns:
  • (Container{String => Definition}) -
def self.container
  @container ||= Container.new
end

def self.define_constants(namespace, identifiers)

Returns:
  • () -

Parameters:
  • identifiers () --
  • namespace (Module) --
def self.define_constants(namespace, identifiers)
  names = identifiers.map do |id|
    parts = id.split('.')
    [Inflector.camelize(parts.pop), parts.map(&Inflector.method(:camelize))]
  end
  names.map do |(klass, parts)|
    mod = parts.reduce(namespace) do |a, e|
      a.constants.include?(e.to_sym) ? a.const_get(e) : a.const_set(e, Module.new)
    end
    mod.const_set(klass, self[identifier((parts + [klass]).join('::'))])
  end
end

def self.finalize

Deprecated:
  • Include {Dry::Types.module} instead
def self.finalize
  warn 'Dry::Types.finalize and configuring namespace is deprecated. Just'\
   ' do `include Dry::Types.module` in places where you want to have access'\
   ' to built-in types'
  define_constants(self.namespace, type_keys)
end

def self.identifier(klass)

Returns:
  • (String) -

Parameters:
  • klass (#to_s) --
def self.identifier(klass)
  Inflector.underscore(klass).tr('/', '.')
end

def self.module

Returns:
  • (Module) -
def self.module
  namespace = Module.new
  define_constants(namespace, type_keys)
  namespace.extend(BuilderMethods)
  namespace
end

def self.register(name, type = nil, &block)

Other tags:
    Api: - private

Returns:
  • (Container{String => Definition}) -

Parameters:
  • block (#call, nil) --
  • type (Type) --
  • name (String) --
def self.register(name, type = nil, &block)
  container.register(name, type || block.call)
end

def self.registered?(class_or_identifier)

Other tags:
    Api: - private
def self.registered?(class_or_identifier)
  container.key?(identifier(class_or_identifier))
end

def self.rule_compiler

Returns:
  • (Dry::Logic::RuleCompiler) -
def self.rule_compiler
  @rule_compiler ||= Logic::RuleCompiler.new(Logic::Predicates)
end

def self.type_keys

Returns:
  • () -
def self.type_keys
  container.keys
end

def self.type_map

Returns:
  • (Concurrent::Map) -
def self.type_map
  @type_map ||= Concurrent::Map.new
end