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