diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-10 22:24:13 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-10 22:24:13 +0300 |
| commit | 92ff48a071cbdd894a0ec3147cf6623c0e394365 (patch) | |
| tree | 046aa065e30c1b3a42121c9129068e58593c548a | |
| parent | df3e98d4fe8c070c1e343cad865ac3b115ad3b3c (diff) | |
| download | nimpb_protoc-json-parsing.tar.gz nimpb_protoc-json-parsing.zip | |
JSON parsing fixesjson-parsing
| -rw-r--r-- | src/nimpb_buildpkg/plugin.nim | 12 |
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) |
