Skip to content

Instantly share code, notes, and snippets.

@mishankov
Created November 25, 2023 21:08
Show Gist options
  • Save mishankov/c5a8ce5fa95e23a66517291e3e050b06 to your computer and use it in GitHub Desktop.
Save mishankov/c5a8ce5fa95e23a66517291e3e050b06 to your computer and use it in GitHub Desktop.
Nim macro play
import macros, strutils
macro route(path: untyped, s: untyped): untyped =
let pathParts = path.strVal().split("/")
let functionName = pathParts[1]
var pathVars: seq[string] = @[]
for pathPart in pathParts:
if pathPart.startsWith("{"):
pathVars.add(pathPart.multiReplace(("{", "") , ("}", "")))
if pathVars.len() > 0:
var procStatements = newStmtList()
var procDef = newNimNode(nnkProcDef)
procDef.add(newIdentNode(functionName))
procDef.add(newEmptyNode())
procDef.add(newEmptyNode())
var params = newNimNode(nnkFormalParams)
params.add(newEmptyNode())
for pathVar in pathVars:
var idNode = newNimNode(nnkIdentDefs)
idNode.add(newIdentNode(pathVar))
idNode.add(newIdentNode("string"))
idNode.add(newEmptyNode())
params.add(idNode)
procDef.add(params)
procDef.add(newEmptyNode())
procDef.add(newEmptyNode())
procDef.add(s)
procStatements.add(procDef)
result = procStatements
else:
result = quote do:
proc route_proc() =
`s`
route "/root/{param_1}/{param_2}/after":
let a = 1 + 1
echo a, param_1, param_2
root("first", "second")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment