...
1 package ldvalue
2
3 import (
4 "encoding/json"
5 "errors"
6 "strconv"
7
8 "github.com/launchdarkly/go-jsonstream/v3/jreader"
9 "github.com/launchdarkly/go-jsonstream/v3/jwriter"
10 )
11
12
13
14
15
16
17
18 func Parse(jsonData []byte) Value {
19 var v Value
20 if err := v.UnmarshalJSON(jsonData); err != nil {
21 return Null()
22 }
23 return v
24 }
25
26
27
28
29
30
31 func (v Value) JSONString() string {
32
33
34 switch v.valueType {
35 case NullType:
36 return nullAsJSON
37 case BoolType:
38 if v.boolValue {
39 return trueString
40 }
41 return falseString
42 case NumberType:
43 if v.IsInt() {
44 return strconv.Itoa(int(v.numberValue))
45 }
46 return strconv.FormatFloat(v.numberValue, 'f', -1, 64)
47 }
48
49 bytes, _ := json.Marshal(v)
50
51
52
53 return string(bytes)
54 }
55
56
57
58
59
60
61 func (v Value) MarshalJSON() ([]byte, error) {
62 switch v.valueType {
63 case NullType:
64 return nullAsJSONBytes, nil
65 case BoolType:
66 if v.boolValue {
67 return trueBytes, nil
68 }
69 return falseBytes, nil
70 case NumberType:
71 if v.IsInt() {
72 return []byte(strconv.Itoa(int(v.numberValue))), nil
73 }
74 return []byte(strconv.FormatFloat(v.numberValue, 'f', -1, 64)), nil
75 case StringType:
76 return json.Marshal(v.stringValue)
77 case ArrayType:
78 return v.arrayValue.MarshalJSON()
79 case ObjectType:
80 return v.objectValue.MarshalJSON()
81 case RawType:
82 return v.rawValue, nil
83 }
84 return nil, errors.New("unknown data type")
85 }
86
87
88 func (v *Value) UnmarshalJSON(data []byte) error {
89 return jreader.UnmarshalJSONWithReader(data, v)
90 }
91
92
93
94
95
96 func (v *Value) ReadFromJSONReader(r *jreader.Reader) {
97 a := r.Any()
98 if r.Error() != nil {
99 return
100 }
101 switch a.Kind {
102 case jreader.BoolValue:
103 *v = Bool(a.Bool)
104 case jreader.NumberValue:
105 *v = Float64(a.Number)
106 case jreader.StringValue:
107 *v = String(a.String)
108 case jreader.ArrayValue:
109 var va ValueArray
110 if va.readFromJSONArray(r, &a.Array); r.Error() == nil {
111 *v = Value{valueType: ArrayType, arrayValue: va}
112 }
113 case jreader.ObjectValue:
114 var vm ValueMap
115 if vm.readFromJSONObject(r, &a.Object); r.Error() == nil {
116 *v = Value{valueType: ObjectType, objectValue: vm}
117 }
118 default:
119 *v = Null()
120 }
121 }
122
123
124
125
126
127 func (v Value) WriteToJSONWriter(w *jwriter.Writer) {
128 switch v.valueType {
129 case NullType:
130 w.Null()
131 case BoolType:
132 w.Bool(v.boolValue)
133 case NumberType:
134 w.Float64(v.numberValue)
135 case StringType:
136 w.String(v.stringValue)
137 case ArrayType:
138 v.arrayValue.WriteToJSONWriter(w)
139 case ObjectType:
140 v.objectValue.WriteToJSONWriter(w)
141 case RawType:
142 w.Raw(v.rawValue)
143 }
144 }
145
146
147 func (a ValueArray) JSONString() string {
148 bytes, _ := a.MarshalJSON()
149
150
151
152 return string(bytes)
153 }
154
155
156
157
158 func (a ValueArray) MarshalJSON() ([]byte, error) {
159 if a.data == nil {
160 return nullAsJSONBytes, nil
161 }
162 return json.Marshal(a.data)
163 }
164
165
166 func (a *ValueArray) UnmarshalJSON(data []byte) error {
167 return jreader.UnmarshalJSONWithReader(data, a)
168 }
169
170
171
172
173
174 func (a *ValueArray) ReadFromJSONReader(r *jreader.Reader) {
175 arr := r.ArrayOrNull()
176 a.readFromJSONArray(r, &arr)
177 }
178
179
180
181
182
183
184
185 func (a ValueArray) WriteToJSONWriter(w *jwriter.Writer) {
186 if a.data == nil {
187 w.Null()
188 return
189 }
190 arr := w.Array()
191 for _, v := range a.data {
192 v.WriteToJSONWriter(w)
193 }
194 arr.End()
195 }
196
197 func (a *ValueArray) readFromJSONArray(r *jreader.Reader, arr *jreader.ArrayState) {
198 if r.Error() != nil {
199 return
200 }
201 if !arr.IsDefined() {
202 *a = ValueArray{}
203 return
204 }
205 var ab ValueArrayBuilder
206 for arr.Next() {
207 var vv Value
208 vv.ReadFromJSONReader(r)
209 ab.Add(vv)
210 }
211 if r.Error() == nil {
212 *a = ab.Build()
213 }
214 }
215
216
217
218
219
220
221 func (m ValueMap) String() string {
222 return m.JSONString()
223 }
224
225
226 func (m ValueMap) JSONString() string {
227 bytes, _ := m.MarshalJSON()
228
229
230
231 return string(bytes)
232 }
233
234
235
236
237 func (m ValueMap) MarshalJSON() ([]byte, error) {
238 return jwriter.MarshalJSONWithWriter(m)
239 }
240
241
242 func (m *ValueMap) UnmarshalJSON(data []byte) error {
243 return jreader.UnmarshalJSONWithReader(data, m)
244 }
245
246
247
248
249
250 func (m *ValueMap) ReadFromJSONReader(r *jreader.Reader) {
251 obj := r.ObjectOrNull()
252 m.readFromJSONObject(r, &obj)
253 }
254
255
256
257
258
259
260
261 func (m ValueMap) WriteToJSONWriter(w *jwriter.Writer) {
262 if m.data == nil {
263 w.Null()
264 return
265 }
266 obj := w.Object()
267 for k, vv := range m.data {
268 vv.WriteToJSONWriter(obj.Name(k))
269 }
270 obj.End()
271 }
272
273 func (m *ValueMap) readFromJSONObject(r *jreader.Reader, obj *jreader.ObjectState) {
274 if r.Error() != nil {
275 return
276 }
277 if !obj.IsDefined() {
278 *m = ValueMap{}
279 return
280 }
281 var mb ValueMapBuilder
282 for obj.Next() {
283 name := obj.Name()
284 var vv Value
285 vv.ReadFromJSONReader(r)
286 mb.Set(string(name), vv)
287 }
288 if r.Error() == nil {
289 *m = mb.Build()
290 }
291 }
292
View as plain text