I am trying to use JsonNode in macro, but failed...
    
    
    let exampleData = %*{
      "name": "John Doe",
      "age": 30,
      "city": "New York"
    }
    
    macro genType*(name: untyped, fields: JsonNode): untyped =
      result = newStmtList()
      
      var fieldsAst = nnkRecList.newTree()
      for k, v in fields.pairs:
        fieldsAst.add(
          newTree(nnkIdentDefs,
              newTree(nnkPostfix, newIdentNode("*"), newIdentNode(k),
              newIdentNode("string"), # use v.kind mapping later
              newEmptyNode()
            )
          )
        )
      
      # Generate the base type
      let baseType = newTree(nnkTypeSection,
        newTree(nnkTypeDef,
          newTree(nnkPostfix,
            newIdentNode("*"),
            newTree(nnkAccQuoted, name)
          ),
          newEmptyNode(),
          newTree(nnkObjectTy,
            newEmptyNode(),
            newEmptyNode(),
            # # Replace the specific AST with a generic one :
            fieldsAst
          )
        )
      )
      result.add(baseType)
    
    
    
    Run

test macro
    
    
    # run this macro with exampleData
    genTable(Person, exampleData)
    
    
    
    Run

`error`
    
    
    Error: type mismatch
    Expression: newIdentNode(k)
      [1] k: int
    
    Expected one of (first mismatch at [position]):
    [1] proc newIdentNode(i: NimIdent): NimNode
    [1] proc newIdentNode(i: string): NimNode
    
    
    Run

Reply via email to