Skip to content

Commit 0b2e218

Browse files
committed
make magic more clear
1 parent 1992a55 commit 0b2e218

File tree

1 file changed

+43
-45
lines changed

1 file changed

+43
-45
lines changed

telebot/utils.nim

Lines changed: 43 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ proc makeRequest*(endpoint: string, data: MultipartData = nil): Future[JsonNode]
6565
raise newException(IOError, r.status)
6666
client.close()
6767

68-
proc `%%`(s: string): string {.compileTime.} =
68+
proc formatName(s: string): string {.compileTime.} =
6969
if s == "kind":
7070
return "type"
7171
if s == "fromUser":
@@ -83,18 +83,18 @@ proc unmarshal*(n: JsonNode, T: typedesc): T {.inline.} =
8383
when result is object:
8484
for name, value in result.fieldPairs:
8585
when value.type is Option:
86-
if n.hasKey(%%name):
87-
toOption(value, n[%%name])
86+
if n.hasKey(formatName(name)):
87+
toOption(value, n[formatName(name)])
8888
elif value.type is TelegramObject:
89-
value = unmarshal(n[%%name], value.type)
89+
value = unmarshal(n[formatName(name)], value.type)
9090
elif value.type is seq:
9191
value = @[]
92-
for item in n[%%name].items:
92+
for item in n[formatName(name)].items:
9393
put(value, item)
9494
#elif value.type is ref:
9595
# echo "unmarshal ref"
9696
else:
97-
value = to(n[%%name], value.type)
97+
value = to(n[formatName(name)], value.type)
9898
elif result is seq:
9999
result = @[]
100100
for item in n.items:
@@ -111,11 +111,11 @@ proc marshal*[T](t: T, s: var string) =
111111
for name, value in t.fieldPairs:
112112
when value is Option:
113113
if value.isSome:
114-
s.add("\"" & %%name & "\":")
114+
s.add("\"" & formatName(name) & "\":")
115115
marshal(value, s)
116116
s.add(',')
117117
else:
118-
s.add("\"" & %%name & "\":")
118+
s.add("\"" & formatName(name) & "\":")
119119
marshal(value, s)
120120
s.add(',')
121121
s.removeSuffix(',')
@@ -168,7 +168,7 @@ proc getMessage*(n: JsonNode): Message {.inline.} =
168168
proc `%`*[T](o: Option[T]): JsonNode {.inline.} =
169169
if o.isSome:
170170
result = %o.get
171-
171+
172172
proc newProcDef(name: string): NimNode {.compileTime.} =
173173
result = newNimNode(nnkProcDef)
174174
result.add(postfix(ident(name), "*"))
@@ -185,10 +185,10 @@ macro magic*(head, body: untyped): untyped =
185185
result = newStmtList()
186186

187187
var
188-
tname: NimNode
188+
objNameNode: NimNode
189189

190190
if head.kind == nnkIdent:
191-
tname = head
191+
objNameNode = head
192192
else:
193193
quit "Invalid node: " & head.lispRepr
194194

@@ -198,60 +198,58 @@ macro magic*(head, body: untyped): untyped =
198198
objectTy.add(newEmptyNode(), newEmptyNode())
199199

