module Dry::Types

def self.Rule(options)

Other tags:
    Api: - public

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

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

def self.[](name)

Other tags:
    Api: - public

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
      warn(<<~DEPRECATION)
        Using Dry::Types.[] with a class is deprecated, please use string identifiers: Dry::Types[Integer] -> Dry::Types['integer'].
        If you're using dry-struct this means changing `attribute :counter, Integer` to `attribute :counter, Dry::Types['integer']` or to `attribute :counter, 'integer'`.
      DEPRECATION
      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 container.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["integer"] '\
          'or generate a module with types using Dry.Types()'
  else
    super
  end
end

def self.container

Other tags:
    Api: - private

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

def self.identifier(klass)

Returns:
  • (String) -

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

def self.included(*)

Other tags:
    Api: - private
def self.included(*)
  raise 'Import Dry.Types, not Dry::Types'
end

def self.module(*namespaces, default: :nominal, **aliases)

Other tags:
    See: Dry.Types -
def self.module(*namespaces, default: :nominal, **aliases)
  Module.new(container, *namespaces, default: default, **aliases)
end

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

Other tags:
    Api: - private

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

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

Returns:
  • (Boolean) -
def self.registered?(class_or_identifier)
  container.key?(identifier(class_or_identifier))
end

def self.rule_compiler

Other tags:
    Api: - private

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

def self.type_keys

Other tags:
    Api: - private

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

def self.type_map

Other tags:
    Api: - private

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