diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-27 19:24:27 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-27 19:24:27 +0300 |
| commit | 15d74f0e3a53d04e96b22a83b9a94535cc8ef931 (patch) | |
| tree | cafe052725f6c0674a8c3041f7b0f5de007eb01e | |
| parent | 47eddf8d571a6cb292d945bc0a9ec8c5b67aae29 (diff) | |
| download | nimpb-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.nim | 10 |
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) |
