Skip to content

Commit 2183130

Browse files
Merge pull request #7 from Patitotective/devel
v1.2.4
2 parents 1cf932e + 0725fc8 commit 2183130

File tree

4 files changed

+33
-19
lines changed

4 files changed

+33
-19
lines changed

kdl.nimble

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Package
22

3-
version = "1.2.3"
3+
version = "1.2.4"
44
author = "Patitotective"
55
description = "KDL document language Nim implementation"
66
license = "MIT"

src/kdl/nodes.nim

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ proc getInt*(val: KdlVal): int64 =
7979
check val.isInt()
8080
val.num
8181

82-
proc get*[T: SomeNumber or string or bool](val: KdlVal, x: typedesc[T]): T =
82+
proc get*[T: Value](val: KdlVal, x: typedesc[T]): T =
8383
## Tries to get and convert val to T, raises an error when it cannot.
8484
runnableExamples:
8585
let val = initKFloat(3.14)
@@ -88,6 +88,7 @@ proc get*[T: SomeNumber or string or bool](val: KdlVal, x: typedesc[T]): T =
8888
assert val.get(uint) == 3u
8989
assert val.get(float) == 3.14
9090
assert val.get(float32) == 3.14f
91+
assert val.get(range[0f..4f]) == 3.14f
9192

9293
when T is string:
9394
result =
@@ -104,7 +105,7 @@ proc get*[T: SomeNumber or string or bool](val: KdlVal, x: typedesc[T]): T =
104105
$val.getInt()
105106
of KEmpty:
106107
"empty"
107-
elif T is SomeNumber:
108+
elif T is SomeNumber or T is range:
108109
check val.isFloat or val.isInt
109110

110111
result =
@@ -116,6 +117,8 @@ proc get*[T: SomeNumber or string or bool](val: KdlVal, x: typedesc[T]): T =
116117
check val.isBool
117118

118119
result = val.getBool
120+
else:
121+
{.error: "get is not implemented for " & $typeof(T).}
119122

120123
# ----- Setters -----
121124

src/kdl/utils.nim

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ type
88

99
Object* = ((object or tuple) and not KdlSome)
1010
List* = (array or seq)
11-
Value* = (SomeNumber or string or bool)
11+
Value* = (SomeNumber or string or bool or range)
1212
KdlSome* = (KdlDoc or KdlNode or KdlVal)
1313
SomeTable*[K, V] = (Table[K, V] or OrderedTable[K, V])
1414

15-
template fail*(msg: string) =
15+
template fail*(msg: string) =
1616
raise newException(KdlError, msg)
1717

18-
template check*(cond: untyped, msg = "") =
18+
template check*(cond: untyped, msg = "") =
1919
if not cond:
2020
let txt = msg
2121
fail astToStr(cond) & " failed" & (if txt.len > 0: ": " & txt else: "")
@@ -50,12 +50,12 @@ proc eqIdent*(v, a: openarray[char], ignoreChars = {'_', '-'}): bool = cmpIgnore
5050

5151
# ----- Streams -----
5252

53-
proc peekRune*(s: Stream): Rune =
53+
proc peekRune*(s: Stream): Rune =
5454
let str = s.peekStr(4)
5555
if str.len > 0:
5656
result = str.runeAt(0)
5757

58-
proc peekLineFromStart*(s: Stream): string =
58+
proc peekLineFromStart*(s: Stream): string =
5959
let before = s.getPosition()
6060
while s.getPosition() > 0:
6161
s.setPosition(s.getPosition() - 1)
@@ -69,7 +69,7 @@ proc peekLineFromStart*(s: Stream): string =
6969
result = s.peekLine()
7070
s.setPosition before
7171

72-
proc peekLineFromStart*(s: string, at: int): string =
72+
proc peekLineFromStart*(s: string, at: int): string =
7373
if at >= s.len:
7474
return
7575

