class Dry::Errors
Attributes
messages[R]
Public Class Methods
new(messages = {})
click to toggle source
# File lib/dry/errors.rb, line 6 def initialize(messages = {}) @messages = messages end
Public Instance Methods
add(key, message)
click to toggle source
# File lib/dry/errors.rb, line 11 def add(key, message) keys = key.to_s.split('.').map!(&:to_sym) old = messages.dig(*keys[0...-1]) rescue {} old = {} unless old.is_a?(Hash) new = keys[0...-1].inject(messages) { |h, k| h[k] ||= {} rescue h = {}; h[k] = {} } new[keys.last] = [] unless new.is_a?(Array) new[keys.last] << message new.merge!(old) end
any?()
click to toggle source
# File lib/dry/errors.rb, line 30 def any? messages.any? end
clone()
click to toggle source
# File lib/dry/errors.rb, line 46 def clone self.class.new(messages.clone) end
first_message()
click to toggle source
# File lib/dry/errors.rb, line 41 def first_message fetch_messages(messages.values.first).first end
has_key?(key)
click to toggle source
# File lib/dry/errors.rb, line 35 def has_key?(key) keys = key.to_s.split('.').map!(&:to_sym) keys.size == 1 ? messages[keys.first].present? : (messages.dig(*keys[0...-1])[keys.last].present? rescue false) end
merge!(error, parent_key = nil)
click to toggle source
# File lib/dry/errors.rb, line 22 def merge!(error, parent_key = nil) hash_to_dots(error.messages, {}, parent_key).each do |key, messages| messages.each { |message| add(key, message) } end messages end
Private Instance Methods
fetch_messages(value)
click to toggle source
# File lib/dry/errors.rb, line 68 def fetch_messages(value) if value.is_a?(Hash) fetch_messages(value.values.first) else value end end
hash_to_dots(hash, results = {}, start_key = '')
click to toggle source
# File lib/dry/errors.rb, line 54 def hash_to_dots(hash, results = {}, start_key = '') hash.each do |key, value| key = key.to_s key_value = start_key.present? ? sprintf('%s.%s', start_key, key) : key if value.is_a?(Hash) results.merge!(hash_to_dots(value, results, key_value)) else results[key_value] = value end end results end