class Dry::Validation::Evaluator
Evaluator
is the execution context for rules
Evaluators expose an API for setting failure messages and forward method calls to the contracts, so that you can use your contract methods within rule blocks
@api public
Attributes
@return [Hash]
Public Class Methods
Initialize a new evaluator
@api private
# File lib/dry/validation/evaluator.rb, line 67 def initialize(contract, **options, &block) super(contract, **options) @_options = options if block exec_opts = block_options.transform_values { _options[_1] } instance_exec(**exec_opts, &block) end macros.each do |args| macro = macro(*args.flatten(1)) instance_exec(**macro.extract_block_options(_options.merge(macro: macro)), ¯o.block) end end
Public Instance Methods
Get ‘Failures` object for base errors
@return [Failures]
@see Failures#failure
@api public
# File lib/dry/validation/evaluator.rb, line 103 def base @base ||= Failures.new end
Check if there are any base rule errors
@return [Boolean]
@api public
# File lib/dry/validation/evaluator.rb, line 205 def base_rule_error? !base.empty? || result.base_rule_error? end
Return aggregated failures
@return [Array<Hash>]
@api private
# File lib/dry/validation/evaluator.rb, line 112 def failures @failures ||= [] @failures += @base.opts if defined?(@base) @failures.concat(@key.values.flat_map(&:opts)) if defined?(@key) @failures end
Get ‘Failures` object for the default or provided path
@param [Symbol,String,Hash,Array<Symbol>] path
@return [Failures]
@see Failures#failure
@api public
# File lib/dry/validation/evaluator.rb, line 92 def key(path = self.path) (@key ||= EMPTY_HASH.dup)[path] ||= Failures.new(path) end
Return if the value under the default key is available
This is useful when dealing with rules for optional keys
@example use the default key name
rule(:age) do key.failure(:invalid) if key? && value < 18 end
@example specify the key name
rule(:start_date, :end_date) do if key?(:start_date) && !key?(:end_date) key(:end_date).failure("must provide an end_date with start_date") end end
@return [Boolean]
@api public
# File lib/dry/validation/evaluator.rb, line 170 def key?(name = key_name) values.key?(name) end
Return default (first) key name
@return [Symbol]
@api public
# File lib/dry/validation/evaluator.rb, line 129 def key_name @key_name ||= keys.first end
@api private
# File lib/dry/validation/evaluator.rb, line 210 def respond_to_missing?(meth, include_private = false) super || _contract.respond_to?(meth, true) end
Check if there are any errors on the current rule
@param path [Symbol, String, Array] A Path-compatible spec
@return [Boolean]
@api public
# File lib/dry/validation/evaluator.rb, line 192 def rule_error?(path = nil) if path.nil? !key(self.path).empty? else result.rule_error?(path) end end
Check if there are any errors on the schema under the provided path
@param path [Symbol, String, Array] A Path-compatible spec
@return [Boolean]
@api public
# File lib/dry/validation/evaluator.rb, line 181 def schema_error?(path) result.schema_error?(path) end
Return the value found under the first specified key
This is a convenient method that can be used in all the common cases where a rule depends on just one key and you want a quick access to the value
@example
rule(:age) do key.failure(:invalid) if value < 18 end
@return [Object]
@api public
# File lib/dry/validation/evaluator.rb, line 147 def value values[key_name] end
@api private
# File lib/dry/validation/evaluator.rb, line 120 def with(new_opts, &block) self.class.new(_contract, **_options, **new_opts, &block) end
Private Instance Methods
Forward to the underlying contract
@api private
# File lib/dry/validation/evaluator.rb, line 219 def method_missing(meth, *args, &block) # yes, we do want to delegate to private methods too if _contract.respond_to?(meth, true) _contract.__send__(meth, *args, &block) else super end end