module ServiceOperation::ErrorHandling
ActiveModel compatable ErrorHandling
depends on {Base#context} and {Errors}
Constants
- FAIL_IF_UNLESS_REGEXP
Method Missing
Public Instance Methods
errors()
click to toggle source
# File lib/service_operation/error_handling.rb, line 7 def errors @errors ||= Errors.new end
fail!(error = {}, more = {})
click to toggle source
@param [Failure, Hash, nil] error(s) merge into {#errors}
# File lib/service_operation/error_handling.rb, line 12 def fail!(error = {}, more = {}) return unless error error = errors_from_error_code(error) errors.coerced_merge error more[:errors] ||= errors.merge(more[:errors] || {}) context.fail! more end
fail_if_errors!()
click to toggle source
fail if there {#errors} Hash has any contents
# File lib/service_operation/error_handling.rb, line 24 def fail_if_errors! invalid? && fail! end
invalid?()
click to toggle source
# File lib/service_operation/error_handling.rb, line 28 def invalid? errors.any? end
valid?()
click to toggle source
# File lib/service_operation/error_handling.rb, line 32 def valid? !invalid? end
Private Instance Methods
errors_from_error_code(error_code)
click to toggle source
convert :error into 'Error' based on lookup in hash {ERRORS}
# File lib/service_operation/error_handling.rb, line 39 def errors_from_error_code(error_code) return error_code unless error_code.is_a?(Symbol) return { error_code => send(error_code) } if attribute_exists?(error_code) # ? context.error_code = error_code errors = defined?(self.class::ERRORS) ? self.class::ERRORS : {} Array(errors[error_code] || error_code.to_s) end
extract_bool_errors(object_method, object, errors)
click to toggle source
# File lib/service_operation/error_handling.rb, line 66 def extract_bool_errors(object_method, object, errors) # fail_if(object) if object_method == '?' [object, errors] # fail_if(object.method?) elsif object.respond_to?(object_method) [object.send(object_method), errors || object] # unknown else raise(NoMethodError, "#{object.class} does not respond to #{object_method}") end end
fail_conditional_object(conditional, object_method, object, errors = nil)
click to toggle source
# File lib/service_operation/error_handling.rb, line 55 def fail_conditional_object(conditional, object_method, object, errors = nil) bool, errors = extract_bool_errors(object_method, object, errors) case conditional when 'if' fail!(errors) if bool when 'unless' fail!(errors) unless bool end end
method_missing(method_name, *args, &block)
click to toggle source
Calls superclass method
# File lib/service_operation/error_handling.rb, line 79 def method_missing(method_name, *args, &block) # {if/unless}, method_name conditional, object_method = (method_name.to_s.match(FAIL_IF_UNLESS_REGEXP) || [])[1..2] if conditional fail_conditional_object(conditional, object_method + '?', *args) else super end end
respond_to_missing?(method_name, include_private = false)
click to toggle source
Calls superclass method
# File lib/service_operation/error_handling.rb, line 90 def respond_to_missing?(method_name, include_private = false) method_name =~ FAIL_IF_UNLESS_REGEXP || super end