template opt() {.pragma.}
type A = object
name {.opt.}: string
age: int
var a = A(name: "foo", age: 10)
# expect like below:
#
# case k
# of "name":
# a.name = "🤔"
# else:
# discard
#
# but result is:
#
# case k
# else:
# discard
macro parse(a: typed; k: untyped): untyped =
result = nnkCaseStmt.newTree(k)
for fieldDef in a.getTypeImpl()[2]:
# unexpected: why fieldDef[0].kind is nnkSym ?
# how to get pragma of the field
if fieldDef[0].kind == nnkPragmaExpr and
fieldDef[0][1][0].eqIdent("opt"):
let fieldNameIdent = fieldDef[0][0]
result.add nnkOfBranch.newTree(
newLit(fieldNameIdent.strVal),
nnkStmtList.newTree(
nnkAsgn.newTree(nnkDotExpr.newTree(a, fieldNameIdent),
newLit("🤔"))
),
)
result.add nnkElse.newTree(
nnkStmtList.newTree(nnkDiscardStmt.newTree(newEmptyNode()))
)
let k = "name"
expandMacros:
parse a, k
Run