200200
var
201-
realname = $tname & "Config"
202-
recList = newNimNode(nnkRecList)
203-
constructor = newProcDef("new" & $tname)
204-
sender = newProcDef("send")
205-
cParams = constructor[3]
206-
cStmtList = constructor[6]
207-
sParams = sender[3]
208-
sStmtList = sender[6]
209-
210-
sender[4] = newNimNode(nnkPragma).add(ident("async"), ident("discardable"))
211-
212-
objectTy.add(recList)
213-
cParams.add(ident(realname))
214-
215-
sParams.add(newNimNode(nnkBracketExpr).add(
216-
ident("Future"), ident("Message"))
201+
objRealName = $objNameNode & "Config"
202+
objParamList = newNimNode(nnkRecList)
203+
objInitProc = newProcDef("new" & $objNameNode)
204+
objSendProc = newProcDef("send")
205+
objInitProcParams = objInitProc[3]
206+
objInitProcBody = objInitProc[6]
207+
objSendProcParams = objSendProc[3]
208+
objSendProcBody = objSendProc[6]
209+
210+
objSendProc[4] = newNimNode(nnkPragma).add(ident("async"), ident("discardable"))
211+
212+
objectTy.add(objParamList)
213+
objInitProcParams.add(ident(objRealName))
214+
215+
objSendProcParams.add(newNimNode(nnkBracketExpr).add(
216+
ident("Future"), ident("Message")) # return value
217217
).add(newIdentDefs(ident("b"), ident("TeleBot"))
218-
).add(newIdentDefs(ident("m"), ident(realname)))
218+
).add(newIdentDefs(ident("m"), ident(objRealName)))
219219

220-
let apiMethod = "send" & $tname
221-
222-
sStmtList.add(newConstStmt(
220+
objSendProcBody.add(newConstStmt(
223221
ident("endpoint"),
224-
infix(ident("API_URL"), "&", newStrLitNode(apiMethod))
222+
infix(ident("API_URL"), "&", newStrLitNode("send" & $objNameNode))
225223
)).add(newVarStmt(
226224
ident("data"),
227225
newCall(ident("newMultipartData"))
228226
))
229227

230228
for node in body.items:
231-
let fname = $node[0]
229+
let fieldName = $node[0]
232230
case node[1][0].kind
233231
of nnkIdent:
234232
var identDefs = newIdentDefs(
235233
node[0],
236-
node[1][0] # cStmtList -> Ident
234+
node[1][0] # objInitProcBody -> Ident
237235
)
238-
recList.add(identDefs)
239-
cParams.add(identDefs)
240-
cStmtList.add(newAssignment(
236+
objParamList.add(identDefs)
237+
objInitProcParams.add(identDefs)
238+
objInitProcBody.add(newAssignment(
241239
newDotExpr(ident("result"), node[0]),
242240
node[0]
243241
))
244242

245-
sStmtList.add(newAssignment(
243+
objSendProcBody.add(newAssignment(
246244
newNimNode(nnkBracketExpr).add(
247245
ident("data"),
248-
newStrLitNode(%%fname)
246+
newStrLitNode(formatName(fieldName))
249247
),
250248
prefix(newDotExpr(ident("m"), node[0]), "$")
251249
))
252250

253251
of nnkPragmaExpr:
254-
recList.add(
252+
objParamList.add(
255253
newIdentDefs(
256254
postfix(node[0], "*"),
257255
node[1][0][0] # stmtList -> pragma -> ident
@@ -268,13 +266,13 @@ macro magic*(head, body: untyped): untyped =
268266
newCall(
269267
ident("add"),
270268
ident("data"),
271-
newStrLitNode(%%fname),
269+
newStrLitNode(formatName(fieldName)),
272270
prefix(newDotExpr(ident("m"), node[0]), "$")
273271
)
274272
)
275273
)
276274
)
277-
sStmtList.add(ifStmt)
275+
objSendProcBody.add(ifStmt)
278276
else:
279277
# silently ignore unsupported node
280278
discard
@@ -286,9 +284,9 @@ try:
286284
except:
287285
echo "Got exception ", repr(getCurrentException()), " with message: ", getCurrentExceptionMsg()
288286
""")
289-
sStmtList.add(epilogue[0])
287+
objSendProcBody.add(epilogue[0])
290288

291289
result.add(newNimNode(nnkTypeSection).add(
292-
newNimNode(nnkTypeDef).add(postfix(ident($tname & "Config"), "*"), newEmptyNode(), objectTy)
290+
newNimNode(nnkTypeDef).add(postfix(ident(objRealName), "*"), newEmptyNode(), objectTy)
293291
))
294-
result.add(constructor, sender)
292+
result.add(objInitProc, objSendProc)

0 commit comments

Comments
 (0)