Skip to content

Commit 1fe14c0

Browse files
committed
Added handling for nil pointers to scalar coercion
1 parent 2b97f4c commit 1fe14c0

File tree

3 files changed

+300
-0
lines changed

3 files changed

+300
-0
lines changed

scalars.go

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,75 +22,114 @@ func coerceInt(value interface{}) interface{} {
2222
}
2323
return 0
2424
case *bool:
25+
if value == nil {
26+
return nil
27+
}
2528
return coerceInt(*value)
2629
case int:
2730
if value < int(math.MinInt32) || value > int(math.MaxInt32) {
2831
return nil
2932
}
3033
return value
3134
case *int:
35+
if value == nil {
36+
return nil
37+
}
3238
return coerceInt(*value)
3339
case int8:
3440
return int(value)
3541
case *int8:
42+
if value == nil {
43+
return nil
44+
}
3645
return int(*value)
3746
case int16:
3847
return int(value)
3948
case *int16:
49+
if value == nil {
50+
return nil
51+
}
4052
return int(*value)
4153
case int32:
4254
return int(value)
4355
case *int32:
56+
if value == nil {
57+
return nil
58+
}
4459
return int(*value)
4560
case int64:
4661
if value < int64(math.MinInt32) || value > int64(math.MaxInt32) {
4762
return nil
4863
}
4964
return int(value)
5065
case *int64:
66+
if value == nil {
67+
return nil
68+
}
5169
return coerceInt(*value)
5270
case uint:
5371
if value > math.MaxInt32 {
5472
return nil
5573
}
5674
return int(value)
5775
case *uint:
76+
if value == nil {
77+
return nil
78+
}
5879
return coerceInt(*value)
5980
case uint8:
6081
return int(value)
6182
case *uint8:
83+
if value == nil {
84+
return nil
85+
}
6286
return int(*value)
6387
case uint16:
6488
return int(value)
6589
case *uint16:
90+
if value == nil {
91+
return nil
92+
}
6693
return int(*value)
6794
case uint32:
6895
if value > uint32(math.MaxInt32) {
6996
return nil
7097
}
7198
return int(value)
7299
case *uint32:
100+
if value == nil {
101+
return nil
102+
}
73103
return coerceInt(*value)
74104
case uint64:
75105
if value > uint64(math.MaxInt32) {
76106
return nil
77107
}
78108
return int(value)
79109
case *uint64:
110+
if value == nil {
111+
return nil
112+
}
80113
return coerceInt(*value)
81114
case float32:
82115
if value < float32(math.MinInt32) || value > float32(math.MaxInt32) {
83116
return nil
84117
}
85118
return int(value)
86119
case *float32:
120+
if value == nil {
121+
return nil
122+
}
87123
return coerceInt(*value)
88124
case float64:
89125
if value < float64(math.MinInt32) || value > float64(math.MaxInt32) {
90126
return nil
91127
}
92128
return int(value)
93129
case *float64:
130+
if value == nil {
131+
return nil
132+
}
94133
return coerceInt(*value)
95134
case string:
96135
val, err := strconv.ParseFloat(value, 0)
@@ -99,6 +138,9 @@ func coerceInt(value interface{}) interface{} {
99138
}
100139
return coerceInt(val)
101140
case *string:
141+
if value == nil {
142+
return nil
143+
}
102144
return coerceInt(*value)
103145
}
104146

@@ -133,54 +175,93 @@ func coerceFloat(value interface{}) interface{} {
133175
}
134176
return 0.0
135177
case *bool:
178+
if value == nil {
179+
return nil
180+
}
136181
return coerceFloat(*value)
137182
case int:
138183
return float64(value)
139184
case *int:
185+
if value == nil {
186+
return nil
187+
}
140188
return coerceFloat(*value)
141189
case int8:
142190
return float64(value)
143191
case *int8:
192+
if value == nil {
193+
return nil
194+
}
144195
return coerceFloat(*value)
145196
case int16:
146197
return float64(value)
147198
case *int16:
199+
if value == nil {
200+
return nil
201+
}
148202
return coerceFloat(*value)
149203
case int32:
150204
return float64(value)
151205
case *int32:
206+
if value == nil {
207+
return nil
208+
}
152209
return coerceFloat(*value)
153210
case int64:
154211
return float64(value)
155212
case *int64:
213+
if value == nil {
214+
return nil
215+
}
156216
return coerceFloat(*value)
157217
case uint:
158218
return float64(value)
159219
case *uint:
220+
if value == nil {
221+
return nil
222+
}
160223
return coerceFloat(*value)
161224
case uint8:
162225
return float64(value)
163226
case *uint8:
227+
if value == nil {
228+
return nil
229+
}
164230
return coerceFloat(*value)
165231
case uint16:
166232
return float64(value)
167233
case *uint16:
234+
if value == nil {
235+
return nil
236+
}
168237
return coerceFloat(*value)
169238
case uint32:
170239
return float64(value)
171240
case *uint32:
241+
if value == nil {
242+
return nil
243+
}
172244
return coerceFloat(*value)
173245
case uint64:
174246
return float64(value)
175247
case *uint64:
248+
if value == nil {
249+
return nil
250+
}
176251
return coerceFloat(*value)
177252
case float32:
178253
return value
179254
case *float32:
255+
if value == nil {
256+
return nil
257+
}
180258
return coerceFloat(*value)
181259
case float64:
182260
return value
183261
case *float64:
262+
if value == nil {
263+
return nil
264+
}
184265
return coerceFloat(*value)
185266
case string:
186267
val, err := strconv.ParseFloat(value, 0)
@@ -189,6 +270,9 @@ func coerceFloat(value interface{}) interface{} {
189270
}
190271
return val
191272
case *string:
273+
if value == nil {
274+
return nil
275+
}
192276
return coerceFloat(*value)
193277
}
194278

