aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-04-26 23:45:37 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2018-04-26 23:45:37 +0300
commitc68904433166a8c44ed958a53942f207afb401e5 (patch)
tree02705224c72eab39366a069095f9a236f51f8894
parent0a57c608958491d32365e807f943daa3ea3e3b87 (diff)
downloadnimpb-c68904433166a8c44ed958a53942f207afb401e5.tar.gz
nimpb-c68904433166a8c44ed958a53942f207afb401e5.zip
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.
-rw-r--r--nimpb/compiler/generator.nim88
-rw-r--r--nimpb/json.nim109
-rw-r--r--nimpb/wkt/any.nim3
-rw-r--r--nimpb/wkt/any_pb.nim1
-rw-r--r--nimpb/wkt/api_pb.nim86
-rw-r--r--nimpb/wkt/descriptor_pb.nim676
-rw-r--r--nimpb/wkt/duration.nim41
-rw-r--r--nimpb/wkt/duration_pb.nim1
-rw-r--r--nimpb/wkt/empty_pb.nim8
-rw-r--r--nimpb/wkt/field_mask.nim10
-rw-r--r--nimpb/wkt/field_mask_pb.nim1
-rw-r--r--nimpb/wkt/source_context_pb.nim11
-rw-r--r--nimpb/wkt/struct.nim44
-rw-r--r--nimpb/wkt/struct_pb.nim1
-rw-r--r--nimpb/wkt/timestamp.nim54
-rw-r--r--nimpb/wkt/timestamp_pb.nim1
-rw-r--r--nimpb/wkt/type_pb.nim143
-rw-r--r--nimpb/wkt/wrappers.nim70
-rw-r--r--nimpb/wkt/wrappers_pb.nim1
-rw-r--r--tests/conformance/conformance_nim.nim34
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)