treat array-of-char as string

This commit is contained in:
Jacek Sieka 2020-04-24 15:42:27 +02:00 committed by zah
parent bed0e403a4
commit e485b74a10
2 changed files with 14 additions and 2 deletions

View File

@ -124,9 +124,16 @@ proc writeIterable*(w: var JsonWriter, collection: auto) =
append ']'
proc writeArray[T](w: var JsonWriter, elements: openarray[T]) =
proc writeArray*[T](w: var JsonWriter, elements: openarray[T]) =
writeIterable(w, elements)
# this construct catches `array[N, char]` which otherwise won't decompose into
# openArray[char] - we treat any array-like thing-of-characters as a string in
# the output
template isStringLike(v: string|cstring|openArray[char]|seq[char]): bool = true
template isStringLike[N](v: array[N, char]): bool = true
template isStringLike(v: auto): bool = false
proc writeValue*(w: var JsonWriter, value: auto) =
mixin enumInstanceSerializedFields, writeValue, writeFieldIMPL
@ -140,7 +147,7 @@ proc writeValue*(w: var JsonWriter, value: auto) =
append "null"
else:
writeValue(w, value[])
elif value is string|cstring:
elif isStringLike(value):
append '"'
template addPrefixSlash(c) =

View File

@ -149,3 +149,8 @@ suite "toJson tests":
check:
$original == $decoded
test "openArray[char]":
check:
"abc" == Json.decode(Json.encode(['a', 'b', 'c']), string)
"abc" == Json.decode(Json.encode(@['a', 'b', 'c']), string)