mirror of
https://github.com/nim-lang/Nim.git
synced 2026-06-05 11:24:08 +00:00
Fix tuple size check in std/jsonutils (#20637)
* Add test for tuple being invalid size * Test tuple size before accessing fields * Fix formatting for import * Fix not being able to build from csources_v1 Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
This commit is contained in:
@@ -32,7 +32,7 @@ add a way to customize serialization, for e.g.:
|
||||
|
||||
import macros
|
||||
from enumutils import symbolName
|
||||
from typetraits import OrdinalEnum
|
||||
from typetraits import OrdinalEnum, tupleLen
|
||||
|
||||
when defined(nimPreviewSlimSystem):
|
||||
import std/assertions
|
||||
@@ -286,11 +286,21 @@ proc fromJson*[T](a: var T, b: JsonNode, opt = Joptions()) =
|
||||
fromJsonFields(a, nil, b, seq[string].default, opt)
|
||||
else:
|
||||
checkJson b.kind == JArray, $(b.kind) # we could customize whether to allow JNull
|
||||
|
||||
when compiles(tupleLen(T)):
|
||||
let tupleSize = tupleLen(T)
|
||||
else:
|
||||
# Tuple len isn't in csources_v1 so using tupleLen would fail.
|
||||
# Else branch basically never runs (tupleLen added in 1.1 and jsonutils in 1.4), but here for consistency
|
||||
var tupleSize = 0
|
||||
for val in fields(a):
|
||||
tupleSize.inc
|
||||
|
||||
checkJson b.len == tupleSize, $(b.len, tupleSize, $T, b) # could customize
|
||||
var i = 0
|
||||
for val in fields(a):
|
||||
fromJson(val, b[i], opt)
|
||||
i.inc
|
||||
checkJson b.len == i, $(b.len, i, $T, b) # could customize
|
||||
else:
|
||||
# checkJson not appropriate here
|
||||
static: doAssert false, "not yet implemented: " & $T
|
||||
|
||||
@@ -410,6 +410,13 @@ template fn() =
|
||||
doAssert foo.c == 0
|
||||
doAssert foo.c0 == 42
|
||||
|
||||
|
||||
block testInvalidTupleLength:
|
||||
let json = parseJson("[0]")
|
||||
# Should raise ValueError instead of index error
|
||||
doAssertRaises(ValueError):
|
||||
discard json.jsonTo((int, int))
|
||||
|
||||
type
|
||||
InnerEnum = enum
|
||||
A
|
||||
@@ -431,7 +438,6 @@ template fn() =
|
||||
let json = inner.toJson(ToJsonOptions(enumMode: joptEnumSymbol))
|
||||
doAssert $json == """{"x":"hello","y":"A"}"""
|
||||
|
||||
|
||||
when false:
|
||||
## TODO: Implement support for nested variant objects allowing the tests
|
||||
## bellow to pass.
|
||||
|
||||
Reference in New Issue
Block a user