Class: Dry::Validation::Result

Inherits:
Object
  • Object
show all
Includes:
Monads::Result::Mixin, Hints::ResultExtensions
Defined in:
lib/dry/validation/result.rb,
lib/dry/validation/extensions/monads.rb

Overview

Monad extension for contract results

Examples:

Dry::Validation.load_extensions(:monads)

contract = Dry::Validation::Contract.build do
  schema do
    required(:name).filled(:string)
  end
end

contract.call(name: nil).to_monad

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Hints::ResultExtensions

#hints, #messages

Constructor Details

#initialize(schema_result, context, options) ⇒ Result

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Initialize a new result



50
51
52
53
54
55
# File 'lib/dry/validation/result.rb', line 50

def initialize(schema_result, context, options)
  @schema_result = schema_result
  @context = context
  @options = options
  @errors = initialize_errors
end

Instance Attribute Details

#contextConcurrent::Map (readonly)

Context that’s shared between rules



31
32
33
# File 'lib/dry/validation/result.rb', line 31

def context
  @context
end

#optionsHash (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Result options



45
46
47
# File 'lib/dry/validation/result.rb', line 45

def options
  @options
end

#schema_resultDry::Schema::Result (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Result from contract’s schema



38
39
40
# File 'lib/dry/validation/result.rb', line 38

def schema_result
  @schema_result
end

Class Method Details

.new(schema_result, context = ::Concurrent::Map.new, options = EMPTY_HASH) {|result| ... } ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Build a new result

Yields:

  • (result)


20
21
22
23
24
# File 'lib/dry/validation/result.rb', line 20

def self.new(schema_result, context = ::Concurrent::Map.new, options = EMPTY_HASH)
  result = super
  yield(result) if block_given?
  result.freeze
end

Instance Method Details

#[](key) ⇒ Object

Read a value under provided key



158
159
160
# File 'lib/dry/validation/result.rb', line 158

def [](key)
  values[key]
end

#add_error(error) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Add a new error for the provided key



146
147
148
149
# File 'lib/dry/validation/result.rb', line 146

def add_error(error)
  @errors.add(error)
  self
end

#base_error?(key) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Check if there’s any error for the provided key

This does not consider errors from the nested values



132
133
134
135
136
137
138
139
140
141
# File 'lib/dry/validation/result.rb', line 132

def base_error?(key)
  schema_result.errors.any? { |error|
    key_path = Schema::Path[key]
    err_path = Schema::Path[error.path]

    next unless key_path.same_root?(err_path)

    key_path == err_path
  }
end

#base_rule_error?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Check if the result contains any base rule errors



123
124
125
# File 'lib/dry/validation/result.rb', line 123

def base_rule_error?
  !errors.filter(:base?).empty?
end

#deconstructObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Pattern matching



210
211
212
# File 'lib/dry/validation/result.rb', line 210

def deconstruct
  [values, context.each.to_h]
end

#deconstruct_keys(keys) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Pattern matching



203
204
205
# File 'lib/dry/validation/result.rb', line 203

def deconstruct_keys(keys)
  values.deconstruct_keys(keys)
end

#error?(key) ⇒ Boolean

Check if values include an error for the provided key



102
103
104
# File 'lib/dry/validation/result.rb', line 102

def error?(key)
  errors.any? { |msg| Schema::Path[msg.path].include?(Schema::Path[key]) }
end

#errors(new_options = EMPTY_HASH) ⇒ MessageSet

Get error set

Options Hash (new_options):

  • :locale (Symbol)

    Set locale for messages

  • :hints (Boolean)

    Enable/disable hints

  • :full (Boolean)

    Get messages that include key names



77
78
79
# File 'lib/dry/validation/result.rb', line 77

def errors(new_options = EMPTY_HASH)
  new_options.empty? ? @errors : @errors.with(schema_errors(new_options), new_options)
end

#failure?Bool

Check if result is not successful



95
96
97
# File 'lib/dry/validation/result.rb', line 95

def failure?
  !success?
end

#freezeObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Freeze result and its error set



194
195
196
197
198
# File 'lib/dry/validation/result.rb', line 194

def freeze
  values.freeze
  errors.freeze
  super
end

#inspectObject

Return a string representation



183
184
185
186
187
188
189
# File 'lib/dry/validation/result.rb', line 183

def inspect
  if context.empty?
    "#<#{self.class}#{to_h} errors=#{errors.to_h}>"
  else
    "#<#{self.class}#{to_h} errors=#{errors.to_h} context=#{context.each.to_h}>"
  end
end

#key?(key) ⇒ Bool

Check if a key was set



169
170
171
# File 'lib/dry/validation/result.rb', line 169

def key?(key)
  values.key?(key)
end

#rule_error?(key) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Check if the rules includes an error for the provided key



116
117
118
# File 'lib/dry/validation/result.rb', line 116

def rule_error?(key)
  !schema_error?(key) && error?(key)
end

#schema_error?(key) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Check if the base schema (without rules) includes an error for the provided key



109
110
111
# File 'lib/dry/validation/result.rb', line 109

def schema_error?(key)
  schema_result.error?(key)
end

#success?Bool

Check if result is successful



86
87
88
# File 'lib/dry/validation/result.rb', line 86

def success?
  @errors.empty?
end

#to_hObject

Coerce to a hash



176
177
178
# File 'lib/dry/validation/result.rb', line 176

def to_h
  values.to_h
end

#to_monadDry::Monads::Result

Returns a result monad



34
35
36
# File 'lib/dry/validation/extensions/monads.rb', line 34

def to_monad
  success? ? Success(self) : Failure(self)
end

#valuesValues

Return values wrapper with the input processed by schema



62
63
64
# File 'lib/dry/validation/result.rb', line 62

def values
  @values ||= Values.new(schema_result.to_h)
end