@@ -330,8 +330,7 @@ template snakeCase(s: string): string =
330330 const k = snakeCaseDynamic (s)
331331 k
332332
333- proc parseObject [T](s: string , i: var int , v: var T) =
334- eatChar (s, i, '{' )
333+ proc parseObjectInner [T](s: string , i: var int , v: var T) =
335334 while i < s.len:
336335 eatSpace (s, i)
337336 if i < s.len and s[i] == '}' :
@@ -356,13 +355,14 @@ proc parseObject[T](s: string, i: var int, v: var T) =
356355 break
357356 when compiles (postHook (v)):
358357 postHook (v)
359- eatChar (s, i, '}' )
360358
361359proc parseHook * [T: tuple ](s: string , i: var int , v: var T) =
362360 eatSpace (s, i)
363361 when T.isNamedTuple ():
364362 if i < s.len and s[i] == '{' :
365- parseObject (s, i, v)
363+ eatChar (s, i, '{' )
364+ parseObjectInner (s, i, v)
365+ eatChar (s, i, '}' )
366366 return
367367 eatChar (s, i, '[' )
368368 for name, value in v.fieldPairs:
@@ -405,7 +405,7 @@ proc parseHook*[T: object|ref object](s: string, i: var int, v: var T) =
405405 elif compiles (new (v)):
406406 new (v)
407407 else :
408- # Look for the discriminatorFieldName
408+ # Look for the discriminatorFieldName, then parse as normal object.
409409 eatSpace (s, i)
410410 var saveI = i
411411 while i < s.len:
@@ -426,30 +426,7 @@ proc parseHook*[T: object|ref object](s: string, i: var int, v: var T) =
426426 error (" No discriminator field." , i)
427427 eatChar (s, i, ',' )
428428 i = saveI
429- while i < s.len:
430- eatSpace (s, i)
431- if i < s.len and s[i] == '}' :
432- break
433- var key: string
434- parseHook (s, i, key)
435- eatChar (s, i, ':' )
436- when compiles (renameHook (v, key)):
437- renameHook (v, key)
438- block all:
439- for k, v in v.fieldPairs:
440- if k == key or snakeCase (k) == key:
441- var v2: type (v)
442- parseHook (s, i, v2)
443- v = v2
444- break all
445- skipValue (s, i)
446- eatSpace (s, i)
447- if i < s.len and s[i] == ',' :
448- inc i
449- else :
450- break
451- when compiles (postHook (v)):
452- postHook (v)
429+ parseObjectInner (s, i, v)
453430 eatChar (s, i, '}' )
454431
455432proc parseHook * [T](s: string , i: var int , v: var Option [T]) =
0 commit comments