Advertisement
Guest User

Untitled

a guest
Mar 6th, 2021
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 1.86 KB | None | 0 0
  1. StmtList
  2.   StmtList
  3.     TypeSection
  4.       TypeDef
  5.         Postfix
  6.           Ident "*"
  7.           Ident "test"
  8.         Empty
  9.         RefTy
  10.           ObjectTy
  11.             Empty
  12.             Empty
  13.             RecList
  14.               IdentDefs
  15.                 Postfix
  16.                   Ident "*"
  17.                   Ident "wobble"
  18.                 Ident "int"
  19.                 Empty
  20.               IdentDefs
  21.                 Postfix
  22.                   Ident "*"
  23.                   Ident "wibble"
  24.                 Ident "string"
  25.                 Empty
  26.     ProcDef
  27.       Ident "`$`"
  28.       Empty
  29.       Empty
  30.       FormalParams
  31.         Ident "string"
  32.         ExprColonExpr
  33.           Ident "v"
  34.           Ident "test"
  35.       Empty
  36.       Empty
  37.       StrLit "wibble"
  38. -------------------------------------------------------
  39.  
  40. macro generateCastleDbModel*(fileName: static[string]) : untyped =
  41.   var nodes : seq[NimNode] = @[]
  42.   nodes.add(generateType("test", {"wibble": "string", "wobble": "int"}.newTable))
  43.   result = newStmtList(nodes)
  44.  
  45.   echo result.repr
  46.  
  47. proc generateType(name: string, fields: TableRef[string, string] ) : NimNode =
  48.   var types  = collect(newSeq):
  49.       for k,v in fields:
  50.         newIdentDefs(postfix(ident(k), "*"), ident(v))
  51.  
  52.   let typeDefinition =  newTree(nnkTypeSection,
  53.     newTree(nnkTypeDef,
  54.       postfix(ident(name), "*"),
  55.       newEmptyNode(),
  56.       newTree(nnkRefTy,
  57.         newTree(nnkObjectTy,
  58.           newEmptyNode(),
  59.           newEmptyNode(),
  60.           newTree(nnkRecList,
  61.             types
  62.           )
  63.         )
  64.       )
  65.     )
  66.   )
  67.  
  68.   let procReturnAndMethodArguments = @[ident("string"), newColonExpr(ident("v"), ident(name))]
  69.   let toStringMethod = newProc(name=ident("`$`"), params=procReturnAndMethodArguments, body=newStrLitNode("wibble"), NimNodeKind.nnkProcDef)
  70.  
  71.   result = newStmtList(typeDefinition, toStringMethod)
  72.  
  73.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement