-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
Copy pathexecution_error.rb
58 lines (53 loc) · 1.64 KB
/
execution_error.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
50
51
52
53
54
55
56
57
58
# frozen_string_literal: true
module GraphQL
# If a field's resolve function returns a {ExecutionError},
# the error will be inserted into the response's `"errors"` key
# and the field will resolve to `nil`.
class ExecutionError < GraphQL::Error
# @return [GraphQL::Language::Nodes::Field] the field where the error occurred
attr_accessor :ast_node
# @return [String] an array describing the JSON-path into the execution
# response which corresponds to this error.
attr_accessor :path
# @return [Hash] Optional data for error objects
# @deprecated Use `extensions` instead of `options`. The GraphQL spec
# recommends that any custom entries in an error be under the
# `extensions` key.
attr_accessor :options
# @return [Hash] Optional custom data for error objects which will be added
# under the `extensions` key.
attr_accessor :extensions
def initialize(message, ast_node: nil, options: nil, extensions: nil)
@ast_node = ast_node
@options = options
@extensions = extensions
super(message)
end
# @return [Hash] An entry for the response's "errors" key
def to_h
hash = {
"message" => message,
}
if ast_node
hash["locations"] = [
{
"line" => ast_node.line,
"column" => ast_node.col,
}
]
end
if path
hash["path"] = path
end
if options
hash.merge!(options)
end
if extensions
hash["extensions"] = extensions.each_with_object({}) { |(key, value), ext|
ext[key.to_s] = value
}
end
hash
end
end
end