From c68904433166a8c44ed958a53942f207afb401e5 Mon Sep 17 00:00:00 2001 From: Oskari Timperi Date: Thu, 26 Apr 2018 23:45:37 +0300 Subject: Add initial JSON parsing support It's looking quite nice from conformance point of view: CONFORMANCE SUITE FAILED: 564 successes, 194 skipped, 0 expected failures, 38 unexpected failures. --- nimpb/compiler/generator.nim | 88 ++++- nimpb/json.nim | 109 ++++++ nimpb/wkt/any.nim | 3 + nimpb/wkt/any_pb.nim | 1 + nimpb/wkt/api_pb.nim | 86 ++++- nimpb/wkt/descriptor_pb.nim | 676 +++++++++++++++++++++++++++++++++- nimpb/wkt/duration.nim | 41 ++- nimpb/wkt/duration_pb.nim | 1 + nimpb/wkt/empty_pb.nim | 8 + nimpb/wkt/field_mask.nim | 10 + nimpb/wkt/field_mask_pb.nim | 1 + nimpb/wkt/source_context_pb.nim | 11 + nimpb/wkt/struct.nim | 44 +++ nimpb/wkt/struct_pb.nim | 1 + nimpb/wkt/timestamp.nim | 54 +++ nimpb/wkt/timestamp_pb.nim | 1 + nimpb/wkt/type_pb.nim | 143 ++++++- nimpb/wkt/wrappers.nim | 70 ++++ nimpb/wkt/wrappers_pb.nim | 1 + tests/conformance/conformance_nim.nim | 34 +- 20 files changed, 1359 insertions(+), 24 deletions(-) diff --git a/nimpb/compiler/generator.nim b/nimpb/compiler/generator.nim index bd543a7..809788e 100644 --- a/nimpb/compiler/generator.nim +++ b/nimpb/compiler/generator.nim @@ -32,6 +32,7 @@ type defaultValue: string message: Message jsonName: string + protoName: string Message = ref object names: Names @@ -146,6 +147,24 @@ proc isNumeric(field: Field): bool = result = true else: discard +proc isFloat(field: Field): bool = + case field.ftype + of google_protobuf_FieldDescriptorProtoType.TypeDouble: result = true + of google_protobuf_FieldDescriptorProtoType.TypeFloat: result = true + else: result = false + +proc isUnsigned(field: Field): bool = + case field.ftype + of google_protobuf_FieldDescriptorProtoType.TypeUInt64, + google_protobuf_FieldDescriptorProtoType.TypeFixed64, + google_protobuf_FieldDescriptorProtoType.TypeFixed32, + google_protobuf_FieldDescriptorProtoType.TypeUInt32: + 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 @@ -173,6 +192,11 @@ proc nimTypeName(field: Field): string = of google_protobuf_FieldDescriptorProtoType.TypeSInt32: result = "int32" of google_protobuf_FieldDescriptorProtoType.TypeSInt64: result = "int64" +proc mapKeyField(field: Field): Field = + for f in field.mapEntry.fields: + if f.name == "key": + return f + proc mapKeyType(field: Field): string = for f in field.mapEntry.fields: if f.name == "key": @@ -332,6 +356,7 @@ proc newField(file: ProtoFile, message: Message, desc: google_protobuf_FieldDesc new(result) result.name = toCamelCase(desc.name) + result.protoName = desc.name result.number = desc.number result.label = desc.label result.ftype = desc.ftype @@ -917,10 +942,9 @@ iterator genMessageToJsonProc(msg: Message): string = google_protobuf_FieldDescriptorProto_Type.TypeSFixed64, google_protobuf_FieldDescriptorProto_Type.TypeFixed64, google_protobuf_FieldDescriptorProto_Type.TypeDouble, - google_protobuf_FieldDescriptorProto_Type.TypeFloat: + google_protobuf_FieldDescriptorProto_Type.TypeFloat, + google_protobuf_FieldDescriptorProto_Type.TypeEnum: result = &"toJson({v})" - of google_protobuf_FieldDescriptorProto_Type.TypeEnum: - result = &"%(${v})" else: result = &"%{v}" @@ -945,6 +969,61 @@ iterator genMessageToJsonProc(msg: Message): string = yield "" +iterator genMessageFromJsonProc(msg: Message): string = + yield &"proc parse{msg.names}*(obj: JsonNode): {msg.names} =" + yield indent(&"result = new{msg.names}()", 4) + yield indent(&"var node: JsonNode", 4) + + yield indent("if obj.kind != JObject:", 4) + yield indent("raise newException(nimpb_json.ParseError, \"object expected\")", 8) + + proc fieldFromJson(field: Field, n: string): string = + if isMessage(field): + result = &"parse{field.typeName}({n})" + elif isEnum(field): + result = &"parseEnum[{field.typeName}]({n})" + elif isFloat(field): + result = &"parseFloat[{field.nimTypeName}]({n})" + elif field.ftype == google_protobuf_FieldDescriptorProto_Type.TypeBool: + result = &"parseBool({n})" + elif isNumeric(field): + result = &"parseInt[{field.nimTypeName}]({n})" + elif field.ftype == google_protobuf_FieldDescriptorProto_Type.TypeString: + result = &"parseString({n})" + elif field.ftype == google_protobuf_FieldDescriptorProto_Type.TypeBytes: + result = &"parseBytes({n})" + + for field in msg.fields: + yield indent(&"node = getJsonField(obj, \"{field.protoName}\", \"{field.jsonName}\")", 4) + yield indent(&"if node != nil and node.kind != JNull:", 4) + if isMapEntry(field): + yield indent("if node.kind != JObject:", 8) + yield indent("raise newException(ValueError, \"not an object\")", 12) + yield indent("for keyString, valueNode in node:", 8) + let keyField = mapKeyField(field) + 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) + elif keyField.ftype == google_protobuf_FieldDescriptorProto_Type.TypeString: + yield indent("let key = keyString", 12) + let valueField = mapValueField(field) + let parser = fieldFromJson(valueField, "valueNode") + yield indent(&"result.{field.name}[key] = {parser}", 12) + elif isRepeated(field): + let parser = fieldFromJson(field, "value") + yield indent("if node.kind != JArray:", 8) + yield indent("raise newException(ValueError, \"not an array\")", 12) + yield indent("for value in node:", 8) + yield indent(&"add{field.name}(result, {parser})", 12) + else: + let parser = fieldFromJson(field, "node") + yield indent(&"set{field.name}(result, {parser})", 8) + + yield "" + iterator genMessageProcForwards(msg: Message): string = # TODO: can we be more intelligent and only forward declare the minimum set # of procs? @@ -957,6 +1036,7 @@ iterator genMessageProcForwards(msg: Message): string = yield &"proc sizeOf{msg.names}*(message: {msg.names}): uint64" if shouldGenerateJsonProcs($msg.names): yield &"proc toJson*(message: {msg.names}): JsonNode" + yield &"proc parse{msg.names}*(obj: JsonNode): {msg.names}" else: let key = mapKeyField(msg) @@ -990,6 +1070,7 @@ iterator genProcs(msg: Message): string = if shouldGenerateJsonProcs($msg.names): for line in genMessageToJsonProc(msg): yield line + for line in genMessageFromJsonProc(msg): yield line yield &"proc serialize*(message: {msg.names}): string =" yield indent("let", 4) @@ -1059,6 +1140,7 @@ proc processFile(fdesc: google_protobuf_FileDescriptorProto, addLine(pbFile.data, "import base64") addLine(pbFile.data, "import intsets") addLine(pbFile.data, "import json") + addLine(pbFile.data, "import strutils") if hasMaps: addLine(pbFile.data, "import tables") addLine(pbFile.data, "export tables") diff --git a/nimpb/json.nim b/nimpb/json.nim index 881f41e..b611cdf 100644 --- a/nimpb/json.nim +++ b/nimpb/json.nim @@ -4,6 +4,11 @@ import std/json import strutils import times +import nimpb + +type + ParseError* = object of nimpb.ParseError + proc `%`*(u: uint32): JsonNode = newJFloat(float(u)) @@ -29,3 +34,107 @@ proc toJson*(value: int64): JsonNode = proc toJson*(value: uint64): JsonNode = newJString($value) + +proc toJson*[Enum: enum](value: Enum): JsonNode = + for v in Enum: + if value == v: + return %($v) + # The enum has a value that is not defined in the enum type + result = %(cast[int](value)) + +proc parseEnum*[T](node: JsonNode): T = + if node.kind == JString: + result = parseEnum[T](node.str) + elif node.kind == JInt: + result = cast[T](node.num) + else: + raise newException(ParseError, "invalid enum value") + +proc parseFloat*[T: float32|float64](node: JsonNode): T = + if node.kind == JString: + if node.str == "NaN": + return NaN + elif node.str == "Infinity": + return Inf + elif node.str == "-Infinity": + return NegInf + else: + result = T(parseFloat(node.str)) + else: + result = T(getFloat(node)) + + case classify(result) + of fcInf: raise newException(ParseError, "invalid floating point number") + of fcNegInf: raise newException(ParseError, "invalid floating point number") + of fcNan: raise newException(ParseError, "invalid floating point number") + else: discard + +proc parseInt*[T: int32|int64](node: JsonNode): T = + var big: BiggestInt + + if node.kind == JString: + try: + big = parseBiggestInt(node.str) + except Exception as exc: + raise newException(ParseError, exc.msg) + elif node.kind == JInt: + big = getBiggestInt(node) + elif node.kind == JFloat: + let f = getFloat(node) + if trunc(f) != f: + raise newException(ParseError, "not an integer") + big = BiggestInt(f) + else: + raise newException(ParseError, "not an integer") + + if big < BiggestInt(low(T)) or big > BiggestInt(high(T)): + raise newException(ParseError, "integer out of bounds") + + result = T(big) + +proc high(t: typedesc[uint64]): uint64 = 18446744073709551615'u64 + +proc parseInt*[T: uint32|uint64](node: JsonNode): T = + var big: BiggestUInt + + if node.kind == JString: + try: + big = parseBiggestUInt(node.str) + except Exception as exc: + raise newException(ParseError, exc.msg) + elif node.kind == JInt: + # raise newException(ParseError, "expected quoted") + big = BiggestUInt(getBiggestInt(node)) + elif node.kind == JFloat: + let f = getFloat(node) + if trunc(f) != f: + raise newException(ParseError, "not an integer") + big = BiggestUInt(f) + else: + raise newException(ParseError, "not an integer") + + if big > BiggestUInt(high(T)): + raise newException(ParseError, "integer out of bounds") + + result = T(big) + +proc parseString*(node: JsonNode): string = + if node.kind != JString: + raise newException(ParseError, "not a string") + result = node.str + +proc parseBytes*(node: JsonNode): seq[byte] = + if node.kind != JString: + raise newException(ParseError, "not a string") + result = cast[seq[byte]](base64.decode(node.str)) + +proc parseBool*(node: JsonNode): bool = + if node.kind != JBool: + raise newException(ParseError, "not a boolean") + result = getBool(node) + +proc getJsonField*(obj: JsonNode, name, jsonName: string): JsonNode = + if jsonName in obj: + result = obj[jsonName] + elif name in obj: + result = obj[name] diff --git a/nimpb/wkt/any.nim b/nimpb/wkt/any.nim index 1b67130..6cf40a7 100644 --- a/nimpb/wkt/any.nim +++ b/nimpb/wkt/any.nim @@ -47,3 +47,6 @@ proc toJson*(message: google_protobuf_Any): JsonNode = result = newJObject() result["typeUrl"] = %message.typeUrl result["value"] = %message.value + +proc parsegoogle_protobuf_Any*(node: JsonNode): google_protobuf_Any = + raise newException(nimpb_json.ParseError, "not supported yet") diff --git a/nimpb/wkt/any_pb.nim b/nimpb/wkt/any_pb.nim index 66626bf..4ba8423 100644 --- a/nimpb/wkt/any_pb.nim +++ b/nimpb/wkt/any_pb.nim @@ -3,6 +3,7 @@ import base64 import intsets import json +import strutils import nimpb/nimpb import nimpb/json as nimpb_json diff --git a/nimpb/wkt/api_pb.nim b/nimpb/wkt/api_pb.nim index 5f4faa4..dc6ef1c 100644 --- a/nimpb/wkt/api_pb.nim +++ b/nimpb/wkt/api_pb.nim @@ -3,6 +3,7 @@ import base64 import intsets import json +import strutils import nimpb/nimpb import nimpb/json as nimpb_json @@ -41,6 +42,7 @@ proc writegoogle_protobuf_Method*(stream: Stream, message: google_protobuf_Metho proc readgoogle_protobuf_Method*(stream: Stream): google_protobuf_Method proc sizeOfgoogle_protobuf_Method*(message: google_protobuf_Method): uint64 proc toJson*(message: google_protobuf_Method): JsonNode +proc parsegoogle_protobuf_Method*(obj: JsonNode): google_protobuf_Method proc newgoogle_protobuf_Mixin*(): google_protobuf_Mixin proc newgoogle_protobuf_Mixin*(data: string): google_protobuf_Mixin @@ -49,6 +51,7 @@ proc writegoogle_protobuf_Mixin*(stream: Stream, message: google_protobuf_Mixin) proc readgoogle_protobuf_Mixin*(stream: Stream): google_protobuf_Mixin proc sizeOfgoogle_protobuf_Mixin*(message: google_protobuf_Mixin): uint64 proc toJson*(message: google_protobuf_Mixin): JsonNode +proc parsegoogle_protobuf_Mixin*(obj: JsonNode): google_protobuf_Mixin proc newgoogle_protobuf_Api*(): google_protobuf_Api proc newgoogle_protobuf_Api*(data: string): google_protobuf_Api @@ -57,6 +60,7 @@ proc writegoogle_protobuf_Api*(stream: Stream, message: google_protobuf_Api) proc readgoogle_protobuf_Api*(stream: Stream): google_protobuf_Api proc sizeOfgoogle_protobuf_Api*(message: google_protobuf_Api): uint64 proc toJson*(message: google_protobuf_Api): JsonNode +proc parsegoogle_protobuf_Api*(obj: JsonNode): google_protobuf_Api proc newgoogle_protobuf_Method*(): google_protobuf_Method = new(result) @@ -284,7 +288,37 @@ proc toJson*(message: google_protobuf_Method): JsonNode = add(arr, toJson(value)) result["options"] = arr if hassyntax(message): - result["syntax"] = %($message.syntax) + result["syntax"] = toJson(message.syntax) + +proc parsegoogle_protobuf_Method*(obj: JsonNode): google_protobuf_Method = + result = newgoogle_protobuf_Method() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "request_type_url", "requestTypeUrl") + if node != nil and node.kind != JNull: + setrequestTypeUrl(result, parseString(node)) + node = getJsonField(obj, "request_streaming", "requestStreaming") + if node != nil and node.kind != JNull: + setrequestStreaming(result, parseBool(node)) + node = getJsonField(obj, "response_type_url", "responseTypeUrl") + if node != nil and node.kind != JNull: + setresponseTypeUrl(result, parseString(node)) + node = getJsonField(obj, "response_streaming", "responseStreaming") + if node != nil and node.kind != JNull: + setresponseStreaming(result, parseBool(node)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addoptions(result, parsegoogle_protobuf_Option(value)) + node = getJsonField(obj, "syntax", "syntax") + if node != nil and node.kind != JNull: + setsyntax(result, parseEnum[google_protobuf_Syntax](node)) proc serialize*(message: google_protobuf_Method): string = let @@ -383,6 +417,18 @@ proc toJson*(message: google_protobuf_Mixin): JsonNode = if hasroot(message): result["root"] = %message.root +proc parsegoogle_protobuf_Mixin*(obj: JsonNode): google_protobuf_Mixin = + result = newgoogle_protobuf_Mixin() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "root", "root") + if node != nil and node.kind != JNull: + setroot(result, parseString(node)) + proc serialize*(message: google_protobuf_Mixin): string = let ss = newStringStream() @@ -643,7 +689,43 @@ proc toJson*(message: google_protobuf_Api): JsonNode = add(arr, toJson(value)) result["mixins"] = arr if hassyntax(message): - result["syntax"] = %($message.syntax) + result["syntax"] = toJson(message.syntax) + +proc parsegoogle_protobuf_Api*(obj: JsonNode): google_protobuf_Api = + result = newgoogle_protobuf_Api() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "methods", "methods") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addmethods(result, parsegoogle_protobuf_Method(value)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addoptions(result, parsegoogle_protobuf_Option(value)) + node = getJsonField(obj, "version", "version") + if node != nil and node.kind != JNull: + setversion(result, parseString(node)) + node = getJsonField(obj, "source_context", "sourceContext") + if node != nil and node.kind != JNull: + setsourceContext(result, parsegoogle_protobuf_SourceContext(node)) + node = getJsonField(obj, "mixins", "mixins") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addmixins(result, parsegoogle_protobuf_Mixin(value)) + node = getJsonField(obj, "syntax", "syntax") + if node != nil and node.kind != JNull: + setsyntax(result, parseEnum[google_protobuf_Syntax](node)) proc serialize*(message: google_protobuf_Api): string = let diff --git a/nimpb/wkt/descriptor_pb.nim b/nimpb/wkt/descriptor_pb.nim index fd5fc6b..401b5b1 100644 --- a/nimpb/wkt/descriptor_pb.nim +++ b/nimpb/wkt/descriptor_pb.nim @@ -3,6 +3,7 @@ import base64 import intsets import json +import strutils import nimpb/nimpb import nimpb/json as nimpb_json @@ -231,6 +232,7 @@ proc writegoogle_protobuf_UninterpretedOption_NamePart*(stream: Stream, message: proc readgoogle_protobuf_UninterpretedOption_NamePart*(stream: Stream): google_protobuf_UninterpretedOption_NamePart proc sizeOfgoogle_protobuf_UninterpretedOption_NamePart*(message: google_protobuf_UninterpretedOption_NamePart): uint64 proc toJson*(message: google_protobuf_UninterpretedOption_NamePart): JsonNode +proc parsegoogle_protobuf_UninterpretedOption_NamePart*(obj: JsonNode): google_protobuf_UninterpretedOption_NamePart proc newgoogle_protobuf_UninterpretedOption*(): google_protobuf_UninterpretedOption proc newgoogle_protobuf_UninterpretedOption*(data: string): google_protobuf_UninterpretedOption @@ -239,6 +241,7 @@ proc writegoogle_protobuf_UninterpretedOption*(stream: Stream, message: google_p proc readgoogle_protobuf_UninterpretedOption*(stream: Stream): google_protobuf_UninterpretedOption proc sizeOfgoogle_protobuf_UninterpretedOption*(message: google_protobuf_UninterpretedOption): uint64 proc toJson*(message: google_protobuf_UninterpretedOption): JsonNode +proc parsegoogle_protobuf_UninterpretedOption*(obj: JsonNode): google_protobuf_UninterpretedOption proc newgoogle_protobuf_EnumValueOptions*(): google_protobuf_EnumValueOptions proc newgoogle_protobuf_EnumValueOptions*(data: string): google_protobuf_EnumValueOptions @@ -247,6 +250,7 @@ proc writegoogle_protobuf_EnumValueOptions*(stream: Stream, message: google_prot proc readgoogle_protobuf_EnumValueOptions*(stream: Stream): google_protobuf_EnumValueOptions proc sizeOfgoogle_protobuf_EnumValueOptions*(message: google_protobuf_EnumValueOptions): uint64 proc toJson*(message: google_protobuf_EnumValueOptions): JsonNode +proc parsegoogle_protobuf_EnumValueOptions*(obj: JsonNode): google_protobuf_EnumValueOptions proc newgoogle_protobuf_EnumValueDescriptorProto*(): google_protobuf_EnumValueDescriptorProto proc newgoogle_protobuf_EnumValueDescriptorProto*(data: string): google_protobuf_EnumValueDescriptorProto @@ -255,6 +259,7 @@ proc writegoogle_protobuf_EnumValueDescriptorProto*(stream: Stream, message: goo proc readgoogle_protobuf_EnumValueDescriptorProto*(stream: Stream): google_protobuf_EnumValueDescriptorProto proc sizeOfgoogle_protobuf_EnumValueDescriptorProto*(message: google_protobuf_EnumValueDescriptorProto): uint64 proc toJson*(message: google_protobuf_EnumValueDescriptorProto): JsonNode +proc parsegoogle_protobuf_EnumValueDescriptorProto*(obj: JsonNode): google_protobuf_EnumValueDescriptorProto proc newgoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(): google_protobuf_EnumDescriptorProto_EnumReservedRange proc newgoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(data: string): google_protobuf_EnumDescriptorProto_EnumReservedRange @@ -263,6 +268,7 @@ proc writegoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(stream: Stream, proc readgoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(stream: Stream): google_protobuf_EnumDescriptorProto_EnumReservedRange proc sizeOfgoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange): uint64 proc toJson*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange): JsonNode +proc parsegoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(obj: JsonNode): google_protobuf_EnumDescriptorProto_EnumReservedRange proc newgoogle_protobuf_EnumOptions*(): google_protobuf_EnumOptions proc newgoogle_protobuf_EnumOptions*(data: string): google_protobuf_EnumOptions @@ -271,6 +277,7 @@ proc writegoogle_protobuf_EnumOptions*(stream: Stream, message: google_protobuf_ proc readgoogle_protobuf_EnumOptions*(stream: Stream): google_protobuf_EnumOptions proc sizeOfgoogle_protobuf_EnumOptions*(message: google_protobuf_EnumOptions): uint64 proc toJson*(message: google_protobuf_EnumOptions): JsonNode +proc parsegoogle_protobuf_EnumOptions*(obj: JsonNode): google_protobuf_EnumOptions proc newgoogle_protobuf_EnumDescriptorProto*(): google_protobuf_EnumDescriptorProto proc newgoogle_protobuf_EnumDescriptorProto*(data: string): google_protobuf_EnumDescriptorProto @@ -279,6 +286,7 @@ proc writegoogle_protobuf_EnumDescriptorProto*(stream: Stream, message: google_p proc readgoogle_protobuf_EnumDescriptorProto*(stream: Stream): google_protobuf_EnumDescriptorProto proc sizeOfgoogle_protobuf_EnumDescriptorProto*(message: google_protobuf_EnumDescriptorProto): uint64 proc toJson*(message: google_protobuf_EnumDescriptorProto): JsonNode +proc parsegoogle_protobuf_EnumDescriptorProto*(obj: JsonNode): google_protobuf_EnumDescriptorProto proc newgoogle_protobuf_ExtensionRangeOptions*(): google_protobuf_ExtensionRangeOptions proc newgoogle_protobuf_ExtensionRangeOptions*(data: string): google_protobuf_ExtensionRangeOptions @@ -287,6 +295,7 @@ proc writegoogle_protobuf_ExtensionRangeOptions*(stream: Stream, message: google proc readgoogle_protobuf_ExtensionRangeOptions*(stream: Stream): google_protobuf_ExtensionRangeOptions proc sizeOfgoogle_protobuf_ExtensionRangeOptions*(message: google_protobuf_ExtensionRangeOptions): uint64 proc toJson*(message: google_protobuf_ExtensionRangeOptions): JsonNode +proc parsegoogle_protobuf_ExtensionRangeOptions*(obj: JsonNode): google_protobuf_ExtensionRangeOptions proc newgoogle_protobuf_SourceCodeInfo_Location*(): google_protobuf_SourceCodeInfo_Location proc newgoogle_protobuf_SourceCodeInfo_Location*(data: string): google_protobuf_SourceCodeInfo_Location @@ -295,6 +304,7 @@ proc writegoogle_protobuf_SourceCodeInfo_Location*(stream: Stream, message: goog proc readgoogle_protobuf_SourceCodeInfo_Location*(stream: Stream): google_protobuf_SourceCodeInfo_Location proc sizeOfgoogle_protobuf_SourceCodeInfo_Location*(message: google_protobuf_SourceCodeInfo_Location): uint64 proc toJson*(message: google_protobuf_SourceCodeInfo_Location): JsonNode +proc parsegoogle_protobuf_SourceCodeInfo_Location*(obj: JsonNode): google_protobuf_SourceCodeInfo_Location proc newgoogle_protobuf_SourceCodeInfo*(): google_protobuf_SourceCodeInfo proc newgoogle_protobuf_SourceCodeInfo*(data: string): google_protobuf_SourceCodeInfo @@ -303,6 +313,7 @@ proc writegoogle_protobuf_SourceCodeInfo*(stream: Stream, message: google_protob proc readgoogle_protobuf_SourceCodeInfo*(stream: Stream): google_protobuf_SourceCodeInfo proc sizeOfgoogle_protobuf_SourceCodeInfo*(message: google_protobuf_SourceCodeInfo): uint64 proc toJson*(message: google_protobuf_SourceCodeInfo): JsonNode +proc parsegoogle_protobuf_SourceCodeInfo*(obj: JsonNode): google_protobuf_SourceCodeInfo proc newgoogle_protobuf_FieldOptions*(): google_protobuf_FieldOptions proc newgoogle_protobuf_FieldOptions*(data: string): google_protobuf_FieldOptions @@ -311,6 +322,7 @@ proc writegoogle_protobuf_FieldOptions*(stream: Stream, message: google_protobuf proc readgoogle_protobuf_FieldOptions*(stream: Stream): google_protobuf_FieldOptions proc sizeOfgoogle_protobuf_FieldOptions*(message: google_protobuf_FieldOptions): uint64 proc toJson*(message: google_protobuf_FieldOptions): JsonNode +proc parsegoogle_protobuf_FieldOptions*(obj: JsonNode): google_protobuf_FieldOptions proc newgoogle_protobuf_FieldDescriptorProto*(): google_protobuf_FieldDescriptorProto proc newgoogle_protobuf_FieldDescriptorProto*(data: string): google_protobuf_FieldDescriptorProto @@ -319,6 +331,7 @@ proc writegoogle_protobuf_FieldDescriptorProto*(stream: Stream, message: google_ proc readgoogle_protobuf_FieldDescriptorProto*(stream: Stream): google_protobuf_FieldDescriptorProto proc sizeOfgoogle_protobuf_FieldDescriptorProto*(message: google_protobuf_FieldDescriptorProto): uint64 proc toJson*(message: google_protobuf_FieldDescriptorProto): JsonNode +proc parsegoogle_protobuf_FieldDescriptorProto*(obj: JsonNode): google_protobuf_FieldDescriptorProto proc newgoogle_protobuf_DescriptorProto_ExtensionRange*(): google_protobuf_DescriptorProto_ExtensionRange proc newgoogle_protobuf_DescriptorProto_ExtensionRange*(data: string): google_protobuf_DescriptorProto_ExtensionRange @@ -327,6 +340,7 @@ proc writegoogle_protobuf_DescriptorProto_ExtensionRange*(stream: Stream, messag proc readgoogle_protobuf_DescriptorProto_ExtensionRange*(stream: Stream): google_protobuf_DescriptorProto_ExtensionRange proc sizeOfgoogle_protobuf_DescriptorProto_ExtensionRange*(message: google_protobuf_DescriptorProto_ExtensionRange): uint64 proc toJson*(message: google_protobuf_DescriptorProto_ExtensionRange): JsonNode +proc parsegoogle_protobuf_DescriptorProto_ExtensionRange*(obj: JsonNode): google_protobuf_DescriptorProto_ExtensionRange proc newgoogle_protobuf_MessageOptions*(): google_protobuf_MessageOptions proc newgoogle_protobuf_MessageOptions*(data: string): google_protobuf_MessageOptions @@ -335,6 +349,7 @@ proc writegoogle_protobuf_MessageOptions*(stream: Stream, message: google_protob proc readgoogle_protobuf_MessageOptions*(stream: Stream): google_protobuf_MessageOptions proc sizeOfgoogle_protobuf_MessageOptions*(message: google_protobuf_MessageOptions): uint64 proc toJson*(message: google_protobuf_MessageOptions): JsonNode +proc parsegoogle_protobuf_MessageOptions*(obj: JsonNode): google_protobuf_MessageOptions proc newgoogle_protobuf_OneofOptions*(): google_protobuf_OneofOptions proc newgoogle_protobuf_OneofOptions*(data: string): google_protobuf_OneofOptions @@ -343,6 +358,7 @@ proc writegoogle_protobuf_OneofOptions*(stream: Stream, message: google_protobuf proc readgoogle_protobuf_OneofOptions*(stream: Stream): google_protobuf_OneofOptions proc sizeOfgoogle_protobuf_OneofOptions*(message: google_protobuf_OneofOptions): uint64 proc toJson*(message: google_protobuf_OneofOptions): JsonNode +proc parsegoogle_protobuf_OneofOptions*(obj: JsonNode): google_protobuf_OneofOptions proc newgoogle_protobuf_OneofDescriptorProto*(): google_protobuf_OneofDescriptorProto proc newgoogle_protobuf_OneofDescriptorProto*(data: string): google_protobuf_OneofDescriptorProto @@ -351,6 +367,7 @@ proc writegoogle_protobuf_OneofDescriptorProto*(stream: Stream, message: google_ proc readgoogle_protobuf_OneofDescriptorProto*(stream: Stream): google_protobuf_OneofDescriptorProto proc sizeOfgoogle_protobuf_OneofDescriptorProto*(message: google_protobuf_OneofDescriptorProto): uint64 proc toJson*(message: google_protobuf_OneofDescriptorProto): JsonNode +proc parsegoogle_protobuf_OneofDescriptorProto*(obj: JsonNode): google_protobuf_OneofDescriptorProto proc newgoogle_protobuf_DescriptorProto_ReservedRange*(): google_protobuf_DescriptorProto_ReservedRange proc newgoogle_protobuf_DescriptorProto_ReservedRange*(data: string): google_protobuf_DescriptorProto_ReservedRange @@ -359,6 +376,7 @@ proc writegoogle_protobuf_DescriptorProto_ReservedRange*(stream: Stream, message proc readgoogle_protobuf_DescriptorProto_ReservedRange*(stream: Stream): google_protobuf_DescriptorProto_ReservedRange proc sizeOfgoogle_protobuf_DescriptorProto_ReservedRange*(message: google_protobuf_DescriptorProto_ReservedRange): uint64 proc toJson*(message: google_protobuf_DescriptorProto_ReservedRange): JsonNode +proc parsegoogle_protobuf_DescriptorProto_ReservedRange*(obj: JsonNode): google_protobuf_DescriptorProto_ReservedRange proc newgoogle_protobuf_DescriptorProto*(): google_protobuf_DescriptorProto proc newgoogle_protobuf_DescriptorProto*(data: string): google_protobuf_DescriptorProto @@ -367,6 +385,7 @@ proc writegoogle_protobuf_DescriptorProto*(stream: Stream, message: google_proto proc readgoogle_protobuf_DescriptorProto*(stream: Stream): google_protobuf_DescriptorProto proc sizeOfgoogle_protobuf_DescriptorProto*(message: google_protobuf_DescriptorProto): uint64 proc toJson*(message: google_protobuf_DescriptorProto): JsonNode +proc parsegoogle_protobuf_DescriptorProto*(obj: JsonNode): google_protobuf_DescriptorProto proc newgoogle_protobuf_FileOptions*(): google_protobuf_FileOptions proc newgoogle_protobuf_FileOptions*(data: string): google_protobuf_FileOptions @@ -375,6 +394,7 @@ proc writegoogle_protobuf_FileOptions*(stream: Stream, message: google_protobuf_ proc readgoogle_protobuf_FileOptions*(stream: Stream): google_protobuf_FileOptions proc sizeOfgoogle_protobuf_FileOptions*(message: google_protobuf_FileOptions): uint64 proc toJson*(message: google_protobuf_FileOptions): JsonNode +proc parsegoogle_protobuf_FileOptions*(obj: JsonNode): google_protobuf_FileOptions proc newgoogle_protobuf_ServiceOptions*(): google_protobuf_ServiceOptions proc newgoogle_protobuf_ServiceOptions*(data: string): google_protobuf_ServiceOptions @@ -383,6 +403,7 @@ proc writegoogle_protobuf_ServiceOptions*(stream: Stream, message: google_protob proc readgoogle_protobuf_ServiceOptions*(stream: Stream): google_protobuf_ServiceOptions proc sizeOfgoogle_protobuf_ServiceOptions*(message: google_protobuf_ServiceOptions): uint64 proc toJson*(message: google_protobuf_ServiceOptions): JsonNode +proc parsegoogle_protobuf_ServiceOptions*(obj: JsonNode): google_protobuf_ServiceOptions proc newgoogle_protobuf_MethodOptions*(): google_protobuf_MethodOptions proc newgoogle_protobuf_MethodOptions*(data: string): google_protobuf_MethodOptions @@ -391,6 +412,7 @@ proc writegoogle_protobuf_MethodOptions*(stream: Stream, message: google_protobu proc readgoogle_protobuf_MethodOptions*(stream: Stream): google_protobuf_MethodOptions proc sizeOfgoogle_protobuf_MethodOptions*(message: google_protobuf_MethodOptions): uint64 proc toJson*(message: google_protobuf_MethodOptions): JsonNode +proc parsegoogle_protobuf_MethodOptions*(obj: JsonNode): google_protobuf_MethodOptions proc newgoogle_protobuf_MethodDescriptorProto*(): google_protobuf_MethodDescriptorProto proc newgoogle_protobuf_MethodDescriptorProto*(data: string): google_protobuf_MethodDescriptorProto @@ -399,6 +421,7 @@ proc writegoogle_protobuf_MethodDescriptorProto*(stream: Stream, message: google proc readgoogle_protobuf_MethodDescriptorProto*(stream: Stream): google_protobuf_MethodDescriptorProto proc sizeOfgoogle_protobuf_MethodDescriptorProto*(message: google_protobuf_MethodDescriptorProto): uint64 proc toJson*(message: google_protobuf_MethodDescriptorProto): JsonNode +proc parsegoogle_protobuf_MethodDescriptorProto*(obj: JsonNode): google_protobuf_MethodDescriptorProto proc newgoogle_protobuf_ServiceDescriptorProto*(): google_protobuf_ServiceDescriptorProto proc newgoogle_protobuf_ServiceDescriptorProto*(data: string): google_protobuf_ServiceDescriptorProto @@ -407,6 +430,7 @@ proc writegoogle_protobuf_ServiceDescriptorProto*(stream: Stream, message: googl proc readgoogle_protobuf_ServiceDescriptorProto*(stream: Stream): google_protobuf_ServiceDescriptorProto proc sizeOfgoogle_protobuf_ServiceDescriptorProto*(message: google_protobuf_ServiceDescriptorProto): uint64 proc toJson*(message: google_protobuf_ServiceDescriptorProto): JsonNode +proc parsegoogle_protobuf_ServiceDescriptorProto*(obj: JsonNode): google_protobuf_ServiceDescriptorProto proc newgoogle_protobuf_FileDescriptorProto*(): google_protobuf_FileDescriptorProto proc newgoogle_protobuf_FileDescriptorProto*(data: string): google_protobuf_FileDescriptorProto @@ -415,6 +439,7 @@ proc writegoogle_protobuf_FileDescriptorProto*(stream: Stream, message: google_p proc readgoogle_protobuf_FileDescriptorProto*(stream: Stream): google_protobuf_FileDescriptorProto proc sizeOfgoogle_protobuf_FileDescriptorProto*(message: google_protobuf_FileDescriptorProto): uint64 proc toJson*(message: google_protobuf_FileDescriptorProto): JsonNode +proc parsegoogle_protobuf_FileDescriptorProto*(obj: JsonNode): google_protobuf_FileDescriptorProto proc newgoogle_protobuf_FileDescriptorSet*(): google_protobuf_FileDescriptorSet proc newgoogle_protobuf_FileDescriptorSet*(data: string): google_protobuf_FileDescriptorSet @@ -423,6 +448,7 @@ proc writegoogle_protobuf_FileDescriptorSet*(stream: Stream, message: google_pro proc readgoogle_protobuf_FileDescriptorSet*(stream: Stream): google_protobuf_FileDescriptorSet proc sizeOfgoogle_protobuf_FileDescriptorSet*(message: google_protobuf_FileDescriptorSet): uint64 proc toJson*(message: google_protobuf_FileDescriptorSet): JsonNode +proc parsegoogle_protobuf_FileDescriptorSet*(obj: JsonNode): google_protobuf_FileDescriptorSet proc newgoogle_protobuf_GeneratedCodeInfo_Annotation*(): google_protobuf_GeneratedCodeInfo_Annotation proc newgoogle_protobuf_GeneratedCodeInfo_Annotation*(data: string): google_protobuf_GeneratedCodeInfo_Annotation @@ -431,6 +457,7 @@ proc writegoogle_protobuf_GeneratedCodeInfo_Annotation*(stream: Stream, message: proc readgoogle_protobuf_GeneratedCodeInfo_Annotation*(stream: Stream): google_protobuf_GeneratedCodeInfo_Annotation proc sizeOfgoogle_protobuf_GeneratedCodeInfo_Annotation*(message: google_protobuf_GeneratedCodeInfo_Annotation): uint64 proc toJson*(message: google_protobuf_GeneratedCodeInfo_Annotation): JsonNode +proc parsegoogle_protobuf_GeneratedCodeInfo_Annotation*(obj: JsonNode): google_protobuf_GeneratedCodeInfo_Annotation proc newgoogle_protobuf_GeneratedCodeInfo*(): google_protobuf_GeneratedCodeInfo proc newgoogle_protobuf_GeneratedCodeInfo*(data: string): google_protobuf_GeneratedCodeInfo @@ -439,6 +466,7 @@ proc writegoogle_protobuf_GeneratedCodeInfo*(stream: Stream, message: google_pro proc readgoogle_protobuf_GeneratedCodeInfo*(stream: Stream): google_protobuf_GeneratedCodeInfo proc sizeOfgoogle_protobuf_GeneratedCodeInfo*(message: google_protobuf_GeneratedCodeInfo): uint64 proc toJson*(message: google_protobuf_GeneratedCodeInfo): JsonNode +proc parsegoogle_protobuf_GeneratedCodeInfo*(obj: JsonNode): google_protobuf_GeneratedCodeInfo proc newgoogle_protobuf_UninterpretedOption_NamePart*(): google_protobuf_UninterpretedOption_NamePart = new(result) @@ -520,6 +548,18 @@ proc toJson*(message: google_protobuf_UninterpretedOption_NamePart): JsonNode = if hasisExtension(message): result["isExtension"] = %message.isExtension +proc parsegoogle_protobuf_UninterpretedOption_NamePart*(obj: JsonNode): google_protobuf_UninterpretedOption_NamePart = + result = newgoogle_protobuf_UninterpretedOption_NamePart() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name_part", "namePart") + if node != nil and node.kind != JNull: + setnamePart(result, parseString(node)) + node = getJsonField(obj, "is_extension", "isExtension") + if node != nil and node.kind != JNull: + setisExtension(result, parseBool(node)) + proc serialize*(message: google_protobuf_UninterpretedOption_NamePart): string = let ss = newStringStream() @@ -765,6 +805,36 @@ proc toJson*(message: google_protobuf_UninterpretedOption): JsonNode = if hasaggregateValue(message): result["aggregateValue"] = %message.aggregateValue +proc parsegoogle_protobuf_UninterpretedOption*(obj: JsonNode): google_protobuf_UninterpretedOption = + result = newgoogle_protobuf_UninterpretedOption() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addname(result, parsegoogle_protobuf_UninterpretedOption_NamePart(value)) + node = getJsonField(obj, "identifier_value", "identifierValue") + if node != nil and node.kind != JNull: + setidentifierValue(result, parseString(node)) + node = getJsonField(obj, "positive_int_value", "positiveIntValue") + if node != nil and node.kind != JNull: + setpositiveIntValue(result, parseInt[uint64](node)) + node = getJsonField(obj, "negative_int_value", "negativeIntValue") + if node != nil and node.kind != JNull: + setnegativeIntValue(result, parseInt[int64](node)) + node = getJsonField(obj, "double_value", "doubleValue") + if node != nil and node.kind != JNull: + setdoubleValue(result, parseFloat[float64](node)) + node = getJsonField(obj, "string_value", "stringValue") + if node != nil and node.kind != JNull: + setstringValue(result, parseBytes(node)) + node = getJsonField(obj, "aggregate_value", "aggregateValue") + if node != nil and node.kind != JNull: + setaggregateValue(result, parseString(node)) + proc serialize*(message: google_protobuf_UninterpretedOption): string = let ss = newStringStream() @@ -870,6 +940,21 @@ proc toJson*(message: google_protobuf_EnumValueOptions): JsonNode = add(arr, toJson(value)) result["uninterpretedOption"] = arr +proc parsegoogle_protobuf_EnumValueOptions*(obj: JsonNode): google_protobuf_EnumValueOptions = + result = newgoogle_protobuf_EnumValueOptions() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "deprecated", "deprecated") + if node != nil and node.kind != JNull: + setdeprecated(result, parseBool(node)) + node = getJsonField(obj, "uninterpreted_option", "uninterpretedOption") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + adduninterpretedOption(result, parsegoogle_protobuf_UninterpretedOption(value)) + proc serialize*(message: google_protobuf_EnumValueOptions): string = let ss = newStringStream() @@ -996,6 +1081,21 @@ proc toJson*(message: google_protobuf_EnumValueDescriptorProto): JsonNode = if hasoptions(message): result["options"] = toJson(message.options) +proc parsegoogle_protobuf_EnumValueDescriptorProto*(obj: JsonNode): google_protobuf_EnumValueDescriptorProto = + result = newgoogle_protobuf_EnumValueDescriptorProto() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "number", "number") + if node != nil and node.kind != JNull: + setnumber(result, parseInt[int32](node)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + setoptions(result, parsegoogle_protobuf_EnumValueOptions(node)) + proc serialize*(message: google_protobuf_EnumValueDescriptorProto): string = let ss = newStringStream() @@ -1093,6 +1193,18 @@ proc toJson*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange): Js if hasfend(message): result["end"] = %message.fend +proc parsegoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(obj: JsonNode): google_protobuf_EnumDescriptorProto_EnumReservedRange = + result = newgoogle_protobuf_EnumDescriptorProto_EnumReservedRange() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "start", "start") + if node != nil and node.kind != JNull: + setstart(result, parseInt[int32](node)) + node = getJsonField(obj, "end", "end") + if node != nil and node.kind != JNull: + setfend(result, parseInt[int32](node)) + proc serialize*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange): string = let ss = newStringStream() @@ -1226,6 +1338,24 @@ proc toJson*(message: google_protobuf_EnumOptions): JsonNode = add(arr, toJson(value)) result["uninterpretedOption"] = arr +proc parsegoogle_protobuf_EnumOptions*(obj: JsonNode): google_protobuf_EnumOptions = + result = newgoogle_protobuf_EnumOptions() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "allow_alias", "allowAlias") + if node != nil and node.kind != JNull: + setallowAlias(result, parseBool(node)) + node = getJsonField(obj, "deprecated", "deprecated") + if node != nil and node.kind != JNull: + setdeprecated(result, parseBool(node)) + node = getJsonField(obj, "uninterpreted_option", "uninterpretedOption") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + adduninterpretedOption(result, parsegoogle_protobuf_UninterpretedOption(value)) + proc serialize*(message: google_protobuf_EnumOptions): string = let ss = newStringStream() @@ -1431,6 +1561,36 @@ proc toJson*(message: google_protobuf_EnumDescriptorProto): JsonNode = add(arr, %value) result["reservedName"] = arr +proc parsegoogle_protobuf_EnumDescriptorProto*(obj: JsonNode): google_protobuf_EnumDescriptorProto = + result = newgoogle_protobuf_EnumDescriptorProto() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "value", "value") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addvalue(result, parsegoogle_protobuf_EnumValueDescriptorProto(value)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + setoptions(result, parsegoogle_protobuf_EnumOptions(node)) + node = getJsonField(obj, "reserved_range", "reservedRange") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addreservedRange(result, parsegoogle_protobuf_EnumDescriptorProto_EnumReservedRange(value)) + node = getJsonField(obj, "reserved_name", "reservedName") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addreservedName(result, parseString(value)) + proc serialize*(message: google_protobuf_EnumDescriptorProto): string = let ss = newStringStream() @@ -1508,6 +1668,18 @@ proc toJson*(message: google_protobuf_ExtensionRangeOptions): JsonNode = add(arr, toJson(value)) result["uninterpretedOption"] = arr +proc parsegoogle_protobuf_ExtensionRangeOptions*(obj: JsonNode): google_protobuf_ExtensionRangeOptions = + result = newgoogle_protobuf_ExtensionRangeOptions() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "uninterpreted_option", "uninterpretedOption") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + adduninterpretedOption(result, parsegoogle_protobuf_UninterpretedOption(value)) + proc serialize*(message: google_protobuf_ExtensionRangeOptions): string = let ss = newStringStream() @@ -1738,6 +1910,36 @@ proc toJson*(message: google_protobuf_SourceCodeInfo_Location): JsonNode = add(arr, %value) result["leadingDetachedComments"] = arr +proc parsegoogle_protobuf_SourceCodeInfo_Location*(obj: JsonNode): google_protobuf_SourceCodeInfo_Location = + result = newgoogle_protobuf_SourceCodeInfo_Location() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "path", "path") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addpath(result, parseInt[int32](value)) + node = getJsonField(obj, "span", "span") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addspan(result, parseInt[int32](value)) + node = getJsonField(obj, "leading_comments", "leadingComments") + if node != nil and node.kind != JNull: + setleadingComments(result, parseString(node)) + node = getJsonField(obj, "trailing_comments", "trailingComments") + if node != nil and node.kind != JNull: + settrailingComments(result, parseString(node)) + node = getJsonField(obj, "leading_detached_comments", "leadingDetachedComments") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addleadingDetachedComments(result, parseString(value)) + proc serialize*(message: google_protobuf_SourceCodeInfo_Location): string = let ss = newStringStream() @@ -1815,6 +2017,18 @@ proc toJson*(message: google_protobuf_SourceCodeInfo): JsonNode = add(arr, toJson(value)) result["location"] = arr +proc parsegoogle_protobuf_SourceCodeInfo*(obj: JsonNode): google_protobuf_SourceCodeInfo = + result = newgoogle_protobuf_SourceCodeInfo() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "location", "location") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addlocation(result, parsegoogle_protobuf_SourceCodeInfo_Location(value)) + proc serialize*(message: google_protobuf_SourceCodeInfo): string = let ss = newStringStream() @@ -2043,11 +2257,11 @@ proc readgoogle_protobuf_FieldOptions*(stream: Stream): google_protobuf_FieldOpt proc toJson*(message: google_protobuf_FieldOptions): JsonNode = result = newJObject() if hasctype(message): - result["ctype"] = %($message.ctype) + result["ctype"] = toJson(message.ctype) if haspacked(message): result["packed"] = %message.packed if hasjstype(message): - result["jstype"] = %($message.jstype) + result["jstype"] = toJson(message.jstype) if haslazy(message): result["lazy"] = %message.lazy if hasdeprecated(message): @@ -2060,6 +2274,36 @@ proc toJson*(message: google_protobuf_FieldOptions): JsonNode = add(arr, toJson(value)) result["uninterpretedOption"] = arr +proc parsegoogle_protobuf_FieldOptions*(obj: JsonNode): google_protobuf_FieldOptions = + result = newgoogle_protobuf_FieldOptions() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "ctype", "ctype") + if node != nil and node.kind != JNull: + setctype(result, parseEnum[google_protobuf_FieldOptions_CType](node)) + node = getJsonField(obj, "packed", "packed") + if node != nil and node.kind != JNull: + setpacked(result, parseBool(node)) + node = getJsonField(obj, "jstype", "jstype") + if node != nil and node.kind != JNull: + setjstype(result, parseEnum[google_protobuf_FieldOptions_JSType](node)) + node = getJsonField(obj, "lazy", "lazy") + if node != nil and node.kind != JNull: + setlazy(result, parseBool(node)) + node = getJsonField(obj, "deprecated", "deprecated") + if node != nil and node.kind != JNull: + setdeprecated(result, parseBool(node)) + node = getJsonField(obj, "weak", "weak") + if node != nil and node.kind != JNull: + setweak(result, parseBool(node)) + node = getJsonField(obj, "uninterpreted_option", "uninterpretedOption") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + adduninterpretedOption(result, parsegoogle_protobuf_UninterpretedOption(value)) + proc serialize*(message: google_protobuf_FieldOptions): string = let ss = newStringStream() @@ -2366,9 +2610,9 @@ proc toJson*(message: google_protobuf_FieldDescriptorProto): JsonNode = if hasnumber(message): result["number"] = %message.number if haslabel(message): - result["label"] = %($message.label) + result["label"] = toJson(message.label) if hasftype(message): - result["type"] = %($message.ftype) + result["type"] = toJson(message.ftype) if hastypeName(message): result["typeName"] = %message.typeName if hasextendee(message): @@ -2382,6 +2626,42 @@ proc toJson*(message: google_protobuf_FieldDescriptorProto): JsonNode = if hasoptions(message): result["options"] = toJson(message.options) +proc parsegoogle_protobuf_FieldDescriptorProto*(obj: JsonNode): google_protobuf_FieldDescriptorProto = + result = newgoogle_protobuf_FieldDescriptorProto() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "number", "number") + if node != nil and node.kind != JNull: + setnumber(result, parseInt[int32](node)) + node = getJsonField(obj, "label", "label") + if node != nil and node.kind != JNull: + setlabel(result, parseEnum[google_protobuf_FieldDescriptorProto_Label](node)) + node = getJsonField(obj, "type", "type") + if node != nil and node.kind != JNull: + setftype(result, parseEnum[google_protobuf_FieldDescriptorProto_Type](node)) + node = getJsonField(obj, "type_name", "typeName") + if node != nil and node.kind != JNull: + settypeName(result, parseString(node)) + node = getJsonField(obj, "extendee", "extendee") + if node != nil and node.kind != JNull: + setextendee(result, parseString(node)) + node = getJsonField(obj, "default_value", "defaultValue") + if node != nil and node.kind != JNull: + setdefaultValue(result, parseString(node)) + node = getJsonField(obj, "oneof_index", "oneofIndex") + if node != nil and node.kind != JNull: + setoneofIndex(result, parseInt[int32](node)) + node = getJsonField(obj, "json_name", "jsonName") + if node != nil and node.kind != JNull: + setjsonName(result, parseString(node)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + setoptions(result, parsegoogle_protobuf_FieldOptions(node)) + proc serialize*(message: google_protobuf_FieldDescriptorProto): string = let ss = newStringStream() @@ -2508,6 +2788,21 @@ proc toJson*(message: google_protobuf_DescriptorProto_ExtensionRange): JsonNode if hasoptions(message): result["options"] = toJson(message.options) +proc parsegoogle_protobuf_DescriptorProto_ExtensionRange*(obj: JsonNode): google_protobuf_DescriptorProto_ExtensionRange = + result = newgoogle_protobuf_DescriptorProto_ExtensionRange() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "start", "start") + if node != nil and node.kind != JNull: + setstart(result, parseInt[int32](node)) + node = getJsonField(obj, "end", "end") + if node != nil and node.kind != JNull: + setfend(result, parseInt[int32](node)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + setoptions(result, parsegoogle_protobuf_ExtensionRangeOptions(node)) + proc serialize*(message: google_protobuf_DescriptorProto_ExtensionRange): string = let ss = newStringStream() @@ -2697,6 +2992,30 @@ proc toJson*(message: google_protobuf_MessageOptions): JsonNode = add(arr, toJson(value)) result["uninterpretedOption"] = arr +proc parsegoogle_protobuf_MessageOptions*(obj: JsonNode): google_protobuf_MessageOptions = + result = newgoogle_protobuf_MessageOptions() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "message_set_wire_format", "messageSetWireFormat") + if node != nil and node.kind != JNull: + setmessageSetWireFormat(result, parseBool(node)) + node = getJsonField(obj, "no_standard_descriptor_accessor", "noStandardDescriptorAccessor") + if node != nil and node.kind != JNull: + setnoStandardDescriptorAccessor(result, parseBool(node)) + node = getJsonField(obj, "deprecated", "deprecated") + if node != nil and node.kind != JNull: + setdeprecated(result, parseBool(node)) + node = getJsonField(obj, "map_entry", "mapEntry") + if node != nil and node.kind != JNull: + setmapEntry(result, parseBool(node)) + node = getJsonField(obj, "uninterpreted_option", "uninterpretedOption") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + adduninterpretedOption(result, parsegoogle_protobuf_UninterpretedOption(value)) + proc serialize*(message: google_protobuf_MessageOptions): string = let ss = newStringStream() @@ -2774,6 +3093,18 @@ proc toJson*(message: google_protobuf_OneofOptions): JsonNode = add(arr, toJson(value)) result["uninterpretedOption"] = arr +proc parsegoogle_protobuf_OneofOptions*(obj: JsonNode): google_protobuf_OneofOptions = + result = newgoogle_protobuf_OneofOptions() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "uninterpreted_option", "uninterpretedOption") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + adduninterpretedOption(result, parsegoogle_protobuf_UninterpretedOption(value)) + proc serialize*(message: google_protobuf_OneofOptions): string = let ss = newStringStream() @@ -2872,6 +3203,18 @@ proc toJson*(message: google_protobuf_OneofDescriptorProto): JsonNode = if hasoptions(message): result["options"] = toJson(message.options) +proc parsegoogle_protobuf_OneofDescriptorProto*(obj: JsonNode): google_protobuf_OneofDescriptorProto = + result = newgoogle_protobuf_OneofDescriptorProto() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + setoptions(result, parsegoogle_protobuf_OneofOptions(node)) + proc serialize*(message: google_protobuf_OneofDescriptorProto): string = let ss = newStringStream() @@ -2969,6 +3312,18 @@ proc toJson*(message: google_protobuf_DescriptorProto_ReservedRange): JsonNode = if hasfend(message): result["end"] = %message.fend +proc parsegoogle_protobuf_DescriptorProto_ReservedRange*(obj: JsonNode): google_protobuf_DescriptorProto_ReservedRange = + result = newgoogle_protobuf_DescriptorProto_ReservedRange() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "start", "start") + if node != nil and node.kind != JNull: + setstart(result, parseInt[int32](node)) + node = getJsonField(obj, "end", "end") + if node != nil and node.kind != JNull: + setfend(result, parseInt[int32](node)) + proc serialize*(message: google_protobuf_DescriptorProto_ReservedRange): string = let ss = newStringStream() @@ -3354,6 +3709,66 @@ proc toJson*(message: google_protobuf_DescriptorProto): JsonNode = add(arr, %value) result["reservedName"] = arr +proc parsegoogle_protobuf_DescriptorProto*(obj: JsonNode): google_protobuf_DescriptorProto = + result = newgoogle_protobuf_DescriptorProto() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "field", "field") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addfield(result, parsegoogle_protobuf_FieldDescriptorProto(value)) + node = getJsonField(obj, "extension", "extension") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addextension(result, parsegoogle_protobuf_FieldDescriptorProto(value)) + node = getJsonField(obj, "nested_type", "nestedType") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addnestedType(result, parsegoogle_protobuf_DescriptorProto(value)) + node = getJsonField(obj, "enum_type", "enumType") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addenumType(result, parsegoogle_protobuf_EnumDescriptorProto(value)) + node = getJsonField(obj, "extension_range", "extensionRange") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addextensionRange(result, parsegoogle_protobuf_DescriptorProto_ExtensionRange(value)) + node = getJsonField(obj, "oneof_decl", "oneofDecl") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addoneofDecl(result, parsegoogle_protobuf_OneofDescriptorProto(value)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + setoptions(result, parsegoogle_protobuf_MessageOptions(node)) + node = getJsonField(obj, "reserved_range", "reservedRange") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addreservedRange(result, parsegoogle_protobuf_DescriptorProto_ReservedRange(value)) + node = getJsonField(obj, "reserved_name", "reservedName") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addreservedName(result, parseString(value)) + proc serialize*(message: google_protobuf_DescriptorProto): string = let ss = newStringStream() @@ -3904,7 +4319,7 @@ proc toJson*(message: google_protobuf_FileOptions): JsonNode = if hasjavaStringCheckUtf8(message): result["javaStringCheckUtf8"] = %message.javaStringCheckUtf8 if hasoptimizeFor(message): - result["optimizeFor"] = %($message.optimizeFor) + result["optimizeFor"] = toJson(message.optimizeFor) if hasgoPackage(message): result["goPackage"] = %message.goPackage if hasccGenericServices(message): @@ -3935,6 +4350,72 @@ proc toJson*(message: google_protobuf_FileOptions): JsonNode = add(arr, toJson(value)) result["uninterpretedOption"] = arr +proc parsegoogle_protobuf_FileOptions*(obj: JsonNode): google_protobuf_FileOptions = + result = newgoogle_protobuf_FileOptions() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "java_package", "javaPackage") + if node != nil and node.kind != JNull: + setjavaPackage(result, parseString(node)) + node = getJsonField(obj, "java_outer_classname", "javaOuterClassname") + if node != nil and node.kind != JNull: + setjavaOuterClassname(result, parseString(node)) + node = getJsonField(obj, "java_multiple_files", "javaMultipleFiles") + if node != nil and node.kind != JNull: + setjavaMultipleFiles(result, parseBool(node)) + node = getJsonField(obj, "java_generate_equals_and_hash", "javaGenerateEqualsAndHash") + if node != nil and node.kind != JNull: + setjavaGenerateEqualsAndHash(result, parseBool(node)) + node = getJsonField(obj, "java_string_check_utf8", "javaStringCheckUtf8") + if node != nil and node.kind != JNull: + setjavaStringCheckUtf8(result, parseBool(node)) + node = getJsonField(obj, "optimize_for", "optimizeFor") + if node != nil and node.kind != JNull: + setoptimizeFor(result, parseEnum[google_protobuf_FileOptions_OptimizeMode](node)) + node = getJsonField(obj, "go_package", "goPackage") + if node != nil and node.kind != JNull: + setgoPackage(result, parseString(node)) + node = getJsonField(obj, "cc_generic_services", "ccGenericServices") + if node != nil and node.kind != JNull: + setccGenericServices(result, parseBool(node)) + node = getJsonField(obj, "java_generic_services", "javaGenericServices") + if node != nil and node.kind != JNull: + setjavaGenericServices(result, parseBool(node)) + node = getJsonField(obj, "py_generic_services", "pyGenericServices") + if node != nil and node.kind != JNull: + setpyGenericServices(result, parseBool(node)) + node = getJsonField(obj, "php_generic_services", "phpGenericServices") + if node != nil and node.kind != JNull: + setphpGenericServices(result, parseBool(node)) + node = getJsonField(obj, "deprecated", "deprecated") + if node != nil and node.kind != JNull: + setdeprecated(result, parseBool(node)) + node = getJsonField(obj, "cc_enable_arenas", "ccEnableArenas") + if node != nil and node.kind != JNull: + setccEnableArenas(result, parseBool(node)) + node = getJsonField(obj, "objc_class_prefix", "objcClassPrefix") + if node != nil and node.kind != JNull: + setobjcClassPrefix(result, parseString(node)) + node = getJsonField(obj, "csharp_namespace", "csharpNamespace") + if node != nil and node.kind != JNull: + setcsharpNamespace(result, parseString(node)) + node = getJsonField(obj, "swift_prefix", "swiftPrefix") + if node != nil and node.kind != JNull: + setswiftPrefix(result, parseString(node)) + node = getJsonField(obj, "php_class_prefix", "phpClassPrefix") + if node != nil and node.kind != JNull: + setphpClassPrefix(result, parseString(node)) + node = getJsonField(obj, "php_namespace", "phpNamespace") + if node != nil and node.kind != JNull: + setphpNamespace(result, parseString(node)) + node = getJsonField(obj, "uninterpreted_option", "uninterpretedOption") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + adduninterpretedOption(result, parsegoogle_protobuf_UninterpretedOption(value)) + proc serialize*(message: google_protobuf_FileOptions): string = let ss = newStringStream() @@ -4040,6 +4521,21 @@ proc toJson*(message: google_protobuf_ServiceOptions): JsonNode = add(arr, toJson(value)) result["uninterpretedOption"] = arr +proc parsegoogle_protobuf_ServiceOptions*(obj: JsonNode): google_protobuf_ServiceOptions = + result = newgoogle_protobuf_ServiceOptions() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "deprecated", "deprecated") + if node != nil and node.kind != JNull: + setdeprecated(result, parseBool(node)) + node = getJsonField(obj, "uninterpreted_option", "uninterpretedOption") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + adduninterpretedOption(result, parsegoogle_protobuf_UninterpretedOption(value)) + proc serialize*(message: google_protobuf_ServiceOptions): string = let ss = newStringStream() @@ -4166,13 +4662,31 @@ proc toJson*(message: google_protobuf_MethodOptions): JsonNode = if hasdeprecated(message): result["deprecated"] = %message.deprecated if hasidempotencyLevel(message): - result["idempotencyLevel"] = %($message.idempotencyLevel) + result["idempotencyLevel"] = toJson(message.idempotencyLevel) if hasuninterpretedOption(message): let arr = newJArray() for value in message.uninterpretedOption: add(arr, toJson(value)) result["uninterpretedOption"] = arr +proc parsegoogle_protobuf_MethodOptions*(obj: JsonNode): google_protobuf_MethodOptions = + result = newgoogle_protobuf_MethodOptions() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "deprecated", "deprecated") + if node != nil and node.kind != JNull: + setdeprecated(result, parseBool(node)) + node = getJsonField(obj, "idempotency_level", "idempotencyLevel") + if node != nil and node.kind != JNull: + setidempotencyLevel(result, parseEnum[google_protobuf_MethodOptions_IdempotencyLevel](node)) + node = getJsonField(obj, "uninterpreted_option", "uninterpretedOption") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + adduninterpretedOption(result, parsegoogle_protobuf_UninterpretedOption(value)) + proc serialize*(message: google_protobuf_MethodOptions): string = let ss = newStringStream() @@ -4383,6 +4897,30 @@ proc toJson*(message: google_protobuf_MethodDescriptorProto): JsonNode = if hasserverStreaming(message): result["serverStreaming"] = %message.serverStreaming +proc parsegoogle_protobuf_MethodDescriptorProto*(obj: JsonNode): google_protobuf_MethodDescriptorProto = + result = newgoogle_protobuf_MethodDescriptorProto() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "input_type", "inputType") + if node != nil and node.kind != JNull: + setinputType(result, parseString(node)) + node = getJsonField(obj, "output_type", "outputType") + if node != nil and node.kind != JNull: + setoutputType(result, parseString(node)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + setoptions(result, parsegoogle_protobuf_MethodOptions(node)) + node = getJsonField(obj, "client_streaming", "clientStreaming") + if node != nil and node.kind != JNull: + setclientStreaming(result, parseBool(node)) + node = getJsonField(obj, "server_streaming", "serverStreaming") + if node != nil and node.kind != JNull: + setserverStreaming(result, parseBool(node)) + proc serialize*(message: google_protobuf_MethodDescriptorProto): string = let ss = newStringStream() @@ -4517,6 +5055,24 @@ proc toJson*(message: google_protobuf_ServiceDescriptorProto): JsonNode = if hasoptions(message): result["options"] = toJson(message.options) +proc parsegoogle_protobuf_ServiceDescriptorProto*(obj: JsonNode): google_protobuf_ServiceDescriptorProto = + result = newgoogle_protobuf_ServiceDescriptorProto() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "method", "method") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addfmethod(result, parsegoogle_protobuf_MethodDescriptorProto(value)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + setoptions(result, parsegoogle_protobuf_ServiceOptions(node)) + proc serialize*(message: google_protobuf_ServiceDescriptorProto): string = let ss = newStringStream() @@ -4971,6 +5527,69 @@ proc toJson*(message: google_protobuf_FileDescriptorProto): JsonNode = if hassyntax(message): result["syntax"] = %message.syntax +proc parsegoogle_protobuf_FileDescriptorProto*(obj: JsonNode): google_protobuf_FileDescriptorProto = + result = newgoogle_protobuf_FileDescriptorProto() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "package", "package") + if node != nil and node.kind != JNull: + setpackage(result, parseString(node)) + node = getJsonField(obj, "dependency", "dependency") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + adddependency(result, parseString(value)) + node = getJsonField(obj, "public_dependency", "publicDependency") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addpublicDependency(result, parseInt[int32](value)) + node = getJsonField(obj, "weak_dependency", "weakDependency") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addweakDependency(result, parseInt[int32](value)) + node = getJsonField(obj, "message_type", "messageType") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addmessageType(result, parsegoogle_protobuf_DescriptorProto(value)) + node = getJsonField(obj, "enum_type", "enumType") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addenumType(result, parsegoogle_protobuf_EnumDescriptorProto(value)) + node = getJsonField(obj, "service", "service") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addservice(result, parsegoogle_protobuf_ServiceDescriptorProto(value)) + node = getJsonField(obj, "extension", "extension") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addextension(result, parsegoogle_protobuf_FieldDescriptorProto(value)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + setoptions(result, parsegoogle_protobuf_FileOptions(node)) + node = getJsonField(obj, "source_code_info", "sourceCodeInfo") + if node != nil and node.kind != JNull: + setsourceCodeInfo(result, parsegoogle_protobuf_SourceCodeInfo(node)) + node = getJsonField(obj, "syntax", "syntax") + if node != nil and node.kind != JNull: + setsyntax(result, parseString(node)) + proc serialize*(message: google_protobuf_FileDescriptorProto): string = let ss = newStringStream() @@ -5048,6 +5667,18 @@ proc toJson*(message: google_protobuf_FileDescriptorSet): JsonNode = add(arr, toJson(value)) result["file"] = arr +proc parsegoogle_protobuf_FileDescriptorSet*(obj: JsonNode): google_protobuf_FileDescriptorSet = + result = newgoogle_protobuf_FileDescriptorSet() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "file", "file") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addfile(result, parsegoogle_protobuf_FileDescriptorProto(value)) + proc serialize*(message: google_protobuf_FileDescriptorSet): string = let ss = newStringStream() @@ -5222,6 +5853,27 @@ proc toJson*(message: google_protobuf_GeneratedCodeInfo_Annotation): JsonNode = if hasfend(message): result["end"] = %message.fend +proc parsegoogle_protobuf_GeneratedCodeInfo_Annotation*(obj: JsonNode): google_protobuf_GeneratedCodeInfo_Annotation = + result = newgoogle_protobuf_GeneratedCodeInfo_Annotation() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "path", "path") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addpath(result, parseInt[int32](value)) + node = getJsonField(obj, "source_file", "sourceFile") + if node != nil and node.kind != JNull: + setsourceFile(result, parseString(node)) + node = getJsonField(obj, "begin", "begin") + if node != nil and node.kind != JNull: + setbegin(result, parseInt[int32](node)) + node = getJsonField(obj, "end", "end") + if node != nil and node.kind != JNull: + setfend(result, parseInt[int32](node)) + proc serialize*(message: google_protobuf_GeneratedCodeInfo_Annotation): string = let ss = newStringStream() @@ -5299,6 +5951,18 @@ proc toJson*(message: google_protobuf_GeneratedCodeInfo): JsonNode = add(arr, toJson(value)) result["annotation"] = arr +proc parsegoogle_protobuf_GeneratedCodeInfo*(obj: JsonNode): google_protobuf_GeneratedCodeInfo = + result = newgoogle_protobuf_GeneratedCodeInfo() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "annotation", "annotation") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addannotation(result, parsegoogle_protobuf_GeneratedCodeInfo_Annotation(value)) + proc serialize*(message: google_protobuf_GeneratedCodeInfo): string = let ss = newStringStream() diff --git a/nimpb/wkt/duration.nim b/nimpb/wkt/duration.nim index 98c8afb..ecc7e6b 100644 --- a/nimpb/wkt/duration.nim +++ b/nimpb/wkt/duration.nim @@ -21,9 +21,48 @@ proc toJson*(message: google_protobuf_Duration): JsonNode = if message.nanos != 0: add(s, ".") - add(s, intToStr(message.nanos, 9)) + add(s, intToStr(sgn(message.nanos) * message.nanos, 9)) removeSuffix(s, '0') add(s, "s") result = %s + +proc parsegoogle_protobuf_Duration*(node: JsonNode): google_protobuf_Duration = + if node.kind != JString: + raise newException(nimpb_json.ParseError, "string expected") + + if not endsWith(node.str, "s"): + raise newException(nimpb_json.ParseError, "string does not end with s") + + result = newgoogle_protobuf_Duration() + + let dotIndex = find(node.str, '.') + + if dotIndex == -1: + result.seconds = parseBiggestInt(node.str[0..^2]) + if result.seconds < -315_576_000_000'i64 or + result.seconds > 315_576_000_000'i64: + raise newException(nimpb_json.ParseError, "duration seconds out of bounds") + return + + result.seconds = parseBiggestInt(node.str[0..dotIndex-1]) + + if result.seconds < -315_576_000_000'i64 or + result.seconds > 315_576_000_000'i64: + raise newException(nimpb_json.ParseError, "duration seconds out of bounds") + + let nanoStr = node.str[dotIndex+1..^2] + var factor = 100_000_000 + + result.nanos = 0 + + for ch in nanoStr: + result.nanos = result.nanos + int32(factor * (ord(ch) - ord('0'))) + factor = factor div 10 + + if result.nanos > 999_999_999: + raise newException(ValueError, "duration nanos out of bounds") + + if result.seconds < 0: + result.nanos = -result.nanos diff --git a/nimpb/wkt/duration_pb.nim b/nimpb/wkt/duration_pb.nim index cd8ffc1..f052d3a 100644 --- a/nimpb/wkt/duration_pb.nim +++ b/nimpb/wkt/duration_pb.nim @@ -3,6 +3,7 @@ import base64 import intsets import json +import strutils import nimpb/nimpb import nimpb/json as nimpb_json diff --git a/nimpb/wkt/empty_pb.nim b/nimpb/wkt/empty_pb.nim index 87a9c90..88ebf66 100644 --- a/nimpb/wkt/empty_pb.nim +++ b/nimpb/wkt/empty_pb.nim @@ -3,6 +3,7 @@ import base64 import intsets import json +import strutils import nimpb/nimpb import nimpb/json as nimpb_json @@ -18,6 +19,7 @@ proc writegoogle_protobuf_Empty*(stream: Stream, message: google_protobuf_Empty) proc readgoogle_protobuf_Empty*(stream: Stream): google_protobuf_Empty proc sizeOfgoogle_protobuf_Empty*(message: google_protobuf_Empty): uint64 proc toJson*(message: google_protobuf_Empty): JsonNode +proc parsegoogle_protobuf_Empty*(obj: JsonNode): google_protobuf_Empty proc newgoogle_protobuf_Empty*(): google_protobuf_Empty = new(result) @@ -43,6 +45,12 @@ proc readgoogle_protobuf_Empty*(stream: Stream): google_protobuf_Empty = proc toJson*(message: google_protobuf_Empty): JsonNode = result = newJObject() +proc parsegoogle_protobuf_Empty*(obj: JsonNode): google_protobuf_Empty = + result = newgoogle_protobuf_Empty() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + proc serialize*(message: google_protobuf_Empty): string = let ss = newStringStream() diff --git a/nimpb/wkt/field_mask.nim b/nimpb/wkt/field_mask.nim index fb8d04f..6e5fcba 100644 --- a/nimpb/wkt/field_mask.nim +++ b/nimpb/wkt/field_mask.nim @@ -43,3 +43,13 @@ proc toJson*(message: google_protobuf_FieldMask): JsonNode = add(resultString, ",") result = %resultString + +proc parsegoogle_protobuf_FieldMask*(node: JsonNode): google_protobuf_FieldMask = + if node.kind != JString: + raise newException(nimpb_json.ParseError, "string expected") + + result = newgoogle_protobuf_FieldMask() + result.paths = @[] + + for path in split(node.str, ","): + addPaths(result, camelCaseToSnakeCase(path)) diff --git a/nimpb/wkt/field_mask_pb.nim b/nimpb/wkt/field_mask_pb.nim index 5cb1788..bed3296 100644 --- a/nimpb/wkt/field_mask_pb.nim +++ b/nimpb/wkt/field_mask_pb.nim @@ -3,6 +3,7 @@ import base64 import intsets import json +import strutils import nimpb/nimpb import nimpb/json as nimpb_json diff --git a/nimpb/wkt/source_context_pb.nim b/nimpb/wkt/source_context_pb.nim index 334d48c..943cfd1 100644 --- a/nimpb/wkt/source_context_pb.nim +++ b/nimpb/wkt/source_context_pb.nim @@ -3,6 +3,7 @@ import base64 import intsets import json +import strutils import nimpb/nimpb import nimpb/json as nimpb_json @@ -19,6 +20,7 @@ proc writegoogle_protobuf_SourceContext*(stream: Stream, message: google_protobu proc readgoogle_protobuf_SourceContext*(stream: Stream): google_protobuf_SourceContext proc sizeOfgoogle_protobuf_SourceContext*(message: google_protobuf_SourceContext): uint64 proc toJson*(message: google_protobuf_SourceContext): JsonNode +proc parsegoogle_protobuf_SourceContext*(obj: JsonNode): google_protobuf_SourceContext proc newgoogle_protobuf_SourceContext*(): google_protobuf_SourceContext = new(result) @@ -72,6 +74,15 @@ proc toJson*(message: google_protobuf_SourceContext): JsonNode = if hasfileName(message): result["fileName"] = %message.fileName +proc parsegoogle_protobuf_SourceContext*(obj: JsonNode): google_protobuf_SourceContext = + result = newgoogle_protobuf_SourceContext() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "file_name", "fileName") + if node != nil and node.kind != JNull: + setfileName(result, parseString(node)) + proc serialize*(message: google_protobuf_SourceContext): string = let ss = newStringStream() diff --git a/nimpb/wkt/struct.nim b/nimpb/wkt/struct.nim index bfeca0b..12427b2 100644 --- a/nimpb/wkt/struct.nim +++ b/nimpb/wkt/struct.nim @@ -34,3 +34,47 @@ proc toJson*(message: google_protobuf_ListValue): JsonNode = result = newJArray() for value in message.values: add(result, toJson(value)) + +proc parsegoogle_protobuf_Value*(node: JsonNode): google_protobuf_Value + +proc parsegoogle_protobuf_ListValue*(node: JsonNode): google_protobuf_ListValue + +proc parsegoogle_protobuf_Struct*(node: JsonNode): google_protobuf_Struct = + if node.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + + result = newgoogle_protobuf_Struct() + + for key, valueNode in node: + let value = parsegoogle_protobuf_Value(valueNode) + result.fields[key] = value + +proc parsegoogle_protobuf_Value*(node: JsonNode): google_protobuf_Value = + result = newgoogle_protobuf_Value() + + if node.kind == JNull: + result.nullValue = google_protobuf_NullValue.NULL_VALUE + elif node.kind == JInt or node.kind == JFloat: + result.numberValue = getFloat(node) + elif node.kind == JString: + result.stringValue = getStr(node) + elif node.kind == JBool: + result.boolValue = getBool(node) + elif node.kind == JObject: + result.structValue = parsegoogle_protobuf_Struct(node) + elif node.kind == JArray: + result.listValue = parsegoogle_protobuf_ListValue(node) + +proc parsegoogle_protobuf_NullValue*(node: JsonNode): google_protobuf_NullValue = + if node.kind != JNull: + raise newException(nimpb_json.ParseError, "null expected") + result = google_protobuf_NullValue.NULL_VALUE + +proc parsegoogle_protobuf_ListValue*(node: JsonNode): google_protobuf_ListValue = + if node.kind != JArray: + raise newException(nimpb_json.ParseError, "array expected") + + result = newgoogle_protobuf_ListValue() + + for value in node: + addValues(result, parsegoogle_protobuf_Value(value)) diff --git a/nimpb/wkt/struct_pb.nim b/nimpb/wkt/struct_pb.nim index 35397ce..a1e04e1 100644 --- a/nimpb/wkt/struct_pb.nim +++ b/nimpb/wkt/struct_pb.nim @@ -3,6 +3,7 @@ import base64 import intsets import json +import strutils import tables export tables diff --git a/nimpb/wkt/timestamp.nim b/nimpb/wkt/timestamp.nim index 52726e6..3df18b5 100644 --- a/nimpb/wkt/timestamp.nim +++ b/nimpb/wkt/timestamp.nim @@ -1,4 +1,5 @@ import json +import pegs import strutils import times @@ -17,3 +18,56 @@ proc toJson*(message: google_protobuf_Timestamp): JsonNode = removeSuffix(s, '0') add(s, "Z") result = %s + +proc parsegoogle_protobuf_Timestamp*(node: JsonNode): google_protobuf_Timestamp = + if node.kind != JString: + raise newException(nimpb_json.ParseError, "string expected") + + var pattern = peg""" +timestamp <- year '-' month '-' day 'T' hours ':' mins ':' secs {frac?} {offset} +year <- \d\d\d\d +month <- \d\d +day <- \d\d +hours <- \d\d +mins <- \d\d +secs <- \d\d +frac <- '.' \d+ +offset <- 'Z' / (('+' / '-') \d\d ':' \d\d) +""" + + var matches: array[2, string] + var s = node.str + var nanos = 0 + + if not match(s, pattern, matches): + raise newException(nimpb_json.ParseError, "invalid timestamp") + + if len(matches[0]) > 0: + # Delete the fractions if they were found so that times.parse() can + # parse the rest of the timestamp. + let first = len(s) - len(matches[1]) - len(matches[0]) + let last = len(s) - len(matches[1]) - 1 + delete(s, first, last) + + var factor = 100_000_000 + for ch in matches[0][1..^1]: + nanos = nanos + factor * (ord(ch) - ord('0')) + factor = factor div 10 + + if nanos > 999_999_999: + raise newException(nimpb_json.ParseError, "nanos out of bounds") + + var dt: DateTime + + try: + dt = times.parse(s, "yyyy-MM-dd'T'HH:mm:sszzz", utc()) + except Exception as exc: + raise newException(nimpb_json.ParseError, exc.msg) + + if dt.year < 1 or dt.year > 9999: + raise newException(nimpb_json.ParseError, "year out of bounds") + + result = newgoogle_protobuf_Timestamp() + + result.seconds = toUnix(toTime(dt)) + result.nanos = int32(nanos) diff --git a/nimpb/wkt/timestamp_pb.nim b/nimpb/wkt/timestamp_pb.nim index d7e7fff..7403e2e 100644 --- a/nimpb/wkt/timestamp_pb.nim +++ b/nimpb/wkt/timestamp_pb.nim @@ -3,6 +3,7 @@ import base64 import intsets import json +import strutils import nimpb/nimpb import nimpb/json as nimpb_json diff --git a/nimpb/wkt/type_pb.nim b/nimpb/wkt/type_pb.nim index 9f60b1a..a4e6838 100644 --- a/nimpb/wkt/type_pb.nim +++ b/nimpb/wkt/type_pb.nim @@ -3,6 +3,7 @@ import base64 import intsets import json +import strutils import nimpb/nimpb import nimpb/json as nimpb_json @@ -83,6 +84,7 @@ proc writegoogle_protobuf_Option*(stream: Stream, message: google_protobuf_Optio proc readgoogle_protobuf_Option*(stream: Stream): google_protobuf_Option proc sizeOfgoogle_protobuf_Option*(message: google_protobuf_Option): uint64 proc toJson*(message: google_protobuf_Option): JsonNode +proc parsegoogle_protobuf_Option*(obj: JsonNode): google_protobuf_Option proc newgoogle_protobuf_Field*(): google_protobuf_Field proc newgoogle_protobuf_Field*(data: string): google_protobuf_Field @@ -91,6 +93,7 @@ proc writegoogle_protobuf_Field*(stream: Stream, message: google_protobuf_Field) proc readgoogle_protobuf_Field*(stream: Stream): google_protobuf_Field proc sizeOfgoogle_protobuf_Field*(message: google_protobuf_Field): uint64 proc toJson*(message: google_protobuf_Field): JsonNode +proc parsegoogle_protobuf_Field*(obj: JsonNode): google_protobuf_Field proc newgoogle_protobuf_Type*(): google_protobuf_Type proc newgoogle_protobuf_Type*(data: string): google_protobuf_Type @@ -99,6 +102,7 @@ proc writegoogle_protobuf_Type*(stream: Stream, message: google_protobuf_Type) proc readgoogle_protobuf_Type*(stream: Stream): google_protobuf_Type proc sizeOfgoogle_protobuf_Type*(message: google_protobuf_Type): uint64 proc toJson*(message: google_protobuf_Type): JsonNode +proc parsegoogle_protobuf_Type*(obj: JsonNode): google_protobuf_Type proc newgoogle_protobuf_EnumValue*(): google_protobuf_EnumValue proc newgoogle_protobuf_EnumValue*(data: string): google_protobuf_EnumValue @@ -107,6 +111,7 @@ proc writegoogle_protobuf_EnumValue*(stream: Stream, message: google_protobuf_En proc readgoogle_protobuf_EnumValue*(stream: Stream): google_protobuf_EnumValue proc sizeOfgoogle_protobuf_EnumValue*(message: google_protobuf_EnumValue): uint64 proc toJson*(message: google_protobuf_EnumValue): JsonNode +proc parsegoogle_protobuf_EnumValue*(obj: JsonNode): google_protobuf_EnumValue proc newgoogle_protobuf_Enum*(): google_protobuf_Enum proc newgoogle_protobuf_Enum*(data: string): google_protobuf_Enum @@ -115,6 +120,7 @@ proc writegoogle_protobuf_Enum*(stream: Stream, message: google_protobuf_Enum) proc readgoogle_protobuf_Enum*(stream: Stream): google_protobuf_Enum proc sizeOfgoogle_protobuf_Enum*(message: google_protobuf_Enum): uint64 proc toJson*(message: google_protobuf_Enum): JsonNode +proc parsegoogle_protobuf_Enum*(obj: JsonNode): google_protobuf_Enum proc newgoogle_protobuf_Option*(): google_protobuf_Option = new(result) @@ -197,6 +203,18 @@ proc toJson*(message: google_protobuf_Option): JsonNode = if hasvalue(message): result["value"] = toJson(message.value) +proc parsegoogle_protobuf_Option*(obj: JsonNode): google_protobuf_Option = + result = newgoogle_protobuf_Option() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "value", "value") + if node != nil and node.kind != JNull: + setvalue(result, parsegoogle_protobuf_Any(node)) + proc serialize*(message: google_protobuf_Option): string = let ss = newStringStream() @@ -503,9 +521,9 @@ proc readgoogle_protobuf_Field*(stream: Stream): google_protobuf_Field = proc toJson*(message: google_protobuf_Field): JsonNode = result = newJObject() if haskind(message): - result["kind"] = %($message.kind) + result["kind"] = toJson(message.kind) if hascardinality(message): - result["cardinality"] = %($message.cardinality) + result["cardinality"] = toJson(message.cardinality) if hasnumber(message): result["number"] = %message.number if hasname(message): @@ -526,6 +544,45 @@ proc toJson*(message: google_protobuf_Field): JsonNode = if hasdefaultValue(message): result["defaultValue"] = %message.defaultValue +proc parsegoogle_protobuf_Field*(obj: JsonNode): google_protobuf_Field = + result = newgoogle_protobuf_Field() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "kind", "kind") + if node != nil and node.kind != JNull: + setkind(result, parseEnum[google_protobuf_Field_Kind](node)) + node = getJsonField(obj, "cardinality", "cardinality") + if node != nil and node.kind != JNull: + setcardinality(result, parseEnum[google_protobuf_Field_Cardinality](node)) + node = getJsonField(obj, "number", "number") + if node != nil and node.kind != JNull: + setnumber(result, parseInt[int32](node)) + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "type_url", "typeUrl") + if node != nil and node.kind != JNull: + settypeUrl(result, parseString(node)) + node = getJsonField(obj, "oneof_index", "oneofIndex") + if node != nil and node.kind != JNull: + setoneofIndex(result, parseInt[int32](node)) + node = getJsonField(obj, "packed", "packed") + if node != nil and node.kind != JNull: + setpacked(result, parseBool(node)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addoptions(result, parsegoogle_protobuf_Option(value)) + node = getJsonField(obj, "json_name", "jsonName") + if node != nil and node.kind != JNull: + setjsonName(result, parseString(node)) + node = getJsonField(obj, "default_value", "defaultValue") + if node != nil and node.kind != JNull: + setdefaultValue(result, parseString(node)) + proc serialize*(message: google_protobuf_Field): string = let ss = newStringStream() @@ -757,7 +814,40 @@ proc toJson*(message: google_protobuf_Type): JsonNode = if hassourceContext(message): result["sourceContext"] = toJson(message.sourceContext) if hassyntax(message): - result["syntax"] = %($message.syntax) + result["syntax"] = toJson(message.syntax) + +proc parsegoogle_protobuf_Type*(obj: JsonNode): google_protobuf_Type = + result = newgoogle_protobuf_Type() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "fields", "fields") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addfields(result, parsegoogle_protobuf_Field(value)) + node = getJsonField(obj, "oneofs", "oneofs") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addoneofs(result, parseString(value)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addoptions(result, parsegoogle_protobuf_Option(value)) + node = getJsonField(obj, "source_context", "sourceContext") + if node != nil and node.kind != JNull: + setsourceContext(result, parsegoogle_protobuf_SourceContext(node)) + node = getJsonField(obj, "syntax", "syntax") + if node != nil and node.kind != JNull: + setsyntax(result, parseEnum[google_protobuf_Syntax](node)) proc serialize*(message: google_protobuf_Type): string = let @@ -892,6 +982,24 @@ proc toJson*(message: google_protobuf_EnumValue): JsonNode = add(arr, toJson(value)) result["options"] = arr +proc parsegoogle_protobuf_EnumValue*(obj: JsonNode): google_protobuf_EnumValue = + result = newgoogle_protobuf_EnumValue() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "number", "number") + if node != nil and node.kind != JNull: + setnumber(result, parseInt[int32](node)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addoptions(result, parsegoogle_protobuf_Option(value)) + proc serialize*(message: google_protobuf_EnumValue): string = let ss = newStringStream() @@ -1088,7 +1196,34 @@ proc toJson*(message: google_protobuf_Enum): JsonNode = if hassourceContext(message): result["sourceContext"] = toJson(message.sourceContext) if hassyntax(message): - result["syntax"] = %($message.syntax) + result["syntax"] = toJson(message.syntax) + +proc parsegoogle_protobuf_Enum*(obj: JsonNode): google_protobuf_Enum = + result = newgoogle_protobuf_Enum() + var node: JsonNode + if obj.kind != JObject: + raise newException(nimpb_json.ParseError, "object expected") + node = getJsonField(obj, "name", "name") + if node != nil and node.kind != JNull: + setname(result, parseString(node)) + node = getJsonField(obj, "enumvalue", "enumvalue") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addenumvalue(result, parsegoogle_protobuf_EnumValue(value)) + node = getJsonField(obj, "options", "options") + if node != nil and node.kind != JNull: + if node.kind != JArray: + raise newException(ValueError, "not an array") + for value in node: + addoptions(result, parsegoogle_protobuf_Option(value)) + node = getJsonField(obj, "source_context", "sourceContext") + if node != nil and node.kind != JNull: + setsourceContext(result, parsegoogle_protobuf_SourceContext(node)) + node = getJsonField(obj, "syntax", "syntax") + if node != nil and node.kind != JNull: + setsyntax(result, parseEnum[google_protobuf_Syntax](node)) proc serialize*(message: google_protobuf_Enum): string = let diff --git a/nimpb/wkt/wrappers.nim b/nimpb/wkt/wrappers.nim index 12d58bc..848745c 100644 --- a/nimpb/wkt/wrappers.nim +++ b/nimpb/wkt/wrappers.nim @@ -1,4 +1,6 @@ import json +import strutils +import base64 include wrappers_pb @@ -55,3 +57,71 @@ proc toJson*(message: google_protobuf_BytesValue): JsonNode = result = %message.value else: result = newJNull() + +proc parsegoogle_protobuf_DoubleValue*(node: JsonNode): google_protobuf_DoubleValue = + result = newgoogle_protobuf_DoubleValue() + if node.kind == JInt or node.kind == JFloat: + setValue(result, getFloat(node)) + else: + raise newException(nimpb_json.ParseError, "not a float") + +proc parsegoogle_protobuf_FloatValue*(node: JsonNode): google_protobuf_FloatValue = + result = newgoogle_protobuf_FloatValue() + if node.kind == JInt or node.kind == JFloat: + setValue(result, getFloat(node)) + else: + raise newException(nimpb_json.ParseError, "not a float") + +proc parsegoogle_protobuf_Int64Value*(node: JsonNode): google_protobuf_Int64Value = + result = newgoogle_protobuf_Int64Value() + if node.kind == JInt: + setValue(result, getBiggestInt(node)) + elif node.kind == JString: + setValue(result, parseBiggestInt(node.str)) + else: + raise newException(nimpb_json.ParseError, "invalid value") + +proc parsegoogle_protobuf_UInt64Value*(node: JsonNode): google_protobuf_UInt64Value = + result = newgoogle_protobuf_UInt64Value() + if node.kind == JInt: + setValue(result, uint64(getBiggestInt(node))) + elif node.kind == JString: + setValue(result, uint64(parseBiggestUInt(node.str))) + else: + raise newException(nimpb_json.ParseError, "invalid value") + +proc parsegoogle_protobuf_Int32Value*(node: JsonNode): google_protobuf_Int32Value = + result = newgoogle_protobuf_Int32Value() + if node.kind == JInt: + setValue(result, int32(getInt(node))) + elif node.kind == JString: + setValue(result, int32(parseInt(node.str))) + else: + raise newException(nimpb_json.ParseError, "invalid value") + +proc parsegoogle_protobuf_UInt32Value*(node: JsonNode): google_protobuf_UInt32Value = + result = newgoogle_protobuf_UInt32Value() + if node.kind == JInt: + setValue(result, uint32(getInt(node))) + elif node.kind == JString: + setValue(result, uint32(parseUInt(node.str))) + else: + raise newException(nimpb_json.ParseError, "invalid value") + +proc parsegoogle_protobuf_BoolValue*(node: JsonNode): google_protobuf_BoolValue = + if node.kind != JBool: + raise newException(nimpb_json.ParseError, "not a boolean") + result = newgoogle_protobuf_BoolValue() + setValue(result, getBool(node)) + +proc parsegoogle_protobuf_StringValue*(node: JsonNode): google_protobuf_StringValue = + if node.kind != JString: + raise newException(nimpb_json.ParseError, "not a string") + result = newgoogle_protobuf_StringValue() + setValue(result, node.str) + +proc parsegoogle_protobuf_BytesValue*(node: JsonNode): google_protobuf_BytesValue = + if node.kind != JString: + raise newException(nimpb_json.ParseError, "not a string") + result = newgoogle_protobuf_BytesValue() + setValue(result, cast[seq[byte]](base64.decode(node.str))) diff --git a/nimpb/wkt/wrappers_pb.nim b/nimpb/wkt/wrappers_pb.nim index 881bab6..e19afa6 100644 --- a/nimpb/wkt/wrappers_pb.nim +++ b/nimpb/wkt/wrappers_pb.nim @@ -3,6 +3,7 @@ import base64 import intsets import json +import strutils import nimpb/nimpb import nimpb/json as nimpb_json diff --git a/tests/conformance/conformance_nim.nim b/tests/conformance/conformance_nim.nim index 25150b6..819a7c9 100644 --- a/tests/conformance/conformance_nim.nim +++ b/tests/conformance/conformance_nim.nim @@ -27,6 +27,9 @@ proc myReadString(s: Stream, size: int): string = if readData(s, addr(result[0]), size) != size: raise newException(Exception, "failed to read data") +proc errorMessage(exc: ref Exception): string = + result = $exc.name & ": " & exc.msg & "\n" & getStackTrace(exc) + while true: var requestSize = 0'i32 @@ -43,24 +46,39 @@ while true: if request.messageType == "protobuf_test_messages.proto2.TestAllTypesProto2": response.skipped = "skipping proto2 tests" - elif hasJsonPayload(request): - response.skipped = "dont know how to parse json" else: try: - let parsed = newprotobuf_test_messages_proto3_TestAllTypesProto3(request.protobufPayload) + var parsed: protobuf_test_messages_proto3_TestAllTypesProto3 + + if hasProtobufPayload(request): + parsed = newprotobuf_test_messages_proto3_TestAllTypesProto3(request.protobufPayload) + elif hasJsonPayload(request): + var j: JsonNode + + try: + j = parseJson(request.jsonPayload) + except Exception as exc: + raise newException(JsonParsingError, exc.msg) + + parsed = parseprotobuf_test_messages_proto3_TestAllTypesProto3(j) + if request.requestedOutputFormat == conformance_WireFormat.PROTOBUF: let ser = serialize(parsed) response.protobufPayload = cast[seq[byte]](ser) elif request.requestedOutputFormat == conformance_WireFormat.JSON: response.jsonPayload = $toJson(parsed) except IOError as exc: - response.parse_error = exc.msg - except ParseError as exc: - response.parse_error = exc.msg + response.parse_error = errorMessage(exc) + except OverflowError as exc: + response.parseError = errorMessage(exc) + except nimpb.ParseError as exc: + response.parse_error = errorMessage(exc) + except JsonParsingError as exc: + response.parseError = errorMessage(exc) except ValueError as exc: - response.serializeError = exc.msg + response.serializeError = errorMessage(exc) except Exception as exc: - response.runtimeError = exc.msg + response.runtimeError = errorMessage(exc) let responseData = serialize(response) -- cgit v1.2.3