Support when statements in records that reuse the same field name in different branches

This commit is contained in:
Zahary Karadjov 2021-01-06 15:27:28 +02:00
parent 217d78a1dc
commit 4e2ffe3f6d
No known key found for this signature in database
GPG Key ID: C8936F8A3073D609
2 changed files with 36 additions and 12 deletions

View File

@ -101,6 +101,7 @@ macro enumAllSerializedFieldsImpl(T: type, body: untyped): untyped =
let
fieldType = field.typ
FieldTypeSym = getTypeInst(fieldType)
fieldIdent = field.name
realFieldName = newLit($fieldIdent.skipPragma)
serializedFieldName = field.readPragma("serializedFieldName")
@ -132,14 +133,15 @@ macro enumAllSerializedFieldsImpl(T: type, body: untyped): untyped =
result.add quote do:
block:
when compiles(type(`field`)):
`fieldNameDefs`
type FieldType {.inject, used.} = type(`field`)
template fieldCaseDiscriminator: auto {.used.} = `discriminator`
template fieldCaseBranches: auto {.used.} = `branches`
when FieldType is `FieldTypeSym`:
`fieldNameDefs`
`body`
template fieldCaseDiscriminator: auto {.used.} = `discriminator`
template fieldCaseBranches: auto {.used.} = `branches`
`body`
i += 1

View File

@ -4,19 +4,41 @@ import
../serialization/object_serialization,
../serialization/testing/generic_suite
type
Untrusted = object
Trusted = object
Signature = object
p: int
k: float
TrustedSignature = object
data: string
SignatureHolder[TrustLevel] = object
when TrustLevel is Trusted:
sig: TrustedSignature
origin: string
else:
sig: Signature
func collectFields(T: type): seq[string] =
enumAllSerializedFields(T):
result.add(name(FieldType) & " " & fieldName & fieldCaseDiscriminator)
suite "object serialization":
setup:
var fieldsList = newSeq[string]()
test "custom fields order":
enumAllSerializedFields(Simple):
fieldsList.add(name(FieldType) & " " & fieldName & fieldCaseDiscriminator)
check fieldsList == @["Meter distance", "int x", "string y"]
check collectFields(Simple) == @["Meter distance", "int x", "string y"]
test "tuples handling":
var fieldsList = newSeq[string]()
enumAllSerializedFields(HoldsTuples):
fieldsList.add(fieldName & ": " & $isTuple(FieldType))
check fieldsList == @["t1: true", "t2: true", "t3: true"]
test "when statements":
check collectFields(SignatureHolder[Trusted]) == @["TrustedSignature sig", "string origin"]
check collectFields(SignatureHolder[Untrusted]) == @["Signature sig"]