This template gives an error at the line where fmt is to be used to format a string with the keyword attempts
template requestWrapper(client : HttpClient, url, body, status: string, headers: TableRef[string, seq[string]],
reqtype : ReqType = Get, action: untyped) =
var attempts : int
## If request TIMEOUT try again 5 times
while true:
try:
## do something
except TimeoutError:
if attempts < 5:
error("Request TIMEOUT, trying again...")
attempts.inc()
continue
fatal(fmt"Request TIMEOUT after {attempts} attempts, quitting..") ## This line gives an error
quit(-1)
The error :
/home/cnerd/Documents/Pentesting/twitterapi/src/twitterapipkg/api.nim(126, 18) template/generic instantiation of `requestWrapper` from here
/home/cnerd/Documents/Pentesting/twitterapi/src/twitterapipkg/api.nim(89, 16) template/generic instantiation of `fmt` from here
/home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/core/macros.nim(533, 1) Error: undeclared identifier: 'attempts'
candidates (edit distance, scope distance); see '--spellSuggest':
(4, 9): 'accept' [proc declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/pure/net.nim(1084, 6)]
(4, 9): 'items' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/pure/collections/sequtils.nim(1123, 10)]
(4, 9): 'items' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/pure/json.nim(822, 10)]
(4, 9): 'items' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(116, 10)]
(4, 9): 'items' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(126, 10)]
(4, 9): 'items' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(13, 10)]
(4, 9): 'items' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(233, 10)]
(4, 9): 'items' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(251, 10)]
(4, 9): 'items' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(30, 10)]
(4, 9): 'items' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(48, 10)]
(4, 9): 'items' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(57, 10)]
(4, 9): 'items' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(6, 10)]
(4, 9): 'mitems' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/pure/json.nim(828, 10)]
(4, 9): 'mitems' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(23, 10)]
(4, 9): 'mitems' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(242, 10)]
(4, 9): 'mitems' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(260, 10)]
(4, 9): 'mitems' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(39, 10)]
(4, 9): 'mitems' [iterator declared in /home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/iterators.nim(86, 10)]
Tip: 3 messages have been suppressed, use --verbose to show them.
Error: Build failed for package: twitterapi
... Execution failed with exit code 1
... Command: /home/cnerd/.nimble/bin/nim cpp --colors:on --noNimblePath --gc:arc --d:ssl --d:danger --d:release -d:NimblePkgVersion=0.1.0 --path:/home/cnerd/.nimble/pkgs/zippy-0.7.4 --hints:off -o:/home/cnerd/Documents/Pentesting/twitterapi/bin/twitterapi /home/cnerd/Documents/Pentesting/twitterapi/src/twitterapi.nim
stack trace: (most recent call last)
/tmp/nimblecache-1860451227/nimscriptapi_2618866954.nim(187, 16)
/home/cnerd/Documents/Pentesting/twitterapi/twitterapi.nimble(19, 10) makeTask
/home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/nimscript.nim(273, 7) exec
/home/cnerd/.choosenim/toolchains/nim-1.6.4/lib/system/nimscript.nim(273, 7) Error: unhandled exception: FAILED: nimble --gc:arc --d:ssl --d:danger --d:release build [OSError]
It does apply, just in a different way. fmt is expanded _after the template itself is expanded, and templates are hygienic by default, so attempts will be gensym'd so fmt can't find it. You can solve this by using inject, but then attempts will be visible from the code passed to the template.
import std/strformat
template requestWrapper() =
var attempts {.inject.}: int
echo fmt"test {attempts}"
requestWrapper()
to workaround injecting attempts into the containing scope you can wrap the template in a block:
import std/strformat
template requestWrapper() =
block:
var attempts {.inject.}: int
echo fmt"test {attempts}"
requestWrapper()
requestWrapper()