Module: HatiJsonapiError::Helpers

Defined in:
lib/hati_jsonapi_error/helpers.rb

Overview

This module contains helper methods for rendering errors in a JSON API format.

Defined Under Namespace

Classes: ApiErr

Constant Summary collapse

HatiErrs =
HatiJsonapiError::Errors

Instance Method Summary collapse

Instance Method Details

#handle_error(error, with_original: false) ⇒ Object

with_original: oneOf: [false, true, :full_trace]



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/hati_jsonapi_error/helpers.rb', line 31

def handle_error(error, with_original: false)
  error_class = error if error.class <= HatiJsonapiError::BaseError
  error_class ||= HatiJsonapiError::Registry.lookup_error(error)

  unless error_class
    msg = 'Used handle_error but no mapping of default error set'
    raise HatiErrs::HelpersHandleError, msg
  end

  # Fix: if error_class is already an instance, use it directly, otherwise create new instance
  api_err = error_class.is_a?(Class) ? error_class.new : error_class
  if with_original
    api_err.meta = {
      original_error: error.class,
      trace: error.backtrace[0],
      message: error.message
    }
    api_err.meta.merge!(backtrace: error.backtrace.join("\n")) if with_original == :full_trace
  end

  render_error(api_err)
end

#render_error(error, status: nil, short: false) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/hati_jsonapi_error/helpers.rb', line 12

def render_error(error, status: nil, short: false)
  error_instance = error.is_a?(Class) ? error.new : error

  unless error_instance.class <= HatiJsonapiError::BaseError
    msg = "Supported only explicit type of HatiJsonapiError::BaseError, got: #{error_instance.class.name}"
    raise HatiErrs::HelpersRenderError, msg
  end

  resolver = HatiJsonapiError::Resolver.new(error_instance)

  unless defined?(render)
    msg = 'Render not defined'
    raise HatiErrs::HelpersRenderError, msg
  end

  render json: resolver.to_json(short: short), status: status || resolver.status
end