Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- proc getEnumFieldDefNodes(stmtList: NimNode): seq[NimNode] =
- #[
- Get all the defined fields and their string enum equivalent
- ]#
- expectKind(stmtList, nnkStmtList)
- result = @[]
- for child in stmtList:
- expectKind(child, nnkAsgn)
- result.add(newNimNode(nnkEnumFieldDef).add(child[0]).add(child[1]))
- proc createFindSlackRTMTypeProc(typeName: NimIdent, identDefs: seq[NimNode]): NimNode =
- #[
- Build our proc to convert string to these Message Type objects
- ]#
- var msgTypeIdent = newIdentNode("msgType")
- var body = newStmtList()
- body.add(newProc(name = newTree(nnkPostFix, ident("*"), newIdentNode("stringTo$#" % $typeName)),
- params = @[newIdentNode(typeName),
- newIdentDefs(msgTypeIdent, ident("string"))
- ]))
- body[0].body.add(newTree(nnkCaseStmt, msgTypeIdent))
- for identDef in identDefs:
- body[0].body[0].add(newTree(nnkOfBranch,
- newTree(nnkPrefix,
- newIdentNode("$"),
- newTree(nnkDotExpr,
- newIdentNode(typeName),
- identDef[0]
- )
- ),
- newStmtList(
- newTree(nnkAsgn,
- ident("result"),
- newTree(nnkDotExpr,
- newIdentNode(typeName),
- identDef[0]
- )
- )
- )
- ))
- return body
- macro rtmtypes(typeName: untyped, fields: untyped): untyped =
- #[
- As there's many many slack message types, with new ones being added,
- we want to build an enum from this definition and define a proc
- that translates a string into an Enum
- ]#
- result = newStmtList()
- result.add(newStmtList(newEnum(
- name = newIdentNode(typeName.ident),
- fields = getEnumFieldDefNodes(fields),
- public = true,
- pure = true)
- ))
- result.add(createFindSlackRTMTypeProc(ident(typeName), getEnumFieldDefNodes(fields)))
- rtmtypes SlackRTMType:
- Message = "message"
- UserTyping = "user_typing"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement