Class: Dry::Schema::Result

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

Overview

Monad extension for Result

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Extensions::Hints::ResultMethods

#hints, #messages

Class Method Details

.new {|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.

Yields:

  • (result)


33
34
35
36
37
# File 'lib/dry/schema/result.rb', line 33

def self.new(*, **)
  result = super
  yield(result) if block_given?
  result.freeze
end

Instance Method Details

#[](name) ⇒ Object

Read value from the output hash

Parameters:

  • name (Symbol)

Returns:

  • (Object)


108
109
110
# File 'lib/dry/schema/result.rb', line 108

def [](name)
  output[name]
end

#add_error(node) ⇒ 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 AST node



196
197
198
# File 'lib/dry/schema/result.rb', line 196

def add_error(node)
  result_ast << node
end

#at(at_path, &block) ⇒ 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.

Return a new result scoped to a specific path

Parameters:

  • path (Symbol, Array, Path)

Returns:



46
47
48
# File 'lib/dry/schema/result.rb', line 46

def at(at_path, &block)
  new(@output, path: Path.new([*path, *Path[at_path]]), &block)
end

#concat(other) ⇒ 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.



96
97
98
99
# File 'lib/dry/schema/result.rb', line 96

def concat(other)
  result_ast.concat(other.map(&:to_ast))
  self
end

#deconstruct_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 support



189
190
191
# File 'lib/dry/schema/result.rb', line 189

def deconstruct_keys(_)
  output
end

#error?(spec) ⇒ Boolean

Check if there's an error for the provided spec

Parameters:

  • spec (Symbol, Hash<Symbol=>Symbol>)

Returns:

  • (Boolean)


130
131
132
# File 'lib/dry/schema/result.rb', line 130

def error?(spec)
  message_set.any? { |msg| Path[msg.path].include?(Path[spec]) }
end

#errors(options = EMPTY_HASH) ⇒ MessageSet

Get human-readable error representation

Returns:

See Also:



159
160
161
# File 'lib/dry/schema/result.rb', line 159

def errors(options = EMPTY_HASH)
  message_set(options)
end

#failure?Boolean

Check if the result is not successful

Returns:

  • (Boolean)


148
149
150
# File 'lib/dry/schema/result.rb', line 148

def failure?
  !success?
end

#inspectString

Return a string representation of the result

Returns:

  • (String)


182
183
184
# File 'lib/dry/schema/result.rb', line 182

def inspect
  "#<#{self.class}#{to_h.inspect} errors=#{errors.to_h.inspect} path=#{path.keys.inspect}>"
end

#key?(name) ⇒ Boolean

Check if a given key is present in the output

Parameters:

  • name (Symbol)

Returns:

  • (Boolean)


119
120
121
# File 'lib/dry/schema/result.rb', line 119

def key?(name)
  output.key?(name)
end

#message_set(options = EMPTY_HASH) ⇒ MessageSet

Return the message set

Parameters:

  • options (Hash) (defaults to: EMPTY_HASH)

Options Hash (options):

  • :locale (Symbol)

    Alternative locale (default is :en)

  • :hints (Boolean)

    Whether to include hint messages or not

  • :full (Boolean)

    Whether to generate messages that include key names

Returns:



173
174
175
# File 'lib/dry/schema/result.rb', line 173

def message_set(options = EMPTY_HASH)
  message_compiler.with(options).(result_ast)
end

#new(output, **opts, &block) ⇒ 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.



51
52
53
54
55
56
57
58
59
# File 'lib/dry/schema/result.rb', line 51

def new(output, **opts, &block)
  self.class.new(
    output,
    message_compiler: message_compiler,
    result_ast: result_ast,
    **opts,
    &block
  )
end

#outputHash Also known as: to_h

Dump result to a hash returning processed and validated data

Returns:

  • (Hash)


75
76
77
# File 'lib/dry/schema/result.rb', line 75

def output
  path.equal?(Path::EMPTY) ? @output : @output.dig(*path)
end

#pathObject

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.



68
69
70
# File 'lib/dry/schema/result.rb', line 68

def path
  @path || Path::EMPTY
end

#replace(value) ⇒ 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.



81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/dry/schema/result.rb', line 81

def replace(value)
  if value.is_a?(output.class)
    output.replace(value)
  elsif path.equal?(Path::EMPTY)
    @output = value
  else
    value_holder = path.keys.length > 1 ? @output.dig(*path.to_a[0..-2]) : @output

    value_holder[path.last] = value
  end

  self
end

#success?Boolean

Check if the result is successful

Returns:

  • (Boolean)


139
140
141
# File 'lib/dry/schema/result.rb', line 139

def success?
  result_ast.empty?
end

#to_monadDry::Monads::Success, Dry::Monads::Failure

Turn result into a monad

This makes result objects work with dry-monads (or anything with a compatible interface)

Returns:

  • (Dry::Monads::Success, Dry::Monads::Failure)


23
24
25
26
27
28
29
# File 'lib/dry/schema/extensions/monads.rb', line 23

def to_monad
  if success?
    Success(self)
  else
    Failure(self)
  end
end

#update(hash) ⇒ 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.



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

def update(hash)
  output.update(hash)
  self
end