@@ -222,6 +306,9 @@ var Float = NewScalar(ScalarConfig{
222306

223307
func coerceString(value interface{}) interface{} {
224308
if v, ok := value.(*string); ok {
309+
if value == nil {
310+
return nil
311+
}
225312
return *v
226313
}
227314
return fmt.Sprintf("%v", value)
@@ -249,6 +336,9 @@ func coerceBool(value interface{}) interface{} {
249336
case bool:
250337
return value
251338
case *bool:
339+
if value == nil {
340+
return nil
341+
}
252342
return *value
253343
case string:
254344
switch value {
@@ -257,90 +347,129 @@ func coerceBool(value interface{}) interface{} {
257347
}
258348
return true
259349
case *string:
350+
if value == nil {
351+
return nil
352+
}
260353
return coerceBool(*value)
261354
case float64:
262355
if value != 0 {
263356
return true
264357
}
265358
return false
266359
case *float64:
360+
if value == nil {
361+
return nil
362+
}
267363
return coerceBool(*value)
268364
case float32:
269365
if value != 0 {
270366
return true
271367
}
272368
return false
273369
case *float32:
370+
if value == nil {
371+
return nil
372+
}
274373
return coerceBool(*value)
275374
case int:
276375
if value != 0 {
277376
return true
278377
}
279378
return false
280379
case *int:
380+
if value == nil {
381+
return nil
382+
}
281383
return coerceBool(*value)
282384
case int8:
283385
if value != 0 {
284386
return true
285387
}
286388
return false
287389
case *int8:
390+
if value == nil {
391+
return nil
392+
}
288393
return coerceBool(*value)
289394
case int16:
290395
if value != 0 {
291396
return true
292397
}
293398
return false
294399
case *int16:
400+
if value == nil {
401+
return nil
402+
}
295403
return coerceBool(*value)
296404
case int32:
297405
if value != 0 {
298406
return true
299407
}
300408
return false
301409
case *int32:
410+
if value == nil {
411+
return nil
412+
}
302413
return coerceBool(*value)
303414
case int64:
304415
if value != 0 {
305416
return true
306417
}
307418
return false
308419
case *int64:
420+
if value == nil {
421+
return nil
422+
}
309423
return coerceBool(*value)
310424
case uint:
311425
if value != 0 {
312426
return true
313427
}
314428
return false
315429
case *uint:
430+
if value == nil {
431+
return nil
432+
}
316433
return coerceBool(*value)
317434
case uint8:
318435
if value != 0 {
319436
return true
320437
}
321438
return false
322439
case *uint8:
440+
if value == nil {
441+
return nil
442+
}
323443
return coerceBool(*value)
324444
case uint16:
325445
if value != 0 {
326446
return true
327447
}
328448
return false
329449
case *uint16:
450+
if value == nil {
451+
return nil
452+
}
330453
return coerceBool(*value)
331454
case uint32:
332455
if value != 0 {
333456
return true
334457
}
335458
return false
336459
case *uint32:
460+
if value == nil {
461+
return nil
462+
}
337463
return coerceBool(*value)
338464
case uint64:
339465
if value != 0 {
340466
return true
341467
}
342468
return false
343469
case *uint64:
470+
if value == nil {
471+
return nil
472+
}
344473
return coerceBool(*value)
345474
}
346475
return false
@@ -392,6 +521,9 @@ func serializeDateTime(value interface{}) interface{} {
392521

393522
return string(buff)
394523
case *time.Time:
524+
if value == nil {
525+
return nil
526+
}
395527
return serializeDateTime(*value)
396528
default:
397529
return nil
@@ -411,6 +543,9 @@ func unserializeDateTime(value interface{}) interface{} {
411543
case string:
412544
return unserializeDateTime([]byte(value))
413545
case *string:
546+
if value == nil {
547+
return nil
548+
}
414549
return unserializeDateTime([]byte(*value))
415550
default:
416551
return nil

0 commit comments

Comments
 (0)