Advertisement
Guest User

Untitled

a guest
Aug 14th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 2.10 KB | None | 0 0
  1. proc getEnumFieldDefNodes(stmtList: NimNode): seq[NimNode] =
  2.     #[
  3.     Get all the defined fields and their string enum equivalent
  4.     ]#
  5.     expectKind(stmtList, nnkStmtList)
  6.     result = @[]
  7.  
  8.     for child in stmtList:
  9.         expectKind(child, nnkAsgn)
  10.         result.add(newNimNode(nnkEnumFieldDef).add(child[0]).add(child[1]))
  11.  
  12. proc createFindSlackRTMTypeProc(typeName: NimIdent, identDefs: seq[NimNode]): NimNode =
  13.     #[
  14.     Build our proc to convert string to these Message Type objects
  15.     ]#
  16.     var msgTypeIdent = newIdentNode("msgType")
  17.     var body = newStmtList()
  18.  
  19.     body.add(newProc(name = newTree(nnkPostFix, ident("*"), newIdentNode("stringTo$#" % $typeName)),
  20.         params = @[newIdentNode(typeName),
  21.             newIdentDefs(msgTypeIdent, ident("string"))
  22.         ]))
  23.  
  24.     body[0].body.add(newTree(nnkCaseStmt, msgTypeIdent))
  25.     for identDef in identDefs:
  26.         body[0].body[0].add(newTree(nnkOfBranch,
  27.             newTree(nnkPrefix,
  28.                 newIdentNode("$"),
  29.                 newTree(nnkDotExpr,
  30.                     newIdentNode(typeName),
  31.                     identDef[0]
  32.                 )
  33.             ),
  34.             newStmtList(
  35.                 newTree(nnkAsgn,
  36.                     ident("result"),
  37.                     newTree(nnkDotExpr,
  38.                         newIdentNode(typeName),
  39.                         identDef[0]
  40.                     )
  41.                 )
  42.             )
  43.         ))
  44.     return body
  45.  
  46. macro rtmtypes(typeName: untyped, fields: untyped): untyped =
  47.     #[
  48.     As there's many many slack message types, with new ones being added,
  49.     we want to build an enum from this definition and define a proc
  50.     that translates a string into an Enum
  51.     ]#
  52.     result = newStmtList()
  53.  
  54.     result.add(newStmtList(newEnum(
  55.         name = newIdentNode(typeName.ident),
  56.         fields = getEnumFieldDefNodes(fields),
  57.         public = true,
  58.         pure = true)
  59.     ))
  60.  
  61.     result.add(createFindSlackRTMTypeProc(ident(typeName), getEnumFieldDefNodes(fields)))
  62.  
  63. rtmtypes SlackRTMType:
  64.     Message = "message"
  65.     UserTyping = "user_typing"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement