@@ -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