Skip to content

Commit

Permalink
add {.raises.} annotation to writeValue (#64)
Browse files Browse the repository at this point in the history
Tag `writeValue` overrides with `{.raises: [IOError].}`.

The override in `writer.nim` also needs `gcsafe` to support recursion
in Nim 2.0.
  • Loading branch information
etan-status committed Aug 19, 2023
1 parent d93fc19 commit 85b7ea0
Show file tree
Hide file tree
Showing 7 changed files with 18 additions and 14 deletions.
10 changes: 6 additions & 4 deletions json_serialization/std/net.nim
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import
export
net, common

proc writeValue*(writer: var JsonWriter, value: IpAddress) =
proc writeValue*(
writer: var JsonWriter, value: IpAddress) {.raises: [IOError].} =
writeValue(writer, $value)

proc readValue*(reader: var JsonReader, value: var IpAddress) =
Expand All @@ -21,15 +22,16 @@ template writeValue*(writer: var JsonWriter, value: ValidIpAddress) =
template readValue*(reader: var JsonReader, value: var ValidIpAddress) =
readValue reader, IpAddress(value)

proc writeValue*(writer: var JsonWriter, value: Port) =
proc writeValue*(
writer: var JsonWriter, value: Port) {.raises: [IOError].} =
writeValue(writer, uint16 value)

proc readValue*(reader: var JsonReader, value: var Port) =
value = Port reader.readValue(uint16)

proc writeValue*(writer: var JsonWriter, value: AddressFamily) =
proc writeValue*(
writer: var JsonWriter, value: AddressFamily) {.raises: [IOError].} =
writeValue(writer, $value)

proc readValue*(reader: var JsonReader, value: var AddressFamily) =
value = parseEnum[AddressFamily](reader.readValue(string))

2 changes: 1 addition & 1 deletion json_serialization/std/options.nim
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ template writeObjectField*(w: var JsonWriter,
else:
false

proc writeValue*(writer: var JsonWriter, value: Option) =
proc writeValue*(writer: var JsonWriter, value: Option) {.raises: [IOError].} =
mixin writeValue

if value.isSome:
Expand Down
3 changes: 1 addition & 2 deletions json_serialization/std/sets.nim
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@ export sets
type
SetType = OrderedSet | HashSet | set

proc writeValue*(writer: var JsonWriter, value: SetType) =
proc writeValue*(writer: var JsonWriter, value: SetType) {.raises: [IOError].} =
writer.writeIterable value

proc readValue*(reader: var JsonReader, value: var SetType) =
type ElemType = type(value.items)
value = init SetType
for elem in readArray(reader, ElemType):
value.incl elem

3 changes: 2 additions & 1 deletion json_serialization/std/tables.nim
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ export tables
type
TableType = OrderedTable | Table

proc writeValue*(writer: var JsonWriter, value: TableType) =
proc writeValue*(
writer: var JsonWriter, value: TableType) {.raises: [IOError].} =
writer.beginRecord()
for key, val in value:
writer.writeField $key, val
Expand Down
3 changes: 2 additions & 1 deletion json_serialization/stew/results.nim
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ template writeObjectField*[T](w: var JsonWriter,
else:
false

proc writeValue*[T](writer: var JsonWriter, value: Result[T, void]) =
proc writeValue*[T](
writer: var JsonWriter, value: Result[T, void]) {.raises: [IOError].} =
mixin writeValue

if value.isOk:
Expand Down
7 changes: 4 additions & 3 deletions json_serialization/writer.nim
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ proc init*(W: type JsonWriter, stream: OutputStream,

proc beginRecord*(w: var JsonWriter, T: type)
proc beginRecord*(w: var JsonWriter)
proc writeValue*(w: var JsonWriter, value: auto)
proc writeValue*(w: var JsonWriter, value: auto) {.gcsafe, raises: [IOError].}

template append(x: untyped) =
write w.stream, x
Expand Down Expand Up @@ -65,7 +65,8 @@ proc writeFieldName*(w: var JsonWriter, name: string) =

w.state = RecordExpected

proc writeField*(w: var JsonWriter, name: string, value: auto) =
proc writeField*(
w: var JsonWriter, name: string, value: auto) {.raises: [IOError].} =
mixin writeValue

w.writeFieldName(name)
Expand Down Expand Up @@ -161,7 +162,7 @@ template writeObjectField*[FieldType, RecordType](w: var JsonWriter,
w.writeFieldIMPL(FieldTag[R, fieldName], field, record)
true

proc writeValue*(w: var JsonWriter, value: auto) =
proc writeValue*(w: var JsonWriter, value: auto) {.gcsafe, raises: [IOError].} =
mixin enumInstanceSerializedFields, writeValue

when value is JsonNode:
Expand Down
4 changes: 2 additions & 2 deletions tests/test_json_flavor.nim
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import

Json.createFlavor StringyJson

proc writeValue*(w: var JsonWriter[StringyJson], val: SomeInteger) =
proc writeValue*(
w: var JsonWriter[StringyJson], val: SomeInteger) {.raises: [IOError].} =
writeValue(w, $val)

proc readValue*(r: var JsonReader[StringyJson], v: var SomeSignedInt) =
Expand Down Expand Up @@ -38,4 +39,3 @@ except SerializationError as err:
quit 1

echo "Decoded: ", decoded

0 comments on commit 85b7ea0

Please sign in to comment.