class Dry::Schema::Trace

Captures predicates defined within the DSL

@api private

Constants

INVALID_PREDICATES

Attributes

captures[R]

@api private

compiler[R]

@api private

Public Class Methods

new(compiler = Compiler.new) click to toggle source

@api private

# File lib/dry/schema/trace.rb, line 26
def initialize(compiler = Compiler.new)
  @compiler = compiler
  @captures = []
end

Public Instance Methods

<<(op)
Alias for: append
append(op) click to toggle source

@api private

# File lib/dry/schema/trace.rb, line 58
def append(op)
  captures << op
  self
end
Also aliased as: <<
class() click to toggle source

@api private

# File lib/dry/schema/trace.rb, line 81
def class
  ::Dry::Schema::Trace
end
evaluate(*args, **opts) click to toggle source

@api private

# File lib/dry/schema/trace.rb, line 32
def evaluate(*args, **opts)
  predicates = opts.empty? ? args : args.push(opts)

  evaluate_predicates(predicates).each do |rule|
    append(rule)
  end

  self
end
evaluate_predicates(predicates) click to toggle source

@api private

# File lib/dry/schema/trace.rb, line 43
def evaluate_predicates(predicates)
  predicates.flat_map do |predicate|
    if predicate.respond_to?(:call)
      predicate
    elsif predicate.is_a?(::Array)
      predicate.map { |pred| evaluate_predicates(pred).reduce(:&) }.reduce(:|)
    elsif predicate.is_a?(::Hash)
      predicate.map { |pred, *args| __send__(pred, *args) }
    else
      __send__(predicate)
    end
  end
end
to_ast() click to toggle source

@api private

# File lib/dry/schema/trace.rb, line 76
def to_ast
  reduced_rule.to_ast
end
to_rule(name = nil) click to toggle source

@api private

# File lib/dry/schema/trace.rb, line 65
def to_rule(name = nil)
  return if captures.empty?

  if name
    compiler.visit([:key, [name, to_ast]])
  else
    reduced_rule
  end
end

Private Instance Methods

method_missing(meth, *args, &block) click to toggle source

@api private

Calls superclass method
# File lib/dry/schema/trace.rb, line 93
def method_missing(meth, *args, &block)
  if meth.to_s.end_with?(QUESTION_MARK)
    if ::Dry::Schema::Trace::INVALID_PREDICATES.include?(meth)
      ::Kernel.raise InvalidSchemaError, "#{meth} predicate cannot be used in this context"
    end

    unless compiler.supports?(meth)
      ::Kernel.raise ::ArgumentError, "#{meth} predicate is not defined"
    end

    predicate = Predicate.new(compiler, meth, args, block)
    predicate.ensure_valid
    predicate
  else
    super
  end
end
reduced_rule() click to toggle source

@api private

# File lib/dry/schema/trace.rb, line 88
def reduced_rule
  captures.map(&:to_ast).map(&compiler.method(:visit)).reduce(:and)
end