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



53
54
55
56
57
58
# File 'lib/dry/validation/result.rb', line 53

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

Returns:

  • (Concurrent::Map)


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

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

Returns:

  • (Hash)


48
49
50
# File 'lib/dry/validation/result.rb', line 48

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

Returns:

  • (Dry::Schema::Result)


41
42
43
# File 'lib/dry/validation/result.rb', line 41

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

Parameters:

  • schema_result (Dry::Schema::Result)

Yields:

  • (result)


23
24
25
26
27
# File 'lib/dry/validation/result.rb', line 23

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

Parameters:

  • key (Symbol)

Returns:

  • (Object)


140
141
142
# File 'lib/dry/validation/result.rb', line 140

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



128
129
130
131
# File 'lib/dry/validation/result.rb', line 128

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

Returns:

  • (Boolean)


114
115
116
117
118
119
120
121
122
123
# File 'lib/dry/validation/result.rb', line 114

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

    return false unless key_path.same_root?(err_path)

    key_path == err_path
  }
end

#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 values include an error for the provided key

Returns:

  • (Boolean)


105
106
107
# File 'lib/dry/validation/result.rb', line 105

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

#errors(new_options = EMPTY_HASH) ⇒ MessageSet

Get error set

Parameters:

  • new_options (Hash) (defaults to: EMPTY_HASH)

Options Hash (new_options):

  • :locale (Symbol)

    Set locale for messages

  • :hints (Boolean)

    Enable/disable hints

  • :full (Boolean)

    Get messages that include key names

Returns:



80
81
82
# File 'lib/dry/validation/result.rb', line 80

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

Returns:

  • (Bool)


98
99
100
# File 'lib/dry/validation/result.rb', line 98

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



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

def freeze
  values.freeze
  errors.freeze
  super
end

#inspectObject

Return a string representation



165
166
167
168
169
170
171
# File 'lib/dry/validation/result.rb', line 165

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

Parameters:

  • key (Symbol)

Returns:

  • (Bool)


151
152
153
# File 'lib/dry/validation/result.rb', line 151

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

#success?Bool

Check if result is successful

Returns:

  • (Bool)


89
90
91
# File 'lib/dry/validation/result.rb', line 89

def success?
  @errors.empty?
end

#to_hObject

Coerce to a hash



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

def to_h
  values.to_h
end

#to_monadDry::Monads::Result

Returns a result monad

Returns:

  • (Dry::Monads::Result)


29
30
31
# File 'lib/dry/validation/extensions/monads.rb', line 29

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

#valuesValues

Return values wrapper with the input processed by schema

Returns:



65
66
67
# File 'lib/dry/validation/result.rb', line 65

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