Skip to content

Commit 37d5268

Browse files
committed
Remove some code duplication.
1 parent eb8b14f commit 37d5268

File tree

1 file changed

+6
-29
lines changed

1 file changed

+6
-29
lines changed

src/jsony.nim

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

361359
proc 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

455432
proc parseHook*[T](s: string, i: var int, v: var Option[T]) =

0 commit comments

Comments
 (0)