@@ -112,7 +112,7 @@ proc getCoord*(s: string, at: int): Coord =
112112

113113
inc result.idx
114114

115-
proc errorAt*(s: Stream, coord: Coord): string =
115+
proc errorAt*(s: Stream, coord: Coord): string =
116116
let before = s.getPosition()
117117
s.setPosition coord.idx
118118
let line = s.peekLineFromStart()
@@ -122,7 +122,7 @@ proc errorAt*(s: Stream, coord: Coord): string =
122122
result.add(&"{lineNum}{line}\n")
123123
result.add(&"{repeat(' ', lineNum.len + coord.col)}^")
124124

125-
proc errorAt*(s: string, coord: Coord): string =
125+
proc errorAt*(s: string, coord: Coord): string =
126126
let line = s.peekLineFromStart(coord.idx)
127127

128128
let lineNum = &"{coord.line + 1} | "
@@ -131,16 +131,19 @@ proc errorAt*(s: string, coord: Coord): string =
131131

132132
# ----- Object variants -----
133133

134-
macro isObjVariant*(a: typedesc): bool =
134+
macro isObjVariant*(a: typedesc): bool =
135135
var a = a.getTypeImpl
136-
doAssert a.kind == nnkBracketExpr
136+
if a.kind != nnkBracketExpr:
137+
return ident("false")
138+
137139
let sym = a[1]
138140
let t = sym.getTypeImpl
139141
if t.kind != nnkObjectTy:
140142
return ident("false")
141143

142144
let t2 = t[2]
143-
doAssert t2.kind == nnkRecList
145+
if t2.kind != nnkRecList:
146+
return ident("false")
144147

145148
result = ident("false")
146149

@@ -155,24 +158,30 @@ macro getDiscriminants*(a: typedesc): seq[string] =
155158
## return the discriminant keys
156159
# candidate for std/typetraits
157160
var a = a.getTypeImpl
158-
doAssert a.kind == nnkBracketExpr
161+
if a.kind != nnkBracketExpr:
162+
return quote do:
163+
newSeq[string]()
164+
159165
let sym = a[1]
160166
let t = sym.getTypeImpl
161167
if t.kind != nnkObjectTy:
162168
return quote do:
163169
newSeq[string]()
164170

165171
let t2 = t[2]
166-
doAssert t2.kind == nnkRecList
172+
if t2.kind != nnkRecList:
173+
return quote do:
174+
newSeq[string]()
175+
167176
result = newTree(nnkBracket)
168177

169178
for ti in t2:
170179
if ti.kind == nnkRecCase:
171180
let key = ti[0][0]
172181
let typ = ti[0][1]
173182
result.add newLit key.strVal
174-
175-
result =
183+
184+
result =
176185
if result.len > 0:
177186
quote do:
178187
@`result`
@@ -214,3 +223,4 @@ macro initCaseObject*(T: typedesc, discriminatorSetter): untyped =
214223
result.add newTree(nnkExprColonExpr, key, val)
215224

216225
template typeofdesc*[T](b: typedesc[T]): untyped = T
226+

tests/test_serializer.nim

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ type
2222
MyObj2 = object
2323
id*: int
2424
name*: string
25+
subrange*: range[0f..1f]
2526

2627
MyObj3 = object
2728
id*: int
@@ -368,7 +369,7 @@ suite "Decoder":
368369

369370
test "newHook":
370371
check parseKdl("").decode(DateTime) == dateTime(2000, mMar, 30)
371-
check parseKdl("name \"otoboke\"").decode(MyObj2) == MyObj2(id: 5, name: "otoboke")
372+
check parseKdl("name \"otoboke\"; subrange 0.6").decode(MyObj2) == MyObj2(id: 5, subrange: 0.6, name: "otoboke")
372373

373374
test "postHook":
374375
check parseKdl("id 4").decode(MyObj3) == MyObj3(id: 5)

0 commit comments

Comments
 (0)