@@ -260,17 +260,6 @@ proc parseHook*[T](s: string, i: var int, v: var seq[T]) =
260260 break
261261 eatChar (s, i, ']' )
262262
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-
274263proc parseHook * [T: array ](s: string , i: var int , v: var T) =
275264 eatSpace (s, i)
276265 eatChar (s, i, '[' )
@@ -341,6 +330,46 @@ template snakeCase(s: string): string =
341330 const k = snakeCaseDynamic (s)
342331 k
343332
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+
344373proc parseHook * [T: enum ](s: string , i: var int , v: var T) =
345374 eatSpace (s, i)
346375 var strV: string
0 commit comments