-
Notifications
You must be signed in to change notification settings - Fork 8
/
response.clj
101 lines (82 loc) · 1.75 KB
/
response.clj
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
91
92
93
94
95
96
97
98
99
100
101
(ns bitemyapp.revise.response
"Parsing a response from rethinkdb")
(defmulti response
"Inner response"
(fn [x]
(cond (vector? x) :vec
(map? x) (:type x))))
(defmethod response
:vec
[v]
(map response v))
;;; On null values, usually selecting an empty table?
(defmethod response
:default
[x]
nil)
(defmethod response
:r-array
[m]
(mapv response (:r-array m)))
(defmethod response
:r-str
[m]
(:r-str m))
(defn ends-in-0 [n]
(contains? #{0.0 0} (mod n 1)))
(defn maybe-int [n]
(or (and (ends-in-0 n) (int n)) n))
(defmethod response
:r-num
[m]
(maybe-int (:r-num m)))
(defmethod response
:r-bool
[m]
(:r-bool m))
(defmethod response
:r-object
[m]
(zipmap (map (comp keyword :key) (:r-object m))
(map (comp response :val) (:r-object m))))
(defmethod response
:r-null
[m]
nil)
(defmulti initial
"Outer response"
:type)
(defmethod initial :success-atom
[pb]
{:token (:token pb)
:response (response (:response pb))})
(defmethod initial :success-sequence
[pb]
{:token (:token pb)
:response (response (:response pb))})
(defmethod initial :success-partial
[pb]
{:token (:token pb)
:response (response (:response pb))})
(defmethod initial :client-error
[pb]
{:error :client-error
:token (:token pb)
:response (response (:response pb))
:backtrace (:backtrace pb)})
(defmethod initial :runtime-error
[pb]
{:error :runtime-error
:token (:token pb)
:response (response (:response pb))
:backtrace (:backtrace pb)})
(defmethod initial :compile-error
[pb]
{:error :compile-error
:token (:token pb)
:response (response (:response pb))
:backtrace (:backtrace pb)})
(defn inflate
"Deserialize the response protobuffer"
[pb]
(initial pb))