Skip to content

Commit 771517b

Browse files
committed
Add support for distinct types.
1 parent c272caf commit 771517b

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

src/jsony.nim

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import jsony/objvar, strutils, tables, sets, unicode, json, options, parseutils
1+
import jsony/objvar, strutils, tables, sets, unicode, json, options, parseutils, typetraits
22

33
type JsonError* = object of ValueError
44

@@ -20,6 +20,7 @@ proc parseHook*[T: array](s: string, i: var int, v: var T)
2020
proc parseHook*[T: not object](s: string, i: var int, v: var ref T)
2121
proc parseHook*(s: string, i: var int, v: var JsonNode)
2222
proc parseHook*(s: string, i: var int, v: var char)
23+
proc parseHook*[T: distinct](s: string, i: var int, v: var T)
2324

2425
template error(msg: string, i: int) =
2526
## Shortcut to raise an exception.
@@ -525,6 +526,11 @@ proc parseHook*(s: string, i: var int, v: var JsonNode) =
525526
else:
526527
error("Unexpected.", i)
527528

529+
proc parseHook*[T: distinct](s: string, i: var int, v: var T) =
530+
var x: T.distinctBase
531+
parseHook(s, i, x)
532+
v = cast[T](x)
533+
528534
proc fromJson*[T](s: string, x: typedesc[T]): T =
529535
## Takes json and outputs the object it represents.
530536
## * Extra json fields are ignored.
@@ -549,6 +555,11 @@ proc dumpHook*[N, T](s: var string, v: array[N, T])
549555
proc dumpHook*[T](s: var string, v: seq[T])
550556
proc dumpHook*(s: var string, v: object)
551557
proc dumpHook*(s: var string, v: ref)
558+
proc dumpHook*[T: distinct](s: var string, v: T)
559+
560+
proc dumpHook*[T: distinct](s: var string, v: T) =
561+
var x = cast[T.distinctBase](v)
562+
s.dumpHook(x)
552563

553564
proc dumpHook*(s: var string, v: bool) =
554565
if v:

tests/test_distinct.nim

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import jsony
2+
3+
type
4+
Timestamp* = distinct float64 ## Always seconds since 1970 UTC.
5+
6+
proc `$`*(a: Timestamp): string =
7+
## Display a timestamps as a float64.
8+
$float64(a)
9+
10+
proc `==`*(a, b: Timestamp): bool =
11+
## Compare timestamps.
12+
float64(a) == float64(b)
13+
14+
var t = Timestamp(123.123)
15+
16+
doAssert t.toJson() == "123.123"
17+
doAssert "1234.123".fromJson(Timestamp) == Timestamp(1234.123)
18+
doAssert t.toJson().fromJson(Timestamp) == t

0 commit comments

Comments
 (0)