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

Reply via email to