Rework nil/option for nre in light of ""==nil

Fixes #9243
This commit is contained in:
Flaviu Tamas 2018-11-18 21:41:40 -05:00
commit c0a47f7e22
No known key found for this signature in database
GPG key ID: D6BF32C876496756
6 changed files with 126 additions and 87 deletions

View file

@ -1,21 +1,9 @@
## INTERNAL FILE FOR USE ONLY BY nre.nim.
import tables
proc fget*[K, V](self: Table[K, V], key: K): V =
if self.hasKey(key):
return self[key]
else:
raise newException(KeyError, "Key does not exist in table: " & $key)
const Ident = {'a'..'z', 'A'..'Z', '0'..'9', '_', '\128'..'\255'}
const StartIdent = Ident - {'0'..'9'}
proc checkNil(arg: string): string =
if arg == nil:
raise newException(ValueError, "Cannot use nil capture")
else:
return arg
template formatStr*(howExpr, namegetter, idgetter): untyped =
let how = howExpr
var val = newStringOfCap(how.len)
@ -32,7 +20,7 @@ template formatStr*(howExpr, namegetter, idgetter): untyped =
i += 2
elif how[i + 1] == '#':
var id {.inject.} = lastNum
val.add(checkNil(idgetter))
val.add(idgetter)
lastNum += 1
i += 2
elif how[i + 1] in {'0'..'9'}:
@ -41,7 +29,7 @@ template formatStr*(howExpr, namegetter, idgetter): untyped =
while i < how.len and how[i] in {'0'..'9'}:
id += (id * 10) + (ord(how[i]) - ord('0'))
i += 1
val.add(checkNil(idgetter))
val.add(idgetter)
lastNum = id + 1
elif how[i + 1] in StartIdent:
i += 1
@ -49,7 +37,7 @@ template formatStr*(howExpr, namegetter, idgetter): untyped =
while i < how.len and how[i] in Ident:
name.add(how[i])
i += 1
val.add(checkNil(namegetter))
val.add(namegetter)
elif how[i + 1] == '{':
i += 2
var name {.inject.} = ""
@ -57,7 +45,7 @@ template formatStr*(howExpr, namegetter, idgetter): untyped =
name.add(how[i])
i += 1
i += 1
val.add(checkNil(namegetter))
val.add(namegetter)
else:
raise newException(Exception, "Syntax error in format string at " & $i)
val