@@ -260,17 +260,6 @@ proc parseHook*[T](s: string, i: var int, v: var seq[T]) =
260
260
break
261
261
eatChar (s, i, ']' )
262
262
263
- proc parseHook * [T: tuple ](s: string , i: var int , v: var T) =
264
- eatSpace (s, i)
265
- eatChar (s, i, '[' )
266
- for name, value in v.fieldPairs:
267
- eatSpace (s, i)
268
- parseHook (s, i, value)
269
- eatSpace (s, i)
270
- if i < s.len and s[i] == ',' :
271
- inc i
272
- eatChar (s, i, ']' )
273
-
274
263
proc parseHook * [T: array ](s: string , i: var int , v: var T) =
275
264
eatSpace (s, i)
276
265
eatChar (s, i, '[' )
@@ -341,6 +330,46 @@ template snakeCase(s: string): string =
341
330
const k = snakeCaseDynamic (s)
342
331
k
343
332
333
+ proc parseObject [T](s: string , i: var int , v: var T) =
334
+ eatChar (s, i, '{' )
335
+ while i < s.len:
336
+ eatSpace (s, i)
337
+ if i < s.len and s[i] == '}' :
338
+ break
339
+ var key: string
340
+ parseHook (s, i, key)
341
+ eatChar (s, i, ':' )
342
+ when compiles (renameHook (v, key)):
343
+ renameHook (v, key)
344
+ block all:
345
+ for k, v in v.fieldPairs:
346
+ if k == key or snakeCase (k) == key:
347
+ var v2: type (v)
348
+ parseHook (s, i, v2)
349
+ v = v2
350
+ break all
351
+ skipValue (s, i)
352
+ eatSpace (s, i)
353
+ if i < s.len and s[i] == ',' :
354
+ inc i
355
+ else :
356
+ break
357
+
358
+ proc parseHook * [T: tuple ](s: string , i: var int , v: var T) =
359
+ eatSpace (s, i)
360
+ when T.isNamedTuple ():
361
+ if i < s.len and s[i] == '{' :
362
+ parseObject (s, i, v)
363
+ return
364
+ eatChar (s, i, '[' )
365
+ for name, value in v.fieldPairs:
366
+ eatSpace (s, i)
367
+ parseHook (s, i, value)
368
+ eatSpace (s, i)
369
+ if i < s.len and s[i] == ',' :
370
+ inc i
371
+ eatChar (s, i, ']' )
372
+
344
373
proc parseHook * [T: enum ](s: string , i: var int , v: var T) =
345
374
eatSpace (s, i)
346
375
var strV: string
0 commit comments