-
Notifications
You must be signed in to change notification settings - Fork 26
/
response_error.ex
90 lines (78 loc) · 1.74 KB
/
response_error.ex
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
59
60
61
62
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
defmodule Snap.ResponseError do
@moduledoc """
Represents an Elasticsearch exception raised while executing a query.
"""
@keys [
:status,
:line,
:col,
:message,
:type,
:raw
]
@enforce_keys @keys
defexception @keys
@type t :: %__MODULE__{
status: integer() | nil,
line: integer() | nil,
col: integer() | nil,
message: String.t() | nil,
type: String.t() | nil,
raw: map() | nil
}
def exception_from_json(json) do
attrs = build(json)
struct(__MODULE__, attrs)
end
def message(exception) do
type = if exception.type, do: "(#{exception.type})"
msg = if exception.message, do: exception.message
[type, msg]
|> Enum.reject(&is_nil/1)
|> Enum.join(" ")
end
defp build(%{"error" => error} = response) when is_map(error) do
[
status: response["status"],
line: get_in(response, ["error", "line"]),
col: get_in(response, ["error", "col"]),
message: get_in(response, ["error", "reason"]),
type: type(response),
raw: response
]
end
defp build(%{"result" => type}) do
[
status: nil,
line: nil,
col: nil,
message: nil,
type: type
]
end
defp build(%{"found" => false}) do
[
status: nil,
line: nil,
col: nil,
message: nil,
type: "document_not_found"
]
end
defp build(error) when is_map(error) do
[
status: nil,
line: nil,
col: nil,
message: error["message"],
type: nil,
raw: error
]
end
defp type(%{"error" => %{"root_cause" => causes}}) do
get_in(causes, [Access.at(0), "type"])
end
defp type(%{"error" => %{"type" => type}}) do
type
end
end