class Dry::Schema::Macros::Schema

Macro used to specify a nested schema

@api private

Public Instance Methods

call(*args, &block) click to toggle source

@api private

Calls superclass method
# File lib/dry/schema/macros/schema.rb, line 13
def call(*args, &block)
  super(*args, &nil) unless args.empty?

  if args.size.equal?(1) && (op = args.first).is_a?(Dry::Logic::Operations::Abstract)
    process_operation(op)
  end

  if block
    schema = define(*args, &block)
    import_steps(schema)
    trace << schema.to_rule
  end

  self
end

Private Instance Methods

define(*args, &block) click to toggle source

@api private

# File lib/dry/schema/macros/schema.rb, line 48
def define(*args, &block)
  definition = schema_dsl.new(path: schema_dsl.path, &block)
  schema = definition.call
  type_schema =
    if array_type?(parent_type)
      build_array_type(parent_type, definition.type_schema)
    elsif redefined_schema?(args)
      parent_type.schema(definition.types)
    else
      definition.type_schema
    end
  final_type = optional? ? type_schema.optional : type_schema

  type(final_type)

  if schema.filter_rules?
    schema_dsl[name].filter { hash?.then(schema(schema.filter_schema)) }
  end

  schema
end
hash_type() click to toggle source

@api private

# File lib/dry/schema/macros/schema.rb, line 43
def hash_type
  schema_dsl.resolve_type(:hash)
end
optional?() click to toggle source

@api private

# File lib/dry/schema/macros/schema.rb, line 76
def optional?
  parent_type.optional?
end
parent_type() click to toggle source

@api private

# File lib/dry/schema/macros/schema.rb, line 71
def parent_type
  schema_dsl.types[name]
end
process_operation(op) click to toggle source

@api private

# File lib/dry/schema/macros/schema.rb, line 32
def process_operation(op)
  schemas = op.rules.select { |rule| rule.is_a?(Processor) }

  hash_schema = hash_type.schema(
    schemas.map(&:schema_dsl).map(&:types).reduce(:merge)
  )

  type(hash_schema)
end
redefined_schema?(args) click to toggle source

@api private

# File lib/dry/schema/macros/schema.rb, line 86
def redefined_schema?(args)
  schema? && args.first.is_a?(Processor)
end
schema?() click to toggle source

@api private

# File lib/dry/schema/macros/schema.rb, line 81
def schema?
  parent_type.respond_to?(:schema)
end