Class: Grape::ErrorFormatter::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/grape/error_formatter/base.rb

Direct Known Subclasses

Json, Txt, Xml

Class Method Summary collapse

Class Method Details

.call(message, backtrace, options = {}, env = nil, original_exception = nil) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/grape/error_formatter/base.rb', line 7

def call(message, backtrace, options = {}, env = nil, original_exception = nil)
  merge_backtrace = backtrace.present? && options.dig(:rescue_options, :backtrace)
  merge_original_exception = original_exception && options.dig(:rescue_options, :original_exception)

  wrapped_message = wrap_message(present(message, env))
  if wrapped_message.is_a?(Hash)
    wrapped_message[:backtrace] = backtrace if merge_backtrace
    wrapped_message[:original_exception] = original_exception.inspect if merge_original_exception
  end

  format_structured_message(wrapped_message)
end

.format_structured_message(_structured_message) ⇒ Object

Raises:

  • (NotImplementedError)


57
58
59
# File 'lib/grape/error_formatter/base.rb', line 57

def format_structured_message(_structured_message)
  raise NotImplementedError
end

.inherited(klass) ⇒ Object



61
62
63
64
# File 'lib/grape/error_formatter/base.rb', line 61

def inherited(klass)
  super
  ErrorFormatter.register(klass)
end

.present(message, env) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/grape/error_formatter/base.rb', line 20

def present(message, env)
  present_options = {}
  presented_message = message
  if presented_message.is_a?(Hash)
    presented_message = presented_message.dup
    present_options[:with] = presented_message.delete(:with)
  end

  presenter = env[Grape::Env::API_ENDPOINT].entity_class_for_obj(presented_message, present_options)

  unless presenter || env[Grape::Env::GRAPE_ROUTING_ARGS].nil?
    # env['api.endpoint'].route does not work when the error occurs within a middleware
    # the Endpoint does not have a valid env at this moment
    http_codes = env[Grape::Env::GRAPE_ROUTING_ARGS][:route_info].http_codes || []

    found_code = http_codes.find do |http_code|
      (http_code[0].to_i == env[Grape::Env::API_ENDPOINT].status) && http_code[2].respond_to?(:represent)
    end if env[Grape::Env::API_ENDPOINT].request

    presenter = found_code[2] if found_code
  end

  if presenter
    embeds = { env: env }
    embeds[:version] = env[Grape::Env::API_VERSION] if env.key?(Grape::Env::API_VERSION)
    presented_message = presenter.represent(presented_message, embeds).serializable_hash
  end

  presented_message
end

.wrap_message(message) ⇒ Object



51
52
53
54
55
# File 'lib/grape/error_formatter/base.rb', line 51

def wrap_message(message)
  return message if message.is_a?(Hash)

  { message: message }
end