aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-04-10 22:24:13 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2018-04-10 22:24:13 +0300
commit92ff48a071cbdd894a0ec3147cf6623c0e394365 (patch)
tree046aa065e30c1b3a42121c9129068e58593c548a
parentdf3e98d4fe8c070c1e343cad865ac3b115ad3b3c (diff)
downloadnimpb_protoc-json-parsing.tar.gz
nimpb_protoc-json-parsing.zip
JSON parsing fixesjson-parsing
-rw-r--r--src/nimpb_buildpkg/plugin.nim12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/nimpb_buildpkg/plugin.nim b/src/nimpb_buildpkg/plugin.nim
index 27e4253..b578f8a 100644
--- a/src/nimpb_buildpkg/plugin.nim
+++ b/src/nimpb_buildpkg/plugin.nim
@@ -134,6 +134,9 @@ proc isUnsigned(field: Field): bool =
result = true
else: result = false
+proc isBool(field: Field): bool =
+ result = field.ftype == google_protobuf_FieldDescriptorProtoType.TypeBool
+
proc isMapEntry(message: Message): bool =
result = message.mapEntry
@@ -916,7 +919,7 @@ iterator genMessageToJsonProc(msg: Message): string =
google_protobuf_FieldDescriptorProto_Type.TypeFloat:
result = &"toJson({v})"
of google_protobuf_FieldDescriptorProto_Type.TypeEnum:
- result = &"%(${v})"
+ result = &"toJson({v})"
else:
result = &"%{v}"
@@ -946,6 +949,9 @@ iterator genMessageFromJsonProc(msg: Message): string =
yield indent(&"result = new{msg.names}()", 4)
yield indent(&"var node: JsonNode", 4)
+ yield indent("if obj.kind != JObject:", 4)
+ yield indent("raise newException(JsonParseError, \"object expected\")", 8)
+
proc fieldFromJson(field: Field, n: string): string =
if isMessage(field):
result = &"parse{field.typeName}FromJson({n})"
@@ -970,7 +976,9 @@ iterator genMessageFromJsonProc(msg: Message): string =
yield indent("raise newException(ValueError, \"not an object\")", 12)
yield indent("for keyString, valueNode in node:", 8)
let keyField = mapKeyField(field)
- if isUnsigned(keyField):
+ if isBool(keyField):
+ yield indent("let key = parseBool(keyString)", 12)
+ elif isUnsigned(keyField):
yield indent(&"let key = {keyField.nimTypeName}(parseBiggestUInt(keyString))", 12)
elif isNumeric(keyField):
yield indent(&"let key = {keyField.nimTypeName}(parseBiggestInt(keyString))", 12)