class Reform::Contract::Result

Collects all native results of a form of all groups and provides a unified API: success?, errors, messages, hints. success? returns validity of the branch.

Public Class Methods

new(results, nested_results = []) click to toggle source
# File lib/reform/result.rb, line 7
def initialize(results, nested_results = []) # DISCUSS: do we like this?
  @results = results # native Result objects, e.g. `#<Dry::Validation::Result output={:title=>"Fallout", :composer=>nil} errors={}>`
  @failure = (results + nested_results).find(&:failure?) # TODO: test nested.
end

Public Instance Methods

add_error(key, error_text) click to toggle source
# File lib/reform/result.rb, line 22
def add_error(key, error_text)
  CustomError.new(key, error_text, @results)
end
errors(*args) click to toggle source
# File lib/reform/result.rb, line 16
def errors(*args);   filter_for(:errors, *args) end
failure?() click to toggle source
# File lib/reform/result.rb, line 12
def failure?; @failure  end
hints(*args) click to toggle source
# File lib/reform/result.rb, line 20
def hints(*args);    filter_for(:hints, *args) end
messages(*args) click to toggle source
# File lib/reform/result.rb, line 18
def messages(*args); filter_for(:messages, *args) end
success?() click to toggle source
# File lib/reform/result.rb, line 14
def success?; !failure? end
to_results() click to toggle source
# File lib/reform/result.rb, line 26
def to_results
  @results
end

Private Instance Methods

filter_for(method, *args) click to toggle source

this doesn’t do nested errors (e.g. )

# File lib/reform/result.rb, line 33
def filter_for(method, *args)
  @results.collect { |r| r.public_send(method, *args).to_h }
          .inject({}) { |hah, err| hah.merge(err) { |key, old_v, new_v| (new_v.is_a?(Array) ? (old_v |= new_v) : old_v.merge(new_v)) } }
          .find_all { |k, v| # filter :nested=>{:something=>["too nested!"]} #DISCUSS: do we want that here?
            if v.is_a?(Hash)
              nested_errors = v.select { |attr_key, val| attr_key.is_a?(Integer) && val.is_a?(Array) && val.any? }
              v = nested_errors.to_a if nested_errors.any?
            end
            v.is_a?(Array)
          }.to_h
end