@@ -65,7 +65,7 @@ proc makeRequest*(endpoint: string, data: MultipartData = nil): Future[JsonNode]
65
65
raise newException (IOError , r.status)
66
66
client.close ()
67
67
68
- proc `%%` (s: string ): string {.compileTime .} =
68
+ proc formatName (s: string ): string {.compileTime .} =
69
69
if s == " kind" :
70
70
return " type"
71
71
if s == " fromUser" :
@@ -83,18 +83,18 @@ proc unmarshal*(n: JsonNode, T: typedesc): T {.inline.} =
83
83
when result is object :
84
84
for name, value in result .fieldPairs:
85
85
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) ])
88
88
elif value.type is TelegramObject :
89
- value = unmarshal (n[%% name], value.type )
89
+ value = unmarshal (n[formatName ( name) ], value.type )
90
90
elif value.type is seq :
91
91
value = @ []
92
- for item in n[%% name].items:
92
+ for item in n[formatName ( name) ].items:
93
93
put (value, item)
94
94
# elif value.type is ref:
95
95
# echo "unmarshal ref"
96
96
else :
97
- value = to (n[%% name], value.type )
97
+ value = to (n[formatName ( name) ], value.type )
98
98
elif result is seq :
99
99
result = @ []
100
100
for item in n.items:
@@ -111,11 +111,11 @@ proc marshal*[T](t: T, s: var string) =
111
111
for name, value in t.fieldPairs:
112
112
when value is Option :
113
113
if value.isSome:
114
- s.add (" \" " & %% name & " \" :" )
114
+ s.add (" \" " & formatName ( name) & " \" :" )
115
115
marshal (value, s)
116
116
s.add (',' )
117
117
else :
118
- s.add (" \" " & %% name & " \" :" )
118
+ s.add (" \" " & formatName ( name) & " \" :" )
119
119
marshal (value, s)
120
120
s.add (',' )
121
121
s.removeSuffix (',' )
@@ -168,7 +168,7 @@ proc getMessage*(n: JsonNode): Message {.inline.} =
168
168
proc `%` * [T](o: Option [T]): JsonNode {.inline .} =
169
169
if o.isSome:
170
170
result = % o.get
171
-
171
+
172
172
proc newProcDef (name: string ): NimNode {.compileTime .} =
173
173
result = newNimNode (nnkProcDef)
174
174
result .add (postfix (ident (name), " *" ))
@@ -185,10 +185,10 @@ macro magic*(head, body: untyped): untyped =
185
185
result = newStmtList ()
186
186
187
187
var
188
- tname : NimNode
188
+ objNameNode : NimNode
189
189
190
190
if head.kind == nnkIdent:
191
- tname = head
191
+ objNameNode = head
192
192
else :
193
193
quit " Invalid node: " & head.lispRepr
194
194
@@ -198,60 +198,58 @@ macro magic*(head, body: untyped): untyped =
198
198
objectTy.add (newEmptyNode (), newEmptyNode ())
199
199
200
200
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
217
217
).add (newIdentDefs (ident (" b" ), ident (" TeleBot" ))
218
- ).add (newIdentDefs (ident (" m" ), ident (realname )))
218
+ ).add (newIdentDefs (ident (" m" ), ident (objRealName )))
219
219
220
- let apiMethod = " send" & $ tname
221
-
222
- sStmtList.add (newConstStmt (
220
+ objSendProcBody.add (newConstStmt (
223
221
ident (" endpoint" ),
224
- infix (ident (" API_URL" ), " &" , newStrLitNode (apiMethod ))
222
+ infix (ident (" API_URL" ), " &" , newStrLitNode (" send " & $ objNameNode ))
225
223
)).add (newVarStmt (
226
224
ident (" data" ),
227
225
newCall (ident (" newMultipartData" ))
228
226
))
229
227
230
228
for node in body.items:
231
- let fname = $ node[0 ]
229
+ let fieldName = $ node[0 ]
232
230
case node[1 ][0 ].kind
233
231
of nnkIdent:
234
232
var identDefs = newIdentDefs (
235
233
node[0 ],
236
- node[1 ][0 ] # cStmtList -> Ident
234
+ node[1 ][0 ] # objInitProcBody -> Ident
237
235
)
238
- recList .add (identDefs)
239
- cParams .add (identDefs)
240
- cStmtList .add (newAssignment (
236
+ objParamList .add (identDefs)
237
+ objInitProcParams .add (identDefs)
238
+ objInitProcBody .add (newAssignment (
241
239
newDotExpr (ident (" result" ), node[0 ]),
242
240
node[0 ]
243
241
))
244
242
245
- sStmtList .add (newAssignment (
243
+ objSendProcBody .add (newAssignment (
246
244
newNimNode (nnkBracketExpr).add (
247
245
ident (" data" ),
248
- newStrLitNode (%% fname )
246
+ newStrLitNode (formatName (fieldName) )
249
247
),
250
248
prefix (newDotExpr (ident (" m" ), node[0 ]), " $" )
251
249
))
252
250
253
251
of nnkPragmaExpr:
254
- recList .add (
252
+ objParamList .add (
255
253
newIdentDefs (
256
254
postfix (node[0 ], " *" ),
257
255
node[1 ][0 ][0 ] # stmtList -> pragma -> ident
@@ -268,13 +266,13 @@ macro magic*(head, body: untyped): untyped =
268
266
newCall (
269
267
ident (" add" ),
270
268
ident (" data" ),
271
- newStrLitNode (%% fname ),
269
+ newStrLitNode (formatName (fieldName) ),
272
270
prefix (newDotExpr (ident (" m" ), node[0 ]), " $" )
273
271
)
274
272
)
275
273
)
276
274
)
277
- sStmtList .add (ifStmt)
275
+ objSendProcBody .add (ifStmt)
278
276
else :
279
277
# silently ignore unsupported node
280
278
discard
286
284
except:
287
285
echo "Got exception ", repr(getCurrentException()), " with message: ", getCurrentExceptionMsg()
288
286
""" )
289
- sStmtList .add (epilogue[0 ])
287
+ objSendProcBody .add (epilogue[0 ])
290
288
291
289
result .add (newNimNode (nnkTypeSection).add (
292
- newNimNode (nnkTypeDef).add (postfix (ident ($ tname & " Config " ), " *" ), newEmptyNode (), objectTy)
290
+ newNimNode (nnkTypeDef).add (postfix (ident (objRealName ), " *" ), newEmptyNode (), objectTy)
293
291
))
294
- result .add (constructor, sender )
292
+ result .add (objInitProc, objSendProc )
0 commit comments