Exception: Fauna::FaunaError

Inherits:
RuntimeError
  • Object
show all
Defined in:
lib/fauna/errors.rb

Overview

Error returned by the FaunaDB server. For documentation of error types, see the docs.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(request_result) ⇒ FaunaError

Creates a new error from a given RequestResult or Exception.



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/fauna/errors.rb', line 63

def initialize(request_result)
  message = nil

  if request_result.is_a? RequestResult
    @request_result = request_result

    begin
      if request_result.response_content.nil?
        fail UnexpectedError.new('Invalid JSON.', request_result)
      end

      errors_raw = UnexpectedError.get_or_raise request_result, request_result.response_content, :errors
      @errors = catch :invalid_response do
        throw :invalid_response unless errors_raw.is_a? Array
        errors_raw.map { |error| ErrorData.from_hash(error) }
      end

      if @errors.nil?
        fail UnexpectedError.new('Error data has an unexpected format.', request_result)
      elsif @errors.empty?
        fail UnexpectedError.new('Error data returned was blank.', request_result)
      end

      message = @errors.map do |error|
        msg = 'Error'
        msg += " at #{error.position}" unless error.position.nil?
        msg += ": #{error.code} - #{error.description}"

        unless error.failures.nil?
          msg += ' (' + error.failures.map do |failure|
            "Failure at #{failure.field}: #{failure.code} - #{failure.description}"
          end.join(' ') + ')'
        end

        msg
      end.join(' ')
    rescue UnexpectedError => e
      unless self.is_a?(UnavailableError) && [502, 503, 504].include?(request_result.status_code)
        raise e
      end

      message = request_result.response_raw
    end
  elsif request_result.is_a? Exception
    message = request_result.class.name
    unless request_result.message.nil?
      message += ": #{request_result.message}"
    end
  end

  super(message)
end

Instance Attribute Details

#errorsObject (readonly)

List of ErrorData objects returned by the server.



26
27
28
# File 'lib/fauna/errors.rb', line 26

def errors
  @errors
end

#request_resultObject (readonly)

RequestResult for the request that caused this error.



29
30
31
# File 'lib/fauna/errors.rb', line 29

def request_result
  @request_result
end

Class Method Details

.raise_for_status_code(request_result) ⇒ Object

Raises the associated error from a RequestResult based on the status code.

Returns nil for 2xx status codes



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/fauna/errors.rb', line 35

def self.raise_for_status_code(request_result)
  case request_result.status_code
  when 200..299

  when 400
    fail BadRequest.new(request_result)
  when 401
    fail Unauthorized.new(request_result)
  when 403
    fail PermissionDenied.new(request_result)
  when 404
    fail NotFound.new(request_result)
  when 405
    fail MethodNotAllowed.new(request_result)
  when 500
    fail InternalError.new(request_result)
  when 502
    fail UnavailableError.new(request_result)
  when 503
    fail UnavailableError.new(request_result)
  when 504
    fail UnavailableError.new(request_result)
  else
    fail UnexpectedError.new('Unexpected status code.', request_result)
  end
end