aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-04-27 19:24:27 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2018-04-27 19:24:27 +0300
commit15d74f0e3a53d04e96b22a83b9a94535cc8ef931 (patch)
treecafe052725f6c0674a8c3041f7b0f5de007eb01e
parent47eddf8d571a6cb292d945bc0a9ec8c5b67aae29 (diff)
downloadnimpb-15d74f0e3a53d04e96b22a83b9a94535cc8ef931.tar.gz
nimpb-15d74f0e3a53d04e96b22a83b9a94535cc8ef931.zip
Fix parsing oneofs from JSON
We should fail parsing if we see multiple oneof members in the same message. This is checked by conformance test suite.
-rw-r--r--nimpb/compiler/generator.nim10
1 files changed, 10 insertions, 0 deletions
diff --git a/nimpb/compiler/generator.nim b/nimpb/compiler/generator.nim
index 452e49e..beea943 100644
--- a/nimpb/compiler/generator.nim
+++ b/nimpb/compiler/generator.nim
@@ -1008,9 +1008,19 @@ iterator genMessageFromJsonProc(msg: Message): string =
elif field.ftype == google_protobuf_FieldDescriptorProto_Type.TypeBytes:
result = &"parseBytes({n})"
+ var oneOfsHandled: seq[string] = @[]
+
for field in msg.fields:
+ if field.oneof != nil:
+ if field.oneof.name notin oneOfsHandled:
+ yield indent(&"var {field.oneof.name}Done = false", 4)
+ add(oneOfsHandled, field.oneof.name)
yield indent(&"node = getJsonField(obj, \"{field.protoName}\", \"{field.jsonName}\")", 4)
yield indent(&"if node != nil and node.kind != JNull:", 4)
+ if field.oneof != nil:
+ yield indent(&"if {field.oneof.name}Done:", 8)
+ yield indent(&"raise newException(nimpb_json.ParseError, \"multiple values for oneof encountered\")", 12)
+ yield indent(&"{field.oneof.name}Done = true", 8)
if isMapEntry(field):
yield indent("if node.kind != JObject:", 8)
yield indent("raise newException(ValueError, \"not an object\")", 12)