diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-11 21:48:43 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-11 21:48:43 +0300 |
| commit | a829d59fb2cdb5c3362729e23da4f35f9558cb35 (patch) | |
| tree | 08836a6f3cb36f77aee48df0f35a6925084834e8 | |
| parent | 29b197fee90ca19925e19fd45f71f78b6525ffcd (diff) | |
| parent | 466d8d1d2e878330ff36c2aacd640092e7fba738 (diff) | |
| download | nimpb-a829d59fb2cdb5c3362729e23da4f35f9558cb35.tar.gz nimpb-a829d59fb2cdb5c3362729e23da4f35f9558cb35.zip | |
Merge branch 'move-compiler-back'
| -rw-r--r-- | nimpb.nimble | 11 | ||||
| -rw-r--r-- | nimpb/compiler/compiler.nim | 86 | ||||
| -rw-r--r-- | nimpb/compiler/descriptor_pb.nim | 4801 | ||||
| -rw-r--r-- | nimpb/compiler/generator.nim | 1084 | ||||
| -rw-r--r-- | nimpb/compiler/nimpb_build.nim | 44 | ||||
| -rw-r--r-- | nimpb/json.nim (renamed from src/nimpb/json.nim) | 0 | ||||
| -rw-r--r-- | nimpb/nimpb.nim (renamed from src/nimpb/nimpb.nim) | 0 | ||||
| -rw-r--r-- | nimpb/wkt/any_pb.nim (renamed from src/nimpb/wkt/any_pb.nim) | 1 | ||||
| -rw-r--r-- | nimpb/wkt/api_pb.nim (renamed from src/nimpb/wkt/api_pb.nim) | 0 | ||||
| -rw-r--r-- | nimpb/wkt/duration_pb.nim (renamed from src/nimpb/wkt/duration_pb.nim) | 0 | ||||
| -rw-r--r-- | nimpb/wkt/empty_pb.nim (renamed from src/nimpb/wkt/empty_pb.nim) | 0 | ||||
| -rw-r--r-- | nimpb/wkt/field_mask_pb.nim (renamed from src/nimpb/wkt/field_mask_pb.nim) | 0 | ||||
| -rw-r--r-- | nimpb/wkt/source_context_pb.nim (renamed from src/nimpb/wkt/source_context_pb.nim) | 0 | ||||
| -rw-r--r-- | nimpb/wkt/struct_pb.nim (renamed from src/nimpb/wkt/struct_pb.nim) | 0 | ||||
| -rw-r--r-- | nimpb/wkt/timestamp_pb.nim (renamed from src/nimpb/wkt/timestamp_pb.nim) | 0 | ||||
| -rw-r--r-- | nimpb/wkt/type_pb.nim (renamed from src/nimpb/wkt/type_pb.nim) | 0 | ||||
| -rw-r--r-- | nimpb/wkt/wrappers_pb.nim (renamed from src/nimpb/wkt/wrappers_pb.nim) | 0 | ||||
| -rw-r--r-- | tests/nim.cfg | 2 |
18 files changed, 6026 insertions, 3 deletions
diff --git a/nimpb.nimble b/nimpb.nimble index 80c6acc..067245e 100644 --- a/nimpb.nimble +++ b/nimpb.nimble @@ -2,6 +2,15 @@ version = "0.1.0" author = "Oskari Timperi" description = "protobuf library for Nim" license = "MIT" -srcDir = "src" + +skipDirs = @["examples", "tests"] + +bin = @["nimpb/compiler/nimpb_build"] requires "nim >= 0.18.0" + +# Hard dependency for now. In the future we could make nimpb_protoc download +# stuff on-demand which would make the dependency a bit lighter. Especially +# if a user already has the protoc compiler somewhere, in which case +# nimpb_protoc might be unnecessary. +requires "nimpb_protoc" diff --git a/nimpb/compiler/compiler.nim b/nimpb/compiler/compiler.nim new file mode 100644 index 0000000..c44ade6 --- /dev/null +++ b/nimpb/compiler/compiler.nim @@ -0,0 +1,86 @@ +import macros +import os +import osproc +import strformat +import strutils + +from generator import processFileDescriptorSet, ServiceGenerator, Service, ServiceMethod +export Service, ServiceMethod + +const + nimpbProtocInfo = gorgeEx("nimble dump nimpb_protoc") + isNimpbProtocAvailable = nimpbProtocInfo[1] == 0 + +when isNimpbProtocAvailable: + import nimpb_protoc + +proc findCompiler*(): string = + result = "" + + if existsEnv("NIMPB_PROTOC"): + result = getEnv("NIMPB_PROTOC") + if not fileExists(result): + result = "" + + if result == "": + result = findExe("protoc") + + when isNimpbProtocAvailable: + if result == "": + result = nimpb_protoc.getCompilerPath() + + if result == "": + let msg = """ +error: protoc compiler not found + +Now you have three options to make this work: + +1. Tell me the full path to the protoc executable by using NIMPB_PROTOC + environment variable + +2. You can also make sure that protoc is in PATH, which will make me find it + +3. Install nimpb_protoc with nimble, which includes the protoc compiler for the + most common platforms (Windows, Linux, macOS) and I should be able to pick + it up after a recompile + +""" + + raise newException(Exception, msg) + +proc myTempDir(): string = + result = getTempDir() / "nimpb_protoc_tmp" + +proc compileProtos*(protos: openArray[string], + includes: openArray[string], + outdir: string, + serviceGenerator: ServiceGenerator = nil) = + let command = findCompiler() + var args: seq[string] = @[] + + var outputFilename = myTempDir() / "file-descriptor-set" + createDir(myTempDir()) + + add(args, "--include_imports") + add(args, "--include_source_info") + add(args, &"-o{outputFilename}") + + for incdir in includes: + add(args, &"-I{incdir}") + + when isNimpbProtocAvailable: + add(args, &"-I{getProtoIncludeDir()}") + + for proto in protos: + add(args, proto) + + var cmdline: string = quoteShell(command) + for arg in args: + cmdline &= " " & quoteShell(arg) + + let (outp, rc) = execCmdEx(cmdline) + + if rc != 0: + raise newException(Exception, outp) + + processFileDescriptorSet(outputFilename, outdir, protos, serviceGenerator) diff --git a/nimpb/compiler/descriptor_pb.nim b/nimpb/compiler/descriptor_pb.nim new file mode 100644 index 0000000..968ff57 --- /dev/null +++ b/nimpb/compiler/descriptor_pb.nim @@ -0,0 +1,4801 @@ +# Generated by protoc_gen_nim. Do not edit! + +import intsets + +import ../nimpb + +type + google_protobuf_FieldDescriptorProto_Type* {.pure.} = enum + TYPE_DOUBLE = 1 + TYPE_FLOAT = 2 + TYPE_INT64 = 3 + TYPE_UINT64 = 4 + TYPE_INT32 = 5 + TYPE_FIXED64 = 6 + TYPE_FIXED32 = 7 + TYPE_BOOL = 8 + TYPE_STRING = 9 + TYPE_GROUP = 10 + TYPE_MESSAGE = 11 + TYPE_BYTES = 12 + TYPE_UINT32 = 13 + TYPE_ENUM = 14 + TYPE_SFIXED32 = 15 + TYPE_SFIXED64 = 16 + TYPE_SINT32 = 17 + TYPE_SINT64 = 18 + google_protobuf_FieldDescriptorProto_Label* {.pure.} = enum + LABEL_OPTIONAL = 1 + LABEL_REQUIRED = 2 + LABEL_REPEATED = 3 + google_protobuf_FileOptions_OptimizeMode* {.pure.} = enum + SPEED = 1 + CODE_SIZE = 2 + LITE_RUNTIME = 3 + google_protobuf_FieldOptions_CType* {.pure.} = enum + STRING = 0 + CORD = 1 + STRING_PIECE = 2 + google_protobuf_FieldOptions_JSType* {.pure.} = enum + JS_NORMAL = 0 + JS_STRING = 1 + JS_NUMBER = 2 + google_protobuf_MethodOptions_IdempotencyLevel* {.pure.} = enum + IDEMPOTENCY_UNKNOWN = 0 + NO_SIDE_EFFECTS = 1 + IDEMPOTENT = 2 + google_protobuf_FileDescriptorSet* = ref google_protobuf_FileDescriptorSetObj + google_protobuf_FileDescriptorSetObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + file: seq[google_protobuf_FileDescriptorProto] + google_protobuf_FileDescriptorProto* = ref google_protobuf_FileDescriptorProtoObj + google_protobuf_FileDescriptorProtoObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + name: string + package: string + dependency: seq[string] + public_dependency: seq[int32] + weak_dependency: seq[int32] + message_type: seq[google_protobuf_DescriptorProto] + enum_type: seq[google_protobuf_EnumDescriptorProto] + service: seq[google_protobuf_ServiceDescriptorProto] + extension: seq[google_protobuf_FieldDescriptorProto] + options: google_protobuf_FileOptions + source_code_info: google_protobuf_SourceCodeInfo + syntax: string + google_protobuf_DescriptorProto* = ref google_protobuf_DescriptorProtoObj + google_protobuf_DescriptorProtoObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + name: string + field: seq[google_protobuf_FieldDescriptorProto] + extension: seq[google_protobuf_FieldDescriptorProto] + nested_type: seq[google_protobuf_DescriptorProto] + enum_type: seq[google_protobuf_EnumDescriptorProto] + extension_range: seq[google_protobuf_DescriptorProto_ExtensionRange] + oneof_decl: seq[google_protobuf_OneofDescriptorProto] + options: google_protobuf_MessageOptions + reserved_range: seq[google_protobuf_DescriptorProto_ReservedRange] + reserved_name: seq[string] + google_protobuf_DescriptorProto_ReservedRange* = ref google_protobuf_DescriptorProto_ReservedRangeObj + google_protobuf_DescriptorProto_ReservedRangeObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + start: int32 + fend: int32 + google_protobuf_DescriptorProto_ExtensionRange* = ref google_protobuf_DescriptorProto_ExtensionRangeObj + google_protobuf_DescriptorProto_ExtensionRangeObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + start: int32 + fend: int32 + options: google_protobuf_ExtensionRangeOptions + google_protobuf_ExtensionRangeOptions* = ref google_protobuf_ExtensionRangeOptionsObj + google_protobuf_ExtensionRangeOptionsObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + uninterpreted_option: seq[google_protobuf_UninterpretedOption] + google_protobuf_FieldDescriptorProto* = ref google_protobuf_FieldDescriptorProtoObj + google_protobuf_FieldDescriptorProtoObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + name: string + number: int32 + label: google_protobuf_FieldDescriptorProto_Label + ftype: google_protobuf_FieldDescriptorProto_Type + type_name: string + extendee: string + default_value: string + oneof_index: int32 + json_name: string + options: google_protobuf_FieldOptions + google_protobuf_OneofDescriptorProto* = ref google_protobuf_OneofDescriptorProtoObj + google_protobuf_OneofDescriptorProtoObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + name: string + options: google_protobuf_OneofOptions + google_protobuf_EnumDescriptorProto* = ref google_protobuf_EnumDescriptorProtoObj + google_protobuf_EnumDescriptorProtoObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + name: string + value: seq[google_protobuf_EnumValueDescriptorProto] + options: google_protobuf_EnumOptions + reserved_range: seq[google_protobuf_EnumDescriptorProto_EnumReservedRange] + reserved_name: seq[string] + google_protobuf_EnumDescriptorProto_EnumReservedRange* = ref google_protobuf_EnumDescriptorProto_EnumReservedRangeObj + google_protobuf_EnumDescriptorProto_EnumReservedRangeObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + start: int32 + fend: int32 + google_protobuf_EnumValueDescriptorProto* = ref google_protobuf_EnumValueDescriptorProtoObj + google_protobuf_EnumValueDescriptorProtoObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + name: string + number: int32 + options: google_protobuf_EnumValueOptions + google_protobuf_ServiceDescriptorProto* = ref google_protobuf_ServiceDescriptorProtoObj + google_protobuf_ServiceDescriptorProtoObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + name: string + fmethod: seq[google_protobuf_MethodDescriptorProto] + options: google_protobuf_ServiceOptions + google_protobuf_MethodDescriptorProto* = ref google_protobuf_MethodDescriptorProtoObj + google_protobuf_MethodDescriptorProtoObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + name: string + input_type: string + output_type: string + options: google_protobuf_MethodOptions + client_streaming: bool + server_streaming: bool + google_protobuf_FileOptions* = ref google_protobuf_FileOptionsObj + google_protobuf_FileOptionsObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + java_package: string + java_outer_classname: string + java_multiple_files: bool + java_generate_equals_and_hash: bool + java_string_check_utf8: bool + optimize_for: google_protobuf_FileOptions_OptimizeMode + go_package: string + cc_generic_services: bool + java_generic_services: bool + py_generic_services: bool + php_generic_services: bool + deprecated: bool + cc_enable_arenas: bool + objc_class_prefix: string + csharp_namespace: string + swift_prefix: string + php_class_prefix: string + php_namespace: string + uninterpreted_option: seq[google_protobuf_UninterpretedOption] + google_protobuf_MessageOptions* = ref google_protobuf_MessageOptionsObj + google_protobuf_MessageOptionsObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + message_set_wire_format: bool + no_standard_descriptor_accessor: bool + deprecated: bool + map_entry: bool + uninterpreted_option: seq[google_protobuf_UninterpretedOption] + google_protobuf_FieldOptions* = ref google_protobuf_FieldOptionsObj + google_protobuf_FieldOptionsObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + ctype: google_protobuf_FieldOptions_CType + packed: bool + jstype: google_protobuf_FieldOptions_JSType + lazy: bool + deprecated: bool + weak: bool + uninterpreted_option: seq[google_protobuf_UninterpretedOption] + google_protobuf_OneofOptions* = ref google_protobuf_OneofOptionsObj + google_protobuf_OneofOptionsObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + uninterpreted_option: seq[google_protobuf_UninterpretedOption] + google_protobuf_EnumOptions* = ref google_protobuf_EnumOptionsObj + google_protobuf_EnumOptionsObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + allow_alias: bool + deprecated: bool + uninterpreted_option: seq[google_protobuf_UninterpretedOption] + google_protobuf_EnumValueOptions* = ref google_protobuf_EnumValueOptionsObj + google_protobuf_EnumValueOptionsObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + deprecated: bool + uninterpreted_option: seq[google_protobuf_UninterpretedOption] + google_protobuf_ServiceOptions* = ref google_protobuf_ServiceOptionsObj + google_protobuf_ServiceOptionsObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + deprecated: bool + uninterpreted_option: seq[google_protobuf_UninterpretedOption] + google_protobuf_MethodOptions* = ref google_protobuf_MethodOptionsObj + google_protobuf_MethodOptionsObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + deprecated: bool + idempotency_level: google_protobuf_MethodOptions_IdempotencyLevel + uninterpreted_option: seq[google_protobuf_UninterpretedOption] + google_protobuf_UninterpretedOption* = ref google_protobuf_UninterpretedOptionObj + google_protobuf_UninterpretedOptionObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + name: seq[google_protobuf_UninterpretedOption_NamePart] + identifier_value: string + positive_int_value: uint64 + negative_int_value: int64 + double_value: float64 + string_value: bytes + aggregate_value: string + google_protobuf_UninterpretedOption_NamePart* = ref google_protobuf_UninterpretedOption_NamePartObj + google_protobuf_UninterpretedOption_NamePartObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + name_part: string + is_extension: bool + google_protobuf_SourceCodeInfo* = ref google_protobuf_SourceCodeInfoObj + google_protobuf_SourceCodeInfoObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + location: seq[google_protobuf_SourceCodeInfo_Location] + google_protobuf_SourceCodeInfo_Location* = ref google_protobuf_SourceCodeInfo_LocationObj + google_protobuf_SourceCodeInfo_LocationObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + path: seq[int32] + span: seq[int32] + leading_comments: string + trailing_comments: string + leading_detached_comments: seq[string] + google_protobuf_GeneratedCodeInfo* = ref google_protobuf_GeneratedCodeInfoObj + google_protobuf_GeneratedCodeInfoObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + annotation: seq[google_protobuf_GeneratedCodeInfo_Annotation] + google_protobuf_GeneratedCodeInfo_Annotation* = ref google_protobuf_GeneratedCodeInfo_AnnotationObj + google_protobuf_GeneratedCodeInfo_AnnotationObj* = object of RootObj + hasField: IntSet + unknownFields: seq[UnknownField] + path: seq[int32] + source_file: string + begin: int32 + fend: int32 + +proc newgoogle_protobuf_UninterpretedOption_NamePart*(): google_protobuf_UninterpretedOption_NamePart +proc newgoogle_protobuf_UninterpretedOption_NamePart*(data: string): google_protobuf_UninterpretedOption_NamePart +proc writegoogle_protobuf_UninterpretedOption_NamePart*(stream: ProtobufStream, message: google_protobuf_UninterpretedOption_NamePart) +proc readgoogle_protobuf_UninterpretedOption_NamePart*(stream: ProtobufStream): google_protobuf_UninterpretedOption_NamePart +proc sizeOfgoogle_protobuf_UninterpretedOption_NamePart*(message: google_protobuf_UninterpretedOption_NamePart): uint64 + +proc newgoogle_protobuf_UninterpretedOption*(): google_protobuf_UninterpretedOption +proc newgoogle_protobuf_UninterpretedOption*(data: string): google_protobuf_UninterpretedOption +proc writegoogle_protobuf_UninterpretedOption*(stream: ProtobufStream, message: google_protobuf_UninterpretedOption) +proc readgoogle_protobuf_UninterpretedOption*(stream: ProtobufStream): google_protobuf_UninterpretedOption +proc sizeOfgoogle_protobuf_UninterpretedOption*(message: google_protobuf_UninterpretedOption): uint64 + +proc newgoogle_protobuf_EnumValueOptions*(): google_protobuf_EnumValueOptions +proc newgoogle_protobuf_EnumValueOptions*(data: string): google_protobuf_EnumValueOptions +proc writegoogle_protobuf_EnumValueOptions*(stream: ProtobufStream, message: google_protobuf_EnumValueOptions) +proc readgoogle_protobuf_EnumValueOptions*(stream: ProtobufStream): google_protobuf_EnumValueOptions +proc sizeOfgoogle_protobuf_EnumValueOptions*(message: google_protobuf_EnumValueOptions): uint64 + +proc newgoogle_protobuf_EnumValueDescriptorProto*(): google_protobuf_EnumValueDescriptorProto +proc newgoogle_protobuf_EnumValueDescriptorProto*(data: string): google_protobuf_EnumValueDescriptorProto +proc writegoogle_protobuf_EnumValueDescriptorProto*(stream: ProtobufStream, message: google_protobuf_EnumValueDescriptorProto) +proc readgoogle_protobuf_EnumValueDescriptorProto*(stream: ProtobufStream): google_protobuf_EnumValueDescriptorProto +proc sizeOfgoogle_protobuf_EnumValueDescriptorProto*(message: google_protobuf_EnumValueDescriptorProto): uint64 + +proc newgoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(): google_protobuf_EnumDescriptorProto_EnumReservedRange +proc newgoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(data: string): google_protobuf_EnumDescriptorProto_EnumReservedRange +proc writegoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(stream: ProtobufStream, message: google_protobuf_EnumDescriptorProto_EnumReservedRange) +proc readgoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(stream: ProtobufStream): google_protobuf_EnumDescriptorProto_EnumReservedRange +proc sizeOfgoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange): uint64 + +proc newgoogle_protobuf_EnumOptions*(): google_protobuf_EnumOptions +proc newgoogle_protobuf_EnumOptions*(data: string): google_protobuf_EnumOptions +proc writegoogle_protobuf_EnumOptions*(stream: ProtobufStream, message: google_protobuf_EnumOptions) +proc readgoogle_protobuf_EnumOptions*(stream: ProtobufStream): google_protobuf_EnumOptions +proc sizeOfgoogle_protobuf_EnumOptions*(message: google_protobuf_EnumOptions): uint64 + +proc newgoogle_protobuf_EnumDescriptorProto*(): google_protobuf_EnumDescriptorProto +proc newgoogle_protobuf_EnumDescriptorProto*(data: string): google_protobuf_EnumDescriptorProto +proc writegoogle_protobuf_EnumDescriptorProto*(stream: ProtobufStream, message: google_protobuf_EnumDescriptorProto) +proc readgoogle_protobuf_EnumDescriptorProto*(stream: ProtobufStream): google_protobuf_EnumDescriptorProto +proc sizeOfgoogle_protobuf_EnumDescriptorProto*(message: google_protobuf_EnumDescriptorProto): uint64 + +proc newgoogle_protobuf_ExtensionRangeOptions*(): google_protobuf_ExtensionRangeOptions +proc newgoogle_protobuf_ExtensionRangeOptions*(data: string): google_protobuf_ExtensionRangeOptions +proc writegoogle_protobuf_ExtensionRangeOptions*(stream: ProtobufStream, message: google_protobuf_ExtensionRangeOptions) +proc readgoogle_protobuf_ExtensionRangeOptions*(stream: ProtobufStream): google_protobuf_ExtensionRangeOptions +proc sizeOfgoogle_protobuf_ExtensionRangeOptions*(message: google_protobuf_ExtensionRangeOptions): uint64 + +proc newgoogle_protobuf_SourceCodeInfo_Location*(): google_protobuf_SourceCodeInfo_Location +proc newgoogle_protobuf_SourceCodeInfo_Location*(data: string): google_protobuf_SourceCodeInfo_Location +proc writegoogle_protobuf_SourceCodeInfo_Location*(stream: ProtobufStream, message: google_protobuf_SourceCodeInfo_Location) +proc readgoogle_protobuf_SourceCodeInfo_Location*(stream: ProtobufStream): google_protobuf_SourceCodeInfo_Location +proc sizeOfgoogle_protobuf_SourceCodeInfo_Location*(message: google_protobuf_SourceCodeInfo_Location): uint64 + +proc newgoogle_protobuf_SourceCodeInfo*(): google_protobuf_SourceCodeInfo +proc newgoogle_protobuf_SourceCodeInfo*(data: string): google_protobuf_SourceCodeInfo +proc writegoogle_protobuf_SourceCodeInfo*(stream: ProtobufStream, message: google_protobuf_SourceCodeInfo) +proc readgoogle_protobuf_SourceCodeInfo*(stream: ProtobufStream): google_protobuf_SourceCodeInfo +proc sizeOfgoogle_protobuf_SourceCodeInfo*(message: google_protobuf_SourceCodeInfo): uint64 + +proc newgoogle_protobuf_FieldOptions*(): google_protobuf_FieldOptions +proc newgoogle_protobuf_FieldOptions*(data: string): google_protobuf_FieldOptions +proc writegoogle_protobuf_FieldOptions*(stream: ProtobufStream, message: google_protobuf_FieldOptions) +proc readgoogle_protobuf_FieldOptions*(stream: ProtobufStream): google_protobuf_FieldOptions +proc sizeOfgoogle_protobuf_FieldOptions*(message: google_protobuf_FieldOptions): uint64 + +proc newgoogle_protobuf_FieldDescriptorProto*(): google_protobuf_FieldDescriptorProto +proc newgoogle_protobuf_FieldDescriptorProto*(data: string): google_protobuf_FieldDescriptorProto +proc writegoogle_protobuf_FieldDescriptorProto*(stream: ProtobufStream, message: google_protobuf_FieldDescriptorProto) +proc readgoogle_protobuf_FieldDescriptorProto*(stream: ProtobufStream): google_protobuf_FieldDescriptorProto +proc sizeOfgoogle_protobuf_FieldDescriptorProto*(message: google_protobuf_FieldDescriptorProto): uint64 + +proc newgoogle_protobuf_DescriptorProto_ExtensionRange*(): google_protobuf_DescriptorProto_ExtensionRange +proc newgoogle_protobuf_DescriptorProto_ExtensionRange*(data: string): google_protobuf_DescriptorProto_ExtensionRange +proc writegoogle_protobuf_DescriptorProto_ExtensionRange*(stream: ProtobufStream, message: google_protobuf_DescriptorProto_ExtensionRange) +proc readgoogle_protobuf_DescriptorProto_ExtensionRange*(stream: ProtobufStream): google_protobuf_DescriptorProto_ExtensionRange +proc sizeOfgoogle_protobuf_DescriptorProto_ExtensionRange*(message: google_protobuf_DescriptorProto_ExtensionRange): uint64 + +proc newgoogle_protobuf_MessageOptions*(): google_protobuf_MessageOptions +proc newgoogle_protobuf_MessageOptions*(data: string): google_protobuf_MessageOptions +proc writegoogle_protobuf_MessageOptions*(stream: ProtobufStream, message: google_protobuf_MessageOptions) +proc readgoogle_protobuf_MessageOptions*(stream: ProtobufStream): google_protobuf_MessageOptions +proc sizeOfgoogle_protobuf_MessageOptions*(message: google_protobuf_MessageOptions): uint64 + +proc newgoogle_protobuf_OneofOptions*(): google_protobuf_OneofOptions +proc newgoogle_protobuf_OneofOptions*(data: string): google_protobuf_OneofOptions +proc writegoogle_protobuf_OneofOptions*(stream: ProtobufStream, message: google_protobuf_OneofOptions) +proc readgoogle_protobuf_OneofOptions*(stream: ProtobufStream): google_protobuf_OneofOptions +proc sizeOfgoogle_protobuf_OneofOptions*(message: google_protobuf_OneofOptions): uint64 + +proc newgoogle_protobuf_OneofDescriptorProto*(): google_protobuf_OneofDescriptorProto +proc newgoogle_protobuf_OneofDescriptorProto*(data: string): google_protobuf_OneofDescriptorProto +proc writegoogle_protobuf_OneofDescriptorProto*(stream: ProtobufStream, message: google_protobuf_OneofDescriptorProto) +proc readgoogle_protobuf_OneofDescriptorProto*(stream: ProtobufStream): google_protobuf_OneofDescriptorProto +proc sizeOfgoogle_protobuf_OneofDescriptorProto*(message: google_protobuf_OneofDescriptorProto): uint64 + +proc newgoogle_protobuf_DescriptorProto_ReservedRange*(): google_protobuf_DescriptorProto_ReservedRange +proc newgoogle_protobuf_DescriptorProto_ReservedRange*(data: string): google_protobuf_DescriptorProto_ReservedRange +proc writegoogle_protobuf_DescriptorProto_ReservedRange*(stream: ProtobufStream, message: google_protobuf_DescriptorProto_ReservedRange) +proc readgoogle_protobuf_DescriptorProto_ReservedRange*(stream: ProtobufStream): google_protobuf_DescriptorProto_ReservedRange +proc sizeOfgoogle_protobuf_DescriptorProto_ReservedRange*(message: google_protobuf_DescriptorProto_ReservedRange): uint64 + +proc newgoogle_protobuf_DescriptorProto*(): google_protobuf_DescriptorProto +proc newgoogle_protobuf_DescriptorProto*(data: string): google_protobuf_DescriptorProto +proc writegoogle_protobuf_DescriptorProto*(stream: ProtobufStream, message: google_protobuf_DescriptorProto) +proc readgoogle_protobuf_DescriptorProto*(stream: ProtobufStream): google_protobuf_DescriptorProto +proc sizeOfgoogle_protobuf_DescriptorProto*(message: google_protobuf_DescriptorProto): uint64 + +proc newgoogle_protobuf_FileOptions*(): google_protobuf_FileOptions +proc newgoogle_protobuf_FileOptions*(data: string): google_protobuf_FileOptions +proc writegoogle_protobuf_FileOptions*(stream: ProtobufStream, message: google_protobuf_FileOptions) +proc readgoogle_protobuf_FileOptions*(stream: ProtobufStream): google_protobuf_FileOptions +proc sizeOfgoogle_protobuf_FileOptions*(message: google_protobuf_FileOptions): uint64 + +proc newgoogle_protobuf_ServiceOptions*(): google_protobuf_ServiceOptions +proc newgoogle_protobuf_ServiceOptions*(data: string): google_protobuf_ServiceOptions +proc writegoogle_protobuf_ServiceOptions*(stream: ProtobufStream, message: google_protobuf_ServiceOptions) +proc readgoogle_protobuf_ServiceOptions*(stream: ProtobufStream): google_protobuf_ServiceOptions +proc sizeOfgoogle_protobuf_ServiceOptions*(message: google_protobuf_ServiceOptions): uint64 + +proc newgoogle_protobuf_MethodOptions*(): google_protobuf_MethodOptions +proc newgoogle_protobuf_MethodOptions*(data: string): google_protobuf_MethodOptions +proc writegoogle_protobuf_MethodOptions*(stream: ProtobufStream, message: google_protobuf_MethodOptions) +proc readgoogle_protobuf_MethodOptions*(stream: ProtobufStream): google_protobuf_MethodOptions +proc sizeOfgoogle_protobuf_MethodOptions*(message: google_protobuf_MethodOptions): uint64 + +proc newgoogle_protobuf_MethodDescriptorProto*(): google_protobuf_MethodDescriptorProto +proc newgoogle_protobuf_MethodDescriptorProto*(data: string): google_protobuf_MethodDescriptorProto +proc writegoogle_protobuf_MethodDescriptorProto*(stream: ProtobufStream, message: google_protobuf_MethodDescriptorProto) +proc readgoogle_protobuf_MethodDescriptorProto*(stream: ProtobufStream): google_protobuf_MethodDescriptorProto +proc sizeOfgoogle_protobuf_MethodDescriptorProto*(message: google_protobuf_MethodDescriptorProto): uint64 + +proc newgoogle_protobuf_ServiceDescriptorProto*(): google_protobuf_ServiceDescriptorProto +proc newgoogle_protobuf_ServiceDescriptorProto*(data: string): google_protobuf_ServiceDescriptorProto +proc writegoogle_protobuf_ServiceDescriptorProto*(stream: ProtobufStream, message: google_protobuf_ServiceDescriptorProto) +proc readgoogle_protobuf_ServiceDescriptorProto*(stream: ProtobufStream): google_protobuf_ServiceDescriptorProto +proc sizeOfgoogle_protobuf_ServiceDescriptorProto*(message: google_protobuf_ServiceDescriptorProto): uint64 + +proc newgoogle_protobuf_FileDescriptorProto*(): google_protobuf_FileDescriptorProto +proc newgoogle_protobuf_FileDescriptorProto*(data: string): google_protobuf_FileDescriptorProto +proc writegoogle_protobuf_FileDescriptorProto*(stream: ProtobufStream, message: google_protobuf_FileDescriptorProto) +proc readgoogle_protobuf_FileDescriptorProto*(stream: ProtobufStream): google_protobuf_FileDescriptorProto +proc sizeOfgoogle_protobuf_FileDescriptorProto*(message: google_protobuf_FileDescriptorProto): uint64 + +proc newgoogle_protobuf_FileDescriptorSet*(): google_protobuf_FileDescriptorSet +proc newgoogle_protobuf_FileDescriptorSet*(data: string): google_protobuf_FileDescriptorSet +proc writegoogle_protobuf_FileDescriptorSet*(stream: ProtobufStream, message: google_protobuf_FileDescriptorSet) +proc readgoogle_protobuf_FileDescriptorSet*(stream: ProtobufStream): google_protobuf_FileDescriptorSet +proc sizeOfgoogle_protobuf_FileDescriptorSet*(message: google_protobuf_FileDescriptorSet): uint64 + +proc newgoogle_protobuf_GeneratedCodeInfo_Annotation*(): google_protobuf_GeneratedCodeInfo_Annotation +proc newgoogle_protobuf_GeneratedCodeInfo_Annotation*(data: string): google_protobuf_GeneratedCodeInfo_Annotation +proc writegoogle_protobuf_GeneratedCodeInfo_Annotation*(stream: ProtobufStream, message: google_protobuf_GeneratedCodeInfo_Annotation) +proc readgoogle_protobuf_GeneratedCodeInfo_Annotation*(stream: ProtobufStream): google_protobuf_GeneratedCodeInfo_Annotation +proc sizeOfgoogle_protobuf_GeneratedCodeInfo_Annotation*(message: google_protobuf_GeneratedCodeInfo_Annotation): uint64 + +proc newgoogle_protobuf_GeneratedCodeInfo*(): google_protobuf_GeneratedCodeInfo +proc newgoogle_protobuf_GeneratedCodeInfo*(data: string): google_protobuf_GeneratedCodeInfo +proc writegoogle_protobuf_GeneratedCodeInfo*(stream: ProtobufStream, message: google_protobuf_GeneratedCodeInfo) +proc readgoogle_protobuf_GeneratedCodeInfo*(stream: ProtobufStream): google_protobuf_GeneratedCodeInfo +proc sizeOfgoogle_protobuf_GeneratedCodeInfo*(message: google_protobuf_GeneratedCodeInfo): uint64 + +proc newgoogle_protobuf_UninterpretedOption_NamePart*(): google_protobuf_UninterpretedOption_NamePart = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.name_part = "" + result.is_extension = false + +proc clearname_part*(message: google_protobuf_UninterpretedOption_NamePart) = + message.name_part = "" + excl(message.hasField, [1]) + +proc hasname_part*(message: google_protobuf_UninterpretedOption_NamePart): bool = + result = contains(message.hasField, 1) + +proc setname_part*(message: google_protobuf_UninterpretedOption_NamePart, value: string) = + message.name_part = value + incl(message.hasField, 1) + +proc name_part*(message: google_protobuf_UninterpretedOption_NamePart): string {.inline.} = + message.name_part + +proc `name_part=`*(message: google_protobuf_UninterpretedOption_NamePart, value: string) {.inline.} = + setname_part(message, value) + +proc clearis_extension*(message: google_protobuf_UninterpretedOption_NamePart) = + message.is_extension = false + excl(message.hasField, [2]) + +proc hasis_extension*(message: google_protobuf_UninterpretedOption_NamePart): bool = + result = contains(message.hasField, 2) + +proc setis_extension*(message: google_protobuf_UninterpretedOption_NamePart, value: bool) = + message.is_extension = value + incl(message.hasField, 2) + +proc is_extension*(message: google_protobuf_UninterpretedOption_NamePart): bool {.inline.} = + message.is_extension + +proc `is_extension=`*(message: google_protobuf_UninterpretedOption_NamePart, value: bool) {.inline.} = + setis_extension(message, value) + +proc sizeOfgoogle_protobuf_UninterpretedOption_NamePart*(message: google_protobuf_UninterpretedOption_NamePart): uint64 = + if hasname_part(message): + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfString(message.name_part) + if hasis_extension(message): + result = result + sizeOfTag(2, WireType.Varint) + result = result + sizeOfBool(message.is_extension) + +proc writegoogle_protobuf_UninterpretedOption_NamePart*(stream: ProtobufStream, message: google_protobuf_UninterpretedOption_NamePart) = + if hasname_part(message): + writeString(stream, message.name_part, 1) + if hasis_extension(message): + writeBool(stream, message.is_extension, 2) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_UninterpretedOption_NamePart*(stream: ProtobufStream): google_protobuf_UninterpretedOption_NamePart = + result = newgoogle_protobuf_UninterpretedOption_NamePart() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.LengthDelimited) + setname_part(result, readString(stream)) + of 2: + expectWireType(wireType, WireType.Varint) + setis_extension(result, readBool(stream)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_UninterpretedOption_NamePart): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_UninterpretedOption_NamePart(pbs, message) + result = ss.data + +proc newgoogle_protobuf_UninterpretedOption_NamePart*(data: string): google_protobuf_UninterpretedOption_NamePart = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_UninterpretedOption_NamePart(pbs) + + +proc newgoogle_protobuf_UninterpretedOption*(): google_protobuf_UninterpretedOption = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.name = @[] + result.identifier_value = "" + result.positive_int_value = 0 + result.negative_int_value = 0 + result.double_value = 0 + result.string_value = bytes("") + result.aggregate_value = "" + +proc clearname*(message: google_protobuf_UninterpretedOption) = + message.name = @[] + excl(message.hasField, [2]) + +proc hasname*(message: google_protobuf_UninterpretedOption): bool = + result = contains(message.hasField, 2) or (len(message.name) > 0) + +proc setname*(message: google_protobuf_UninterpretedOption, value: seq[google_protobuf_UninterpretedOption_NamePart]) = + message.name = value + incl(message.hasField, 2) + +proc addname*(message: google_protobuf_UninterpretedOption, value: google_protobuf_UninterpretedOption_NamePart) = + add(message.name, value) + incl(message.hasField, 2) + +proc name*(message: google_protobuf_UninterpretedOption): seq[google_protobuf_UninterpretedOption_NamePart] {.inline.} = + message.name + +proc `name=`*(message: google_protobuf_UninterpretedOption, value: seq[google_protobuf_UninterpretedOption_NamePart]) {.inline.} = + setname(message, value) + +proc clearidentifier_value*(message: google_protobuf_UninterpretedOption) = + message.identifier_value = "" + excl(message.hasField, [3]) + +proc hasidentifier_value*(message: google_protobuf_UninterpretedOption): bool = + result = contains(message.hasField, 3) + +proc setidentifier_value*(message: google_protobuf_UninterpretedOption, value: string) = + message.identifier_value = value + incl(message.hasField, 3) + +proc identifier_value*(message: google_protobuf_UninterpretedOption): string {.inline.} = + message.identifier_value + +proc `identifier_value=`*(message: google_protobuf_UninterpretedOption, value: string) {.inline.} = + setidentifier_value(message, value) + +proc clearpositive_int_value*(message: google_protobuf_UninterpretedOption) = + message.positive_int_value = 0 + excl(message.hasField, [4]) + +proc haspositive_int_value*(message: google_protobuf_UninterpretedOption): bool = + result = contains(message.hasField, 4) + +proc setpositive_int_value*(message: google_protobuf_UninterpretedOption, value: uint64) = + message.positive_int_value = value + incl(message.hasField, 4) + +proc positive_int_value*(message: google_protobuf_UninterpretedOption): uint64 {.inline.} = + message.positive_int_value + +proc `positive_int_value=`*(message: google_protobuf_UninterpretedOption, value: uint64) {.inline.} = + setpositive_int_value(message, value) + +proc clearnegative_int_value*(message: google_protobuf_UninterpretedOption) = + message.negative_int_value = 0 + excl(message.hasField, [5]) + +proc hasnegative_int_value*(message: google_protobuf_UninterpretedOption): bool = + result = contains(message.hasField, 5) + +proc setnegative_int_value*(message: google_protobuf_UninterpretedOption, value: int64) = + message.negative_int_value = value + incl(message.hasField, 5) + +proc negative_int_value*(message: google_protobuf_UninterpretedOption): int64 {.inline.} = + message.negative_int_value + +proc `negative_int_value=`*(message: google_protobuf_UninterpretedOption, value: int64) {.inline.} = + setnegative_int_value(message, value) + +proc cleardouble_value*(message: google_protobuf_UninterpretedOption) = + message.double_value = 0 + excl(message.hasField, [6]) + +proc hasdouble_value*(message: google_protobuf_UninterpretedOption): bool = + result = contains(message.hasField, 6) + +proc setdouble_value*(message: google_protobuf_UninterpretedOption, value: float64) = + message.double_value = value + incl(message.hasField, 6) + +proc double_value*(message: google_protobuf_UninterpretedOption): float64 {.inline.} = + message.double_value + +proc `double_value=`*(message: google_protobuf_UninterpretedOption, value: float64) {.inline.} = + setdouble_value(message, value) + +proc clearstring_value*(message: google_protobuf_UninterpretedOption) = + message.string_value = bytes("") + excl(message.hasField, [7]) + +proc hasstring_value*(message: google_protobuf_UninterpretedOption): bool = + result = contains(message.hasField, 7) + +proc setstring_value*(message: google_protobuf_UninterpretedOption, value: bytes) = + message.string_value = value + incl(message.hasField, 7) + +proc string_value*(message: google_protobuf_UninterpretedOption): bytes {.inline.} = + message.string_value + +proc `string_value=`*(message: google_protobuf_UninterpretedOption, value: bytes) {.inline.} = + setstring_value(message, value) + +proc clearaggregate_value*(message: google_protobuf_UninterpretedOption) = + message.aggregate_value = "" + excl(message.hasField, [8]) + +proc hasaggregate_value*(message: google_protobuf_UninterpretedOption): bool = + result = contains(message.hasField, 8) + +proc setaggregate_value*(message: google_protobuf_UninterpretedOption, value: string) = + message.aggregate_value = value + incl(message.hasField, 8) + +proc aggregate_value*(message: google_protobuf_UninterpretedOption): string {.inline.} = + message.aggregate_value + +proc `aggregate_value=`*(message: google_protobuf_UninterpretedOption, value: string) {.inline.} = + setaggregate_value(message, value) + +proc sizeOfgoogle_protobuf_UninterpretedOption*(message: google_protobuf_UninterpretedOption): uint64 = + for value in message.name: + result = result + sizeOfTag(2, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_UninterpretedOption_NamePart(value)) + if hasidentifier_value(message): + result = result + sizeOfTag(3, WireType.LengthDelimited) + result = result + sizeOfString(message.identifier_value) + if haspositive_int_value(message): + result = result + sizeOfTag(4, WireType.Varint) + result = result + sizeOfUInt64(message.positive_int_value) + if hasnegative_int_value(message): + result = result + sizeOfTag(5, WireType.Varint) + result = result + sizeOfInt64(message.negative_int_value) + if hasdouble_value(message): + result = result + sizeOfTag(6, WireType.Fixed64) + result = result + sizeOfDouble(message.double_value) + if hasstring_value(message): + result = result + sizeOfTag(7, WireType.LengthDelimited) + result = result + sizeOfBytes(message.string_value) + if hasaggregate_value(message): + result = result + sizeOfTag(8, WireType.LengthDelimited) + result = result + sizeOfString(message.aggregate_value) + +proc writegoogle_protobuf_UninterpretedOption*(stream: ProtobufStream, message: google_protobuf_UninterpretedOption) = + for value in message.name: + writeMessage(stream, value, 2) + if hasidentifier_value(message): + writeString(stream, message.identifier_value, 3) + if haspositive_int_value(message): + writeUInt64(stream, message.positive_int_value, 4) + if hasnegative_int_value(message): + writeInt64(stream, message.negative_int_value, 5) + if hasdouble_value(message): + writeDouble(stream, message.double_value, 6) + if hasstring_value(message): + writeBytes(stream, message.string_value, 7) + if hasaggregate_value(message): + writeString(stream, message.aggregate_value, 8) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_UninterpretedOption*(stream: ProtobufStream): google_protobuf_UninterpretedOption = + result = newgoogle_protobuf_UninterpretedOption() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 2: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addname(result, newgoogle_protobuf_UninterpretedOption_NamePart(data)) + of 3: + expectWireType(wireType, WireType.LengthDelimited) + setidentifier_value(result, readString(stream)) + of 4: + expectWireType(wireType, WireType.Varint) + setpositive_int_value(result, readUInt64(stream)) + of 5: + expectWireType(wireType, WireType.Varint) + setnegative_int_value(result, readInt64(stream)) + of 6: + expectWireType(wireType, WireType.Fixed64) + setdouble_value(result, readDouble(stream)) + of 7: + expectWireType(wireType, WireType.LengthDelimited) + setstring_value(result, readBytes(stream)) + of 8: + expectWireType(wireType, WireType.LengthDelimited) + setaggregate_value(result, readString(stream)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_UninterpretedOption): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_UninterpretedOption(pbs, message) + result = ss.data + +proc newgoogle_protobuf_UninterpretedOption*(data: string): google_protobuf_UninterpretedOption = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_UninterpretedOption(pbs) + + +proc newgoogle_protobuf_EnumValueOptions*(): google_protobuf_EnumValueOptions = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.deprecated = false + result.uninterpreted_option = @[] + +proc cleardeprecated*(message: google_protobuf_EnumValueOptions) = + message.deprecated = false + excl(message.hasField, [1]) + +proc hasdeprecated*(message: google_protobuf_EnumValueOptions): bool = + result = contains(message.hasField, 1) + +proc setdeprecated*(message: google_protobuf_EnumValueOptions, value: bool) = + message.deprecated = value + incl(message.hasField, 1) + +proc deprecated*(message: google_protobuf_EnumValueOptions): bool {.inline.} = + message.deprecated + +proc `deprecated=`*(message: google_protobuf_EnumValueOptions, value: bool) {.inline.} = + setdeprecated(message, value) + +proc clearuninterpreted_option*(message: google_protobuf_EnumValueOptions) = + message.uninterpreted_option = @[] + excl(message.hasField, [999]) + +proc hasuninterpreted_option*(message: google_protobuf_EnumValueOptions): bool = + result = contains(message.hasField, 999) or (len(message.uninterpreted_option) > 0) + +proc setuninterpreted_option*(message: google_protobuf_EnumValueOptions, value: seq[google_protobuf_UninterpretedOption]) = + message.uninterpreted_option = value + incl(message.hasField, 999) + +proc adduninterpreted_option*(message: google_protobuf_EnumValueOptions, value: google_protobuf_UninterpretedOption) = + add(message.uninterpreted_option, value) + incl(message.hasField, 999) + +proc uninterpreted_option*(message: google_protobuf_EnumValueOptions): seq[google_protobuf_UninterpretedOption] {.inline.} = + message.uninterpreted_option + +proc `uninterpreted_option=`*(message: google_protobuf_EnumValueOptions, value: seq[google_protobuf_UninterpretedOption]) {.inline.} = + setuninterpreted_option(message, value) + +proc sizeOfgoogle_protobuf_EnumValueOptions*(message: google_protobuf_EnumValueOptions): uint64 = + if hasdeprecated(message): + result = result + sizeOfTag(1, WireType.Varint) + result = result + sizeOfBool(message.deprecated) + for value in message.uninterpreted_option: + result = result + sizeOfTag(999, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_UninterpretedOption(value)) + +proc writegoogle_protobuf_EnumValueOptions*(stream: ProtobufStream, message: google_protobuf_EnumValueOptions) = + if hasdeprecated(message): + writeBool(stream, message.deprecated, 1) + for value in message.uninterpreted_option: + writeMessage(stream, value, 999) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_EnumValueOptions*(stream: ProtobufStream): google_protobuf_EnumValueOptions = + result = newgoogle_protobuf_EnumValueOptions() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.Varint) + setdeprecated(result, readBool(stream)) + of 999: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + adduninterpreted_option(result, newgoogle_protobuf_UninterpretedOption(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_EnumValueOptions): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_EnumValueOptions(pbs, message) + result = ss.data + +proc newgoogle_protobuf_EnumValueOptions*(data: string): google_protobuf_EnumValueOptions = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_EnumValueOptions(pbs) + + +proc newgoogle_protobuf_EnumValueDescriptorProto*(): google_protobuf_EnumValueDescriptorProto = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.name = "" + result.number = 0 + result.options = nil + +proc clearname*(message: google_protobuf_EnumValueDescriptorProto) = + message.name = "" + excl(message.hasField, [1]) + +proc hasname*(message: google_protobuf_EnumValueDescriptorProto): bool = + result = contains(message.hasField, 1) + +proc setname*(message: google_protobuf_EnumValueDescriptorProto, value: string) = + message.name = value + incl(message.hasField, 1) + +proc name*(message: google_protobuf_EnumValueDescriptorProto): string {.inline.} = + message.name + +proc `name=`*(message: google_protobuf_EnumValueDescriptorProto, value: string) {.inline.} = + setname(message, value) + +proc clearnumber*(message: google_protobuf_EnumValueDescriptorProto) = + message.number = 0 + excl(message.hasField, [2]) + +proc hasnumber*(message: google_protobuf_EnumValueDescriptorProto): bool = + result = contains(message.hasField, 2) + +proc setnumber*(message: google_protobuf_EnumValueDescriptorProto, value: int32) = + message.number = value + incl(message.hasField, 2) + +proc number*(message: google_protobuf_EnumValueDescriptorProto): int32 {.inline.} = + message.number + +proc `number=`*(message: google_protobuf_EnumValueDescriptorProto, value: int32) {.inline.} = + setnumber(message, value) + +proc clearoptions*(message: google_protobuf_EnumValueDescriptorProto) = + message.options = nil + excl(message.hasField, [3]) + +proc hasoptions*(message: google_protobuf_EnumValueDescriptorProto): bool = + result = contains(message.hasField, 3) + +proc setoptions*(message: google_protobuf_EnumValueDescriptorProto, value: google_protobuf_EnumValueOptions) = + message.options = value + incl(message.hasField, 3) + +proc options*(message: google_protobuf_EnumValueDescriptorProto): google_protobuf_EnumValueOptions {.inline.} = + message.options + +proc `options=`*(message: google_protobuf_EnumValueDescriptorProto, value: google_protobuf_EnumValueOptions) {.inline.} = + setoptions(message, value) + +proc sizeOfgoogle_protobuf_EnumValueDescriptorProto*(message: google_protobuf_EnumValueDescriptorProto): uint64 = + if hasname(message): + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfString(message.name) + if hasnumber(message): + result = result + sizeOfTag(2, WireType.Varint) + result = result + sizeOfInt32(message.number) + if hasoptions(message): + result = result + sizeOfTag(3, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_EnumValueOptions(message.options)) + +proc writegoogle_protobuf_EnumValueDescriptorProto*(stream: ProtobufStream, message: google_protobuf_EnumValueDescriptorProto) = + if hasname(message): + writeString(stream, message.name, 1) + if hasnumber(message): + writeInt32(stream, message.number, 2) + if hasoptions(message): + writeMessage(stream, message.options, 3) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_EnumValueDescriptorProto*(stream: ProtobufStream): google_protobuf_EnumValueDescriptorProto = + result = newgoogle_protobuf_EnumValueDescriptorProto() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.LengthDelimited) + setname(result, readString(stream)) + of 2: + expectWireType(wireType, WireType.Varint) + setnumber(result, readInt32(stream)) + of 3: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + setoptions(result, newgoogle_protobuf_EnumValueOptions(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_EnumValueDescriptorProto): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_EnumValueDescriptorProto(pbs, message) + result = ss.data + +proc newgoogle_protobuf_EnumValueDescriptorProto*(data: string): google_protobuf_EnumValueDescriptorProto = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_EnumValueDescriptorProto(pbs) + + +proc newgoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(): google_protobuf_EnumDescriptorProto_EnumReservedRange = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.start = 0 + result.fend = 0 + +proc clearstart*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange) = + message.start = 0 + excl(message.hasField, [1]) + +proc hasstart*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange): bool = + result = contains(message.hasField, 1) + +proc setstart*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange, value: int32) = + message.start = value + incl(message.hasField, 1) + +proc start*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange): int32 {.inline.} = + message.start + +proc `start=`*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange, value: int32) {.inline.} = + setstart(message, value) + +proc clearfend*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange) = + message.fend = 0 + excl(message.hasField, [2]) + +proc hasfend*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange): bool = + result = contains(message.hasField, 2) + +proc setfend*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange, value: int32) = + message.fend = value + incl(message.hasField, 2) + +proc fend*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange): int32 {.inline.} = + message.fend + +proc `fend=`*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange, value: int32) {.inline.} = + setfend(message, value) + +proc sizeOfgoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange): uint64 = + if hasstart(message): + result = result + sizeOfTag(1, WireType.Varint) + result = result + sizeOfInt32(message.start) + if hasfend(message): + result = result + sizeOfTag(2, WireType.Varint) + result = result + sizeOfInt32(message.fend) + +proc writegoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(stream: ProtobufStream, message: google_protobuf_EnumDescriptorProto_EnumReservedRange) = + if hasstart(message): + writeInt32(stream, message.start, 1) + if hasfend(message): + writeInt32(stream, message.fend, 2) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(stream: ProtobufStream): google_protobuf_EnumDescriptorProto_EnumReservedRange = + result = newgoogle_protobuf_EnumDescriptorProto_EnumReservedRange() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.Varint) + setstart(result, readInt32(stream)) + of 2: + expectWireType(wireType, WireType.Varint) + setfend(result, readInt32(stream)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_EnumDescriptorProto_EnumReservedRange): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_EnumDescriptorProto_EnumReservedRange(pbs, message) + result = ss.data + +proc newgoogle_protobuf_EnumDescriptorProto_EnumReservedRange*(data: string): google_protobuf_EnumDescriptorProto_EnumReservedRange = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_EnumDescriptorProto_EnumReservedRange(pbs) + + +proc newgoogle_protobuf_EnumOptions*(): google_protobuf_EnumOptions = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.allow_alias = false + result.deprecated = false + result.uninterpreted_option = @[] + +proc clearallow_alias*(message: google_protobuf_EnumOptions) = + message.allow_alias = false + excl(message.hasField, [2]) + +proc hasallow_alias*(message: google_protobuf_EnumOptions): bool = + result = contains(message.hasField, 2) + +proc setallow_alias*(message: google_protobuf_EnumOptions, value: bool) = + message.allow_alias = value + incl(message.hasField, 2) + +proc allow_alias*(message: google_protobuf_EnumOptions): bool {.inline.} = + message.allow_alias + +proc `allow_alias=`*(message: google_protobuf_EnumOptions, value: bool) {.inline.} = + setallow_alias(message, value) + +proc cleardeprecated*(message: google_protobuf_EnumOptions) = + message.deprecated = false + excl(message.hasField, [3]) + +proc hasdeprecated*(message: google_protobuf_EnumOptions): bool = + result = contains(message.hasField, 3) + +proc setdeprecated*(message: google_protobuf_EnumOptions, value: bool) = + message.deprecated = value + incl(message.hasField, 3) + +proc deprecated*(message: google_protobuf_EnumOptions): bool {.inline.} = + message.deprecated + +proc `deprecated=`*(message: google_protobuf_EnumOptions, value: bool) {.inline.} = + setdeprecated(message, value) + +proc clearuninterpreted_option*(message: google_protobuf_EnumOptions) = + message.uninterpreted_option = @[] + excl(message.hasField, [999]) + +proc hasuninterpreted_option*(message: google_protobuf_EnumOptions): bool = + result = contains(message.hasField, 999) or (len(message.uninterpreted_option) > 0) + +proc setuninterpreted_option*(message: google_protobuf_EnumOptions, value: seq[google_protobuf_UninterpretedOption]) = + message.uninterpreted_option = value + incl(message.hasField, 999) + +proc adduninterpreted_option*(message: google_protobuf_EnumOptions, value: google_protobuf_UninterpretedOption) = + add(message.uninterpreted_option, value) + incl(message.hasField, 999) + +proc uninterpreted_option*(message: google_protobuf_EnumOptions): seq[google_protobuf_UninterpretedOption] {.inline.} = + message.uninterpreted_option + +proc `uninterpreted_option=`*(message: google_protobuf_EnumOptions, value: seq[google_protobuf_UninterpretedOption]) {.inline.} = + setuninterpreted_option(message, value) + +proc sizeOfgoogle_protobuf_EnumOptions*(message: google_protobuf_EnumOptions): uint64 = + if hasallow_alias(message): + result = result + sizeOfTag(2, WireType.Varint) + result = result + sizeOfBool(message.allow_alias) + if hasdeprecated(message): + result = result + sizeOfTag(3, WireType.Varint) + result = result + sizeOfBool(message.deprecated) + for value in message.uninterpreted_option: + result = result + sizeOfTag(999, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_UninterpretedOption(value)) + +proc writegoogle_protobuf_EnumOptions*(stream: ProtobufStream, message: google_protobuf_EnumOptions) = + if hasallow_alias(message): + writeBool(stream, message.allow_alias, 2) + if hasdeprecated(message): + writeBool(stream, message.deprecated, 3) + for value in message.uninterpreted_option: + writeMessage(stream, value, 999) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_EnumOptions*(stream: ProtobufStream): google_protobuf_EnumOptions = + result = newgoogle_protobuf_EnumOptions() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 2: + expectWireType(wireType, WireType.Varint) + setallow_alias(result, readBool(stream)) + of 3: + expectWireType(wireType, WireType.Varint) + setdeprecated(result, readBool(stream)) + of 999: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + adduninterpreted_option(result, newgoogle_protobuf_UninterpretedOption(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_EnumOptions): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_EnumOptions(pbs, message) + result = ss.data + +proc newgoogle_protobuf_EnumOptions*(data: string): google_protobuf_EnumOptions = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_EnumOptions(pbs) + + +proc newgoogle_protobuf_EnumDescriptorProto*(): google_protobuf_EnumDescriptorProto = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.name = "" + result.value = @[] + result.options = nil + result.reserved_range = @[] + result.reserved_name = @[] + +proc clearname*(message: google_protobuf_EnumDescriptorProto) = + message.name = "" + excl(message.hasField, [1]) + +proc hasname*(message: google_protobuf_EnumDescriptorProto): bool = + result = contains(message.hasField, 1) + +proc setname*(message: google_protobuf_EnumDescriptorProto, value: string) = + message.name = value + incl(message.hasField, 1) + +proc name*(message: google_protobuf_EnumDescriptorProto): string {.inline.} = + message.name + +proc `name=`*(message: google_protobuf_EnumDescriptorProto, value: string) {.inline.} = + setname(message, value) + +proc clearvalue*(message: google_protobuf_EnumDescriptorProto) = + message.value = @[] + excl(message.hasField, [2]) + +proc hasvalue*(message: google_protobuf_EnumDescriptorProto): bool = + result = contains(message.hasField, 2) or (len(message.value) > 0) + +proc setvalue*(message: google_protobuf_EnumDescriptorProto, value: seq[google_protobuf_EnumValueDescriptorProto]) = + message.value = value + incl(message.hasField, 2) + +proc addvalue*(message: google_protobuf_EnumDescriptorProto, value: google_protobuf_EnumValueDescriptorProto) = + add(message.value, value) + incl(message.hasField, 2) + +proc value*(message: google_protobuf_EnumDescriptorProto): seq[google_protobuf_EnumValueDescriptorProto] {.inline.} = + message.value + +proc `value=`*(message: google_protobuf_EnumDescriptorProto, value: seq[google_protobuf_EnumValueDescriptorProto]) {.inline.} = + setvalue(message, value) + +proc clearoptions*(message: google_protobuf_EnumDescriptorProto) = + message.options = nil + excl(message.hasField, [3]) + +proc hasoptions*(message: google_protobuf_EnumDescriptorProto): bool = + result = contains(message.hasField, 3) + +proc setoptions*(message: google_protobuf_EnumDescriptorProto, value: google_protobuf_EnumOptions) = + message.options = value + incl(message.hasField, 3) + +proc options*(message: google_protobuf_EnumDescriptorProto): google_protobuf_EnumOptions {.inline.} = + message.options + +proc `options=`*(message: google_protobuf_EnumDescriptorProto, value: google_protobuf_EnumOptions) {.inline.} = + setoptions(message, value) + +proc clearreserved_range*(message: google_protobuf_EnumDescriptorProto) = + message.reserved_range = @[] + excl(message.hasField, [4]) + +proc hasreserved_range*(message: google_protobuf_EnumDescriptorProto): bool = + result = contains(message.hasField, 4) or (len(message.reserved_range) > 0) + +proc setreserved_range*(message: google_protobuf_EnumDescriptorProto, value: seq[google_protobuf_EnumDescriptorProto_EnumReservedRange]) = + message.reserved_range = value + incl(message.hasField, 4) + +proc addreserved_range*(message: google_protobuf_EnumDescriptorProto, value: google_protobuf_EnumDescriptorProto_EnumReservedRange) = + add(message.reserved_range, value) + incl(message.hasField, 4) + +proc reserved_range*(message: google_protobuf_EnumDescriptorProto): seq[google_protobuf_EnumDescriptorProto_EnumReservedRange] {.inline.} = + message.reserved_range + +proc `reserved_range=`*(message: google_protobuf_EnumDescriptorProto, value: seq[google_protobuf_EnumDescriptorProto_EnumReservedRange]) {.inline.} = + setreserved_range(message, value) + +proc clearreserved_name*(message: google_protobuf_EnumDescriptorProto) = + message.reserved_name = @[] + excl(message.hasField, [5]) + +proc hasreserved_name*(message: google_protobuf_EnumDescriptorProto): bool = + result = contains(message.hasField, 5) or (len(message.reserved_name) > 0) + +proc setreserved_name*(message: google_protobuf_EnumDescriptorProto, value: seq[string]) = + message.reserved_name = value + incl(message.hasField, 5) + +proc addreserved_name*(message: google_protobuf_EnumDescriptorProto, value: string) = + add(message.reserved_name, value) + incl(message.hasField, 5) + +proc reserved_name*(message: google_protobuf_EnumDescriptorProto): seq[string] {.inline.} = + message.reserved_name + +proc `reserved_name=`*(message: google_protobuf_EnumDescriptorProto, value: seq[string]) {.inline.} = + setreserved_name(message, value) + +proc sizeOfgoogle_protobuf_EnumDescriptorProto*(message: google_protobuf_EnumDescriptorProto): uint64 = + if hasname(message): + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfString(message.name) + for value in message.value: + result = result + sizeOfTag(2, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_EnumValueDescriptorProto(value)) + if hasoptions(message): + result = result + sizeOfTag(3, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_EnumOptions(message.options)) + for value in message.reserved_range: + result = result + sizeOfTag(4, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_EnumDescriptorProto_EnumReservedRange(value)) + for value in message.reserved_name: + result = result + sizeOfTag(5, WireType.LengthDelimited) + result = result + sizeOfString(value) + +proc writegoogle_protobuf_EnumDescriptorProto*(stream: ProtobufStream, message: google_protobuf_EnumDescriptorProto) = + if hasname(message): + writeString(stream, message.name, 1) + for value in message.value: + writeMessage(stream, value, 2) + if hasoptions(message): + writeMessage(stream, message.options, 3) + for value in message.reserved_range: + writeMessage(stream, value, 4) + for value in message.reserved_name: + writeString(stream, value, 5) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_EnumDescriptorProto*(stream: ProtobufStream): google_protobuf_EnumDescriptorProto = + result = newgoogle_protobuf_EnumDescriptorProto() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.LengthDelimited) + setname(result, readString(stream)) + of 2: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addvalue(result, newgoogle_protobuf_EnumValueDescriptorProto(data)) + of 3: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + setoptions(result, newgoogle_protobuf_EnumOptions(data)) + of 4: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addreserved_range(result, newgoogle_protobuf_EnumDescriptorProto_EnumReservedRange(data)) + of 5: + expectWireType(wireType, WireType.LengthDelimited) + addreserved_name(result, readString(stream)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_EnumDescriptorProto): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_EnumDescriptorProto(pbs, message) + result = ss.data + +proc newgoogle_protobuf_EnumDescriptorProto*(data: string): google_protobuf_EnumDescriptorProto = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_EnumDescriptorProto(pbs) + + +proc newgoogle_protobuf_ExtensionRangeOptions*(): google_protobuf_ExtensionRangeOptions = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.uninterpreted_option = @[] + +proc clearuninterpreted_option*(message: google_protobuf_ExtensionRangeOptions) = + message.uninterpreted_option = @[] + excl(message.hasField, [999]) + +proc hasuninterpreted_option*(message: google_protobuf_ExtensionRangeOptions): bool = + result = contains(message.hasField, 999) or (len(message.uninterpreted_option) > 0) + +proc setuninterpreted_option*(message: google_protobuf_ExtensionRangeOptions, value: seq[google_protobuf_UninterpretedOption]) = + message.uninterpreted_option = value + incl(message.hasField, 999) + +proc adduninterpreted_option*(message: google_protobuf_ExtensionRangeOptions, value: google_protobuf_UninterpretedOption) = + add(message.uninterpreted_option, value) + incl(message.hasField, 999) + +proc uninterpreted_option*(message: google_protobuf_ExtensionRangeOptions): seq[google_protobuf_UninterpretedOption] {.inline.} = + message.uninterpreted_option + +proc `uninterpreted_option=`*(message: google_protobuf_ExtensionRangeOptions, value: seq[google_protobuf_UninterpretedOption]) {.inline.} = + setuninterpreted_option(message, value) + +proc sizeOfgoogle_protobuf_ExtensionRangeOptions*(message: google_protobuf_ExtensionRangeOptions): uint64 = + for value in message.uninterpreted_option: + result = result + sizeOfTag(999, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_UninterpretedOption(value)) + +proc writegoogle_protobuf_ExtensionRangeOptions*(stream: ProtobufStream, message: google_protobuf_ExtensionRangeOptions) = + for value in message.uninterpreted_option: + writeMessage(stream, value, 999) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_ExtensionRangeOptions*(stream: ProtobufStream): google_protobuf_ExtensionRangeOptions = + result = newgoogle_protobuf_ExtensionRangeOptions() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 999: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + adduninterpreted_option(result, newgoogle_protobuf_UninterpretedOption(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_ExtensionRangeOptions): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_ExtensionRangeOptions(pbs, message) + result = ss.data + +proc newgoogle_protobuf_ExtensionRangeOptions*(data: string): google_protobuf_ExtensionRangeOptions = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_ExtensionRangeOptions(pbs) + + +proc newgoogle_protobuf_SourceCodeInfo_Location*(): google_protobuf_SourceCodeInfo_Location = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.path = @[] + result.span = @[] + result.leading_comments = "" + result.trailing_comments = "" + result.leading_detached_comments = @[] + +proc clearpath*(message: google_protobuf_SourceCodeInfo_Location) = + message.path = @[] + excl(message.hasField, [1]) + +proc haspath*(message: google_protobuf_SourceCodeInfo_Location): bool = + result = contains(message.hasField, 1) or (len(message.path) > 0) + +proc setpath*(message: google_protobuf_SourceCodeInfo_Location, value: seq[int32]) = + message.path = value + incl(message.hasField, 1) + +proc addpath*(message: google_protobuf_SourceCodeInfo_Location, value: int32) = + add(message.path, value) + incl(message.hasField, 1) + +proc path*(message: google_protobuf_SourceCodeInfo_Location): seq[int32] {.inline.} = + message.path + +proc `path=`*(message: google_protobuf_SourceCodeInfo_Location, value: seq[int32]) {.inline.} = + setpath(message, value) + +proc clearspan*(message: google_protobuf_SourceCodeInfo_Location) = + message.span = @[] + excl(message.hasField, [2]) + +proc hasspan*(message: google_protobuf_SourceCodeInfo_Location): bool = + result = contains(message.hasField, 2) or (len(message.span) > 0) + +proc setspan*(message: google_protobuf_SourceCodeInfo_Location, value: seq[int32]) = + message.span = value + incl(message.hasField, 2) + +proc addspan*(message: google_protobuf_SourceCodeInfo_Location, value: int32) = + add(message.span, value) + incl(message.hasField, 2) + +proc span*(message: google_protobuf_SourceCodeInfo_Location): seq[int32] {.inline.} = + message.span + +proc `span=`*(message: google_protobuf_SourceCodeInfo_Location, value: seq[int32]) {.inline.} = + setspan(message, value) + +proc clearleading_comments*(message: google_protobuf_SourceCodeInfo_Location) = + message.leading_comments = "" + excl(message.hasField, [3]) + +proc hasleading_comments*(message: google_protobuf_SourceCodeInfo_Location): bool = + result = contains(message.hasField, 3) + +proc setleading_comments*(message: google_protobuf_SourceCodeInfo_Location, value: string) = + message.leading_comments = value + incl(message.hasField, 3) + +proc leading_comments*(message: google_protobuf_SourceCodeInfo_Location): string {.inline.} = + message.leading_comments + +proc `leading_comments=`*(message: google_protobuf_SourceCodeInfo_Location, value: string) {.inline.} = + setleading_comments(message, value) + +proc cleartrailing_comments*(message: google_protobuf_SourceCodeInfo_Location) = + message.trailing_comments = "" + excl(message.hasField, [4]) + +proc hastrailing_comments*(message: google_protobuf_SourceCodeInfo_Location): bool = + result = contains(message.hasField, 4) + +proc settrailing_comments*(message: google_protobuf_SourceCodeInfo_Location, value: string) = + message.trailing_comments = value + incl(message.hasField, 4) + +proc trailing_comments*(message: google_protobuf_SourceCodeInfo_Location): string {.inline.} = + message.trailing_comments + +proc `trailing_comments=`*(message: google_protobuf_SourceCodeInfo_Location, value: string) {.inline.} = + settrailing_comments(message, value) + +proc clearleading_detached_comments*(message: google_protobuf_SourceCodeInfo_Location) = + message.leading_detached_comments = @[] + excl(message.hasField, [6]) + +proc hasleading_detached_comments*(message: google_protobuf_SourceCodeInfo_Location): bool = + result = contains(message.hasField, 6) or (len(message.leading_detached_comments) > 0) + +proc setleading_detached_comments*(message: google_protobuf_SourceCodeInfo_Location, value: seq[string]) = + message.leading_detached_comments = value + incl(message.hasField, 6) + +proc addleading_detached_comments*(message: google_protobuf_SourceCodeInfo_Location, value: string) = + add(message.leading_detached_comments, value) + incl(message.hasField, 6) + +proc leading_detached_comments*(message: google_protobuf_SourceCodeInfo_Location): seq[string] {.inline.} = + message.leading_detached_comments + +proc `leading_detached_comments=`*(message: google_protobuf_SourceCodeInfo_Location, value: seq[string]) {.inline.} = + setleading_detached_comments(message, value) + +proc sizeOfgoogle_protobuf_SourceCodeInfo_Location*(message: google_protobuf_SourceCodeInfo_Location): uint64 = + if haspath(message): + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(packedFieldSize(message.path, FieldType.Int32)) + if hasspan(message): + result = result + sizeOfTag(2, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(packedFieldSize(message.span, FieldType.Int32)) + if hasleading_comments(message): + result = result + sizeOfTag(3, WireType.LengthDelimited) + result = result + sizeOfString(message.leading_comments) + if hastrailing_comments(message): + result = result + sizeOfTag(4, WireType.LengthDelimited) + result = result + sizeOfString(message.trailing_comments) + for value in message.leading_detached_comments: + result = result + sizeOfTag(6, WireType.LengthDelimited) + result = result + sizeOfString(value) + +proc writegoogle_protobuf_SourceCodeInfo_Location*(stream: ProtobufStream, message: google_protobuf_SourceCodeInfo_Location) = + if haspath(message): + writeTag(stream, 1, WireType.LengthDelimited) + writeVarint(stream, packedFieldSize(message.path, FieldType.Int32)) + for value in message.path: + writeInt32(stream, value) + if hasspan(message): + writeTag(stream, 2, WireType.LengthDelimited) + writeVarint(stream, packedFieldSize(message.span, FieldType.Int32)) + for value in message.span: + writeInt32(stream, value) + if hasleading_comments(message): + writeString(stream, message.leading_comments, 3) + if hastrailing_comments(message): + writeString(stream, message.trailing_comments, 4) + for value in message.leading_detached_comments: + writeString(stream, value, 6) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_SourceCodeInfo_Location*(stream: ProtobufStream): google_protobuf_SourceCodeInfo_Location = + result = newgoogle_protobuf_SourceCodeInfo_Location() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.Varint, WireType.LengthDelimited) + if wireType == WireType.LengthDelimited: + let + size = readVarint(stream) + start = uint64(getPosition(stream)) + var consumed = 0'u64 + while consumed < size: + addpath(result, readInt32(stream)) + consumed = uint64(getPosition(stream)) - start + if consumed != size: + raise newException(Exception, "packed field size mismatch") + else: + addpath(result, readInt32(stream)) + of 2: + expectWireType(wireType, WireType.Varint, WireType.LengthDelimited) + if wireType == WireType.LengthDelimited: + let + size = readVarint(stream) + start = uint64(getPosition(stream)) + var consumed = 0'u64 + while consumed < size: + addspan(result, readInt32(stream)) + consumed = uint64(getPosition(stream)) - start + if consumed != size: + raise newException(Exception, "packed field size mismatch") + else: + addspan(result, readInt32(stream)) + of 3: + expectWireType(wireType, WireType.LengthDelimited) + setleading_comments(result, readString(stream)) + of 4: + expectWireType(wireType, WireType.LengthDelimited) + settrailing_comments(result, readString(stream)) + of 6: + expectWireType(wireType, WireType.LengthDelimited) + addleading_detached_comments(result, readString(stream)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_SourceCodeInfo_Location): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_SourceCodeInfo_Location(pbs, message) + result = ss.data + +proc newgoogle_protobuf_SourceCodeInfo_Location*(data: string): google_protobuf_SourceCodeInfo_Location = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_SourceCodeInfo_Location(pbs) + + +proc newgoogle_protobuf_SourceCodeInfo*(): google_protobuf_SourceCodeInfo = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.location = @[] + +proc clearlocation*(message: google_protobuf_SourceCodeInfo) = + message.location = @[] + excl(message.hasField, [1]) + +proc haslocation*(message: google_protobuf_SourceCodeInfo): bool = + result = contains(message.hasField, 1) or (len(message.location) > 0) + +proc setlocation*(message: google_protobuf_SourceCodeInfo, value: seq[google_protobuf_SourceCodeInfo_Location]) = + message.location = value + incl(message.hasField, 1) + +proc addlocation*(message: google_protobuf_SourceCodeInfo, value: google_protobuf_SourceCodeInfo_Location) = + add(message.location, value) + incl(message.hasField, 1) + +proc location*(message: google_protobuf_SourceCodeInfo): seq[google_protobuf_SourceCodeInfo_Location] {.inline.} = + message.location + +proc `location=`*(message: google_protobuf_SourceCodeInfo, value: seq[google_protobuf_SourceCodeInfo_Location]) {.inline.} = + setlocation(message, value) + +proc sizeOfgoogle_protobuf_SourceCodeInfo*(message: google_protobuf_SourceCodeInfo): uint64 = + for value in message.location: + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_SourceCodeInfo_Location(value)) + +proc writegoogle_protobuf_SourceCodeInfo*(stream: ProtobufStream, message: google_protobuf_SourceCodeInfo) = + for value in message.location: + writeMessage(stream, value, 1) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_SourceCodeInfo*(stream: ProtobufStream): google_protobuf_SourceCodeInfo = + result = newgoogle_protobuf_SourceCodeInfo() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addlocation(result, newgoogle_protobuf_SourceCodeInfo_Location(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_SourceCodeInfo): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_SourceCodeInfo(pbs, message) + result = ss.data + +proc newgoogle_protobuf_SourceCodeInfo*(data: string): google_protobuf_SourceCodeInfo = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_SourceCodeInfo(pbs) + + +proc newgoogle_protobuf_FieldOptions*(): google_protobuf_FieldOptions = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.ctype = google_protobuf_FieldOptions_CType.STRING + result.packed = false + result.jstype = google_protobuf_FieldOptions_JSType.JS_NORMAL + result.lazy = false + result.deprecated = false + result.weak = false + result.uninterpreted_option = @[] + +proc clearctype*(message: google_protobuf_FieldOptions) = + message.ctype = google_protobuf_FieldOptions_CType.STRING + excl(message.hasField, [1]) + +proc hasctype*(message: google_protobuf_FieldOptions): bool = + result = contains(message.hasField, 1) + +proc setctype*(message: google_protobuf_FieldOptions, value: google_protobuf_FieldOptions_CType) = + message.ctype = value + incl(message.hasField, 1) + +proc ctype*(message: google_protobuf_FieldOptions): google_protobuf_FieldOptions_CType {.inline.} = + message.ctype + +proc `ctype=`*(message: google_protobuf_FieldOptions, value: google_protobuf_FieldOptions_CType) {.inline.} = + setctype(message, value) + +proc clearpacked*(message: google_protobuf_FieldOptions) = + message.packed = false + excl(message.hasField, [2]) + +proc haspacked*(message: google_protobuf_FieldOptions): bool = + result = contains(message.hasField, 2) + +proc setpacked*(message: google_protobuf_FieldOptions, value: bool) = + message.packed = value + incl(message.hasField, 2) + +proc packed*(message: google_protobuf_FieldOptions): bool {.inline.} = + message.packed + +proc `packed=`*(message: google_protobuf_FieldOptions, value: bool) {.inline.} = + setpacked(message, value) + +proc clearjstype*(message: google_protobuf_FieldOptions) = + message.jstype = google_protobuf_FieldOptions_JSType.JS_NORMAL + excl(message.hasField, [6]) + +proc hasjstype*(message: google_protobuf_FieldOptions): bool = + result = contains(message.hasField, 6) + +proc setjstype*(message: google_protobuf_FieldOptions, value: google_protobuf_FieldOptions_JSType) = + message.jstype = value + incl(message.hasField, 6) + +proc jstype*(message: google_protobuf_FieldOptions): google_protobuf_FieldOptions_JSType {.inline.} = + message.jstype + +proc `jstype=`*(message: google_protobuf_FieldOptions, value: google_protobuf_FieldOptions_JSType) {.inline.} = + setjstype(message, value) + +proc clearlazy*(message: google_protobuf_FieldOptions) = + message.lazy = false + excl(message.hasField, [5]) + +proc haslazy*(message: google_protobuf_FieldOptions): bool = + result = contains(message.hasField, 5) + +proc setlazy*(message: google_protobuf_FieldOptions, value: bool) = + message.lazy = value + incl(message.hasField, 5) + +proc lazy*(message: google_protobuf_FieldOptions): bool {.inline.} = + message.lazy + +proc `lazy=`*(message: google_protobuf_FieldOptions, value: bool) {.inline.} = + setlazy(message, value) + +proc cleardeprecated*(message: google_protobuf_FieldOptions) = + message.deprecated = false + excl(message.hasField, [3]) + +proc hasdeprecated*(message: google_protobuf_FieldOptions): bool = + result = contains(message.hasField, 3) + +proc setdeprecated*(message: google_protobuf_FieldOptions, value: bool) = + message.deprecated = value + incl(message.hasField, 3) + +proc deprecated*(message: google_protobuf_FieldOptions): bool {.inline.} = + message.deprecated + +proc `deprecated=`*(message: google_protobuf_FieldOptions, value: bool) {.inline.} = + setdeprecated(message, value) + +proc clearweak*(message: google_protobuf_FieldOptions) = + message.weak = false + excl(message.hasField, [10]) + +proc hasweak*(message: google_protobuf_FieldOptions): bool = + result = contains(message.hasField, 10) + +proc setweak*(message: google_protobuf_FieldOptions, value: bool) = + message.weak = value + incl(message.hasField, 10) + +proc weak*(message: google_protobuf_FieldOptions): bool {.inline.} = + message.weak + +proc `weak=`*(message: google_protobuf_FieldOptions, value: bool) {.inline.} = + setweak(message, value) + +proc clearuninterpreted_option*(message: google_protobuf_FieldOptions) = + message.uninterpreted_option = @[] + excl(message.hasField, [999]) + +proc hasuninterpreted_option*(message: google_protobuf_FieldOptions): bool = + result = contains(message.hasField, 999) or (len(message.uninterpreted_option) > 0) + +proc setuninterpreted_option*(message: google_protobuf_FieldOptions, value: seq[google_protobuf_UninterpretedOption]) = + message.uninterpreted_option = value + incl(message.hasField, 999) + +proc adduninterpreted_option*(message: google_protobuf_FieldOptions, value: google_protobuf_UninterpretedOption) = + add(message.uninterpreted_option, value) + incl(message.hasField, 999) + +proc uninterpreted_option*(message: google_protobuf_FieldOptions): seq[google_protobuf_UninterpretedOption] {.inline.} = + message.uninterpreted_option + +proc `uninterpreted_option=`*(message: google_protobuf_FieldOptions, value: seq[google_protobuf_UninterpretedOption]) {.inline.} = + setuninterpreted_option(message, value) + +proc sizeOfgoogle_protobuf_FieldOptions*(message: google_protobuf_FieldOptions): uint64 = + if hasctype(message): + result = result + sizeOfTag(1, WireType.Varint) + result = result + sizeOfEnum[google_protobuf_FieldOptions_CType](message.ctype) + if haspacked(message): + result = result + sizeOfTag(2, WireType.Varint) + result = result + sizeOfBool(message.packed) + if hasjstype(message): + result = result + sizeOfTag(6, WireType.Varint) + result = result + sizeOfEnum[google_protobuf_FieldOptions_JSType](message.jstype) + if haslazy(message): + result = result + sizeOfTag(5, WireType.Varint) + result = result + sizeOfBool(message.lazy) + if hasdeprecated(message): + result = result + sizeOfTag(3, WireType.Varint) + result = result + sizeOfBool(message.deprecated) + if hasweak(message): + result = result + sizeOfTag(10, WireType.Varint) + result = result + sizeOfBool(message.weak) + for value in message.uninterpreted_option: + result = result + sizeOfTag(999, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_UninterpretedOption(value)) + +proc writegoogle_protobuf_FieldOptions*(stream: ProtobufStream, message: google_protobuf_FieldOptions) = + if hasctype(message): + writeEnum(stream, message.ctype, 1) + if haspacked(message): + writeBool(stream, message.packed, 2) + if hasjstype(message): + writeEnum(stream, message.jstype, 6) + if haslazy(message): + writeBool(stream, message.lazy, 5) + if hasdeprecated(message): + writeBool(stream, message.deprecated, 3) + if hasweak(message): + writeBool(stream, message.weak, 10) + for value in message.uninterpreted_option: + writeMessage(stream, value, 999) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_FieldOptions*(stream: ProtobufStream): google_protobuf_FieldOptions = + result = newgoogle_protobuf_FieldOptions() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.Varint) + setctype(result, readEnum[google_protobuf_FieldOptions_CType](stream)) + of 2: + expectWireType(wireType, WireType.Varint) + setpacked(result, readBool(stream)) + of 6: + expectWireType(wireType, WireType.Varint) + setjstype(result, readEnum[google_protobuf_FieldOptions_JSType](stream)) + of 5: + expectWireType(wireType, WireType.Varint) + setlazy(result, readBool(stream)) + of 3: + expectWireType(wireType, WireType.Varint) + setdeprecated(result, readBool(stream)) + of 10: + expectWireType(wireType, WireType.Varint) + setweak(result, readBool(stream)) + of 999: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + adduninterpreted_option(result, newgoogle_protobuf_UninterpretedOption(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_FieldOptions): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_FieldOptions(pbs, message) + result = ss.data + +proc newgoogle_protobuf_FieldOptions*(data: string): google_protobuf_FieldOptions = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_FieldOptions(pbs) + + +proc newgoogle_protobuf_FieldDescriptorProto*(): google_protobuf_FieldDescriptorProto = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.name = "" + result.number = 0 + result.label = google_protobuf_FieldDescriptorProto_Label.LABEL_OPTIONAL + result.ftype = google_protobuf_FieldDescriptorProto_Type.TYPE_DOUBLE + result.type_name = "" + result.extendee = "" + result.default_value = "" + result.oneof_index = 0 + result.json_name = "" + result.options = nil + +proc clearname*(message: google_protobuf_FieldDescriptorProto) = + message.name = "" + excl(message.hasField, [1]) + +proc hasname*(message: google_protobuf_FieldDescriptorProto): bool = + result = contains(message.hasField, 1) + +proc setname*(message: google_protobuf_FieldDescriptorProto, value: string) = + message.name = value + incl(message.hasField, 1) + +proc name*(message: google_protobuf_FieldDescriptorProto): string {.inline.} = + message.name + +proc `name=`*(message: google_protobuf_FieldDescriptorProto, value: string) {.inline.} = + setname(message, value) + +proc clearnumber*(message: google_protobuf_FieldDescriptorProto) = + message.number = 0 + excl(message.hasField, [3]) + +proc hasnumber*(message: google_protobuf_FieldDescriptorProto): bool = + result = contains(message.hasField, 3) + +proc setnumber*(message: google_protobuf_FieldDescriptorProto, value: int32) = + message.number = value + incl(message.hasField, 3) + +proc number*(message: google_protobuf_FieldDescriptorProto): int32 {.inline.} = + message.number + +proc `number=`*(message: google_protobuf_FieldDescriptorProto, value: int32) {.inline.} = + setnumber(message, value) + +proc clearlabel*(message: google_protobuf_FieldDescriptorProto) = + message.label = google_protobuf_FieldDescriptorProto_Label.LABEL_OPTIONAL + excl(message.hasField, [4]) + +proc haslabel*(message: google_protobuf_FieldDescriptorProto): bool = + result = contains(message.hasField, 4) + +proc setlabel*(message: google_protobuf_FieldDescriptorProto, value: google_protobuf_FieldDescriptorProto_Label) = + message.label = value + incl(message.hasField, 4) + +proc label*(message: google_protobuf_FieldDescriptorProto): google_protobuf_FieldDescriptorProto_Label {.inline.} = + message.label + +proc `label=`*(message: google_protobuf_FieldDescriptorProto, value: google_protobuf_FieldDescriptorProto_Label) {.inline.} = + setlabel(message, value) + +proc clearftype*(message: google_protobuf_FieldDescriptorProto) = + message.ftype = google_protobuf_FieldDescriptorProto_Type.TYPE_DOUBLE + excl(message.hasField, [5]) + +proc hasftype*(message: google_protobuf_FieldDescriptorProto): bool = + result = contains(message.hasField, 5) + +proc setftype*(message: google_protobuf_FieldDescriptorProto, value: google_protobuf_FieldDescriptorProto_Type) = + message.ftype = value + incl(message.hasField, 5) + +proc ftype*(message: google_protobuf_FieldDescriptorProto): google_protobuf_FieldDescriptorProto_Type {.inline.} = + message.ftype + +proc `ftype=`*(message: google_protobuf_FieldDescriptorProto, value: google_protobuf_FieldDescriptorProto_Type) {.inline.} = + setftype(message, value) + +proc cleartype_name*(message: google_protobuf_FieldDescriptorProto) = + message.type_name = "" + excl(message.hasField, [6]) + +proc hastype_name*(message: google_protobuf_FieldDescriptorProto): bool = + result = contains(message.hasField, 6) + +proc settype_name*(message: google_protobuf_FieldDescriptorProto, value: string) = + message.type_name = value + incl(message.hasField, 6) + +proc type_name*(message: google_protobuf_FieldDescriptorProto): string {.inline.} = + message.type_name + +proc `type_name=`*(message: google_protobuf_FieldDescriptorProto, value: string) {.inline.} = + settype_name(message, value) + +proc clearextendee*(message: google_protobuf_FieldDescriptorProto) = + message.extendee = "" + excl(message.hasField, [2]) + +proc hasextendee*(message: google_protobuf_FieldDescriptorProto): bool = + result = contains(message.hasField, 2) + +proc setextendee*(message: google_protobuf_FieldDescriptorProto, value: string) = + message.extendee = value + incl(message.hasField, 2) + +proc extendee*(message: google_protobuf_FieldDescriptorProto): string {.inline.} = + message.extendee + +proc `extendee=`*(message: google_protobuf_FieldDescriptorProto, value: string) {.inline.} = + setextendee(message, value) + +proc cleardefault_value*(message: google_protobuf_FieldDescriptorProto) = + message.default_value = "" + excl(message.hasField, [7]) + +proc hasdefault_value*(message: google_protobuf_FieldDescriptorProto): bool = + result = contains(message.hasField, 7) + +proc setdefault_value*(message: google_protobuf_FieldDescriptorProto, value: string) = + message.default_value = value + incl(message.hasField, 7) + +proc default_value*(message: google_protobuf_FieldDescriptorProto): string {.inline.} = + message.default_value + +proc `default_value=`*(message: google_protobuf_FieldDescriptorProto, value: string) {.inline.} = + setdefault_value(message, value) + +proc clearoneof_index*(message: google_protobuf_FieldDescriptorProto) = + message.oneof_index = 0 + excl(message.hasField, [9]) + +proc hasoneof_index*(message: google_protobuf_FieldDescriptorProto): bool = + result = contains(message.hasField, 9) + +proc setoneof_index*(message: google_protobuf_FieldDescriptorProto, value: int32) = + message.oneof_index = value + incl(message.hasField, 9) + +proc oneof_index*(message: google_protobuf_FieldDescriptorProto): int32 {.inline.} = + message.oneof_index + +proc `oneof_index=`*(message: google_protobuf_FieldDescriptorProto, value: int32) {.inline.} = + setoneof_index(message, value) + +proc clearjson_name*(message: google_protobuf_FieldDescriptorProto) = + message.json_name = "" + excl(message.hasField, [10]) + +proc hasjson_name*(message: google_protobuf_FieldDescriptorProto): bool = + result = contains(message.hasField, 10) + +proc setjson_name*(message: google_protobuf_FieldDescriptorProto, value: string) = + message.json_name = value + incl(message.hasField, 10) + +proc json_name*(message: google_protobuf_FieldDescriptorProto): string {.inline.} = + message.json_name + +proc `json_name=`*(message: google_protobuf_FieldDescriptorProto, value: string) {.inline.} = + setjson_name(message, value) + +proc clearoptions*(message: google_protobuf_FieldDescriptorProto) = + message.options = nil + excl(message.hasField, [8]) + +proc hasoptions*(message: google_protobuf_FieldDescriptorProto): bool = + result = contains(message.hasField, 8) + +proc setoptions*(message: google_protobuf_FieldDescriptorProto, value: google_protobuf_FieldOptions) = + message.options = value + incl(message.hasField, 8) + +proc options*(message: google_protobuf_FieldDescriptorProto): google_protobuf_FieldOptions {.inline.} = + message.options + +proc `options=`*(message: google_protobuf_FieldDescriptorProto, value: google_protobuf_FieldOptions) {.inline.} = + setoptions(message, value) + +proc sizeOfgoogle_protobuf_FieldDescriptorProto*(message: google_protobuf_FieldDescriptorProto): uint64 = + if hasname(message): + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfString(message.name) + if hasnumber(message): + result = result + sizeOfTag(3, WireType.Varint) + result = result + sizeOfInt32(message.number) + if haslabel(message): + result = result + sizeOfTag(4, WireType.Varint) + result = result + sizeOfEnum[google_protobuf_FieldDescriptorProto_Label](message.label) + if hasftype(message): + result = result + sizeOfTag(5, WireType.Varint) + result = result + sizeOfEnum[google_protobuf_FieldDescriptorProto_Type](message.ftype) + if hastype_name(message): + result = result + sizeOfTag(6, WireType.LengthDelimited) + result = result + sizeOfString(message.type_name) + if hasextendee(message): + result = result + sizeOfTag(2, WireType.LengthDelimited) + result = result + sizeOfString(message.extendee) + if hasdefault_value(message): + result = result + sizeOfTag(7, WireType.LengthDelimited) + result = result + sizeOfString(message.default_value) + if hasoneof_index(message): + result = result + sizeOfTag(9, WireType.Varint) + result = result + sizeOfInt32(message.oneof_index) + if hasjson_name(message): + result = result + sizeOfTag(10, WireType.LengthDelimited) + result = result + sizeOfString(message.json_name) + if hasoptions(message): + result = result + sizeOfTag(8, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_FieldOptions(message.options)) + +proc writegoogle_protobuf_FieldDescriptorProto*(stream: ProtobufStream, message: google_protobuf_FieldDescriptorProto) = + if hasname(message): + writeString(stream, message.name, 1) + if hasnumber(message): + writeInt32(stream, message.number, 3) + if haslabel(message): + writeEnum(stream, message.label, 4) + if hasftype(message): + writeEnum(stream, message.ftype, 5) + if hastype_name(message): + writeString(stream, message.type_name, 6) + if hasextendee(message): + writeString(stream, message.extendee, 2) + if hasdefault_value(message): + writeString(stream, message.default_value, 7) + if hasoneof_index(message): + writeInt32(stream, message.oneof_index, 9) + if hasjson_name(message): + writeString(stream, message.json_name, 10) + if hasoptions(message): + writeMessage(stream, message.options, 8) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_FieldDescriptorProto*(stream: ProtobufStream): google_protobuf_FieldDescriptorProto = + result = newgoogle_protobuf_FieldDescriptorProto() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.LengthDelimited) + setname(result, readString(stream)) + of 3: + expectWireType(wireType, WireType.Varint) + setnumber(result, readInt32(stream)) + of 4: + expectWireType(wireType, WireType.Varint) + setlabel(result, readEnum[google_protobuf_FieldDescriptorProto_Label](stream)) + of 5: + expectWireType(wireType, WireType.Varint) + setftype(result, readEnum[google_protobuf_FieldDescriptorProto_Type](stream)) + of 6: + expectWireType(wireType, WireType.LengthDelimited) + settype_name(result, readString(stream)) + of 2: + expectWireType(wireType, WireType.LengthDelimited) + setextendee(result, readString(stream)) + of 7: + expectWireType(wireType, WireType.LengthDelimited) + setdefault_value(result, readString(stream)) + of 9: + expectWireType(wireType, WireType.Varint) + setoneof_index(result, readInt32(stream)) + of 10: + expectWireType(wireType, WireType.LengthDelimited) + setjson_name(result, readString(stream)) + of 8: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + setoptions(result, newgoogle_protobuf_FieldOptions(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_FieldDescriptorProto): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_FieldDescriptorProto(pbs, message) + result = ss.data + +proc newgoogle_protobuf_FieldDescriptorProto*(data: string): google_protobuf_FieldDescriptorProto = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_FieldDescriptorProto(pbs) + + +proc newgoogle_protobuf_DescriptorProto_ExtensionRange*(): google_protobuf_DescriptorProto_ExtensionRange = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.start = 0 + result.fend = 0 + result.options = nil + +proc clearstart*(message: google_protobuf_DescriptorProto_ExtensionRange) = + message.start = 0 + excl(message.hasField, [1]) + +proc hasstart*(message: google_protobuf_DescriptorProto_ExtensionRange): bool = + result = contains(message.hasField, 1) + +proc setstart*(message: google_protobuf_DescriptorProto_ExtensionRange, value: int32) = + message.start = value + incl(message.hasField, 1) + +proc start*(message: google_protobuf_DescriptorProto_ExtensionRange): int32 {.inline.} = + message.start + +proc `start=`*(message: google_protobuf_DescriptorProto_ExtensionRange, value: int32) {.inline.} = + setstart(message, value) + +proc clearfend*(message: google_protobuf_DescriptorProto_ExtensionRange) = + message.fend = 0 + excl(message.hasField, [2]) + +proc hasfend*(message: google_protobuf_DescriptorProto_ExtensionRange): bool = + result = contains(message.hasField, 2) + +proc setfend*(message: google_protobuf_DescriptorProto_ExtensionRange, value: int32) = + message.fend = value + incl(message.hasField, 2) + +proc fend*(message: google_protobuf_DescriptorProto_ExtensionRange): int32 {.inline.} = + message.fend + +proc `fend=`*(message: google_protobuf_DescriptorProto_ExtensionRange, value: int32) {.inline.} = + setfend(message, value) + +proc clearoptions*(message: google_protobuf_DescriptorProto_ExtensionRange) = + message.options = nil + excl(message.hasField, [3]) + +proc hasoptions*(message: google_protobuf_DescriptorProto_ExtensionRange): bool = + result = contains(message.hasField, 3) + +proc setoptions*(message: google_protobuf_DescriptorProto_ExtensionRange, value: google_protobuf_ExtensionRangeOptions) = + message.options = value + incl(message.hasField, 3) + +proc options*(message: google_protobuf_DescriptorProto_ExtensionRange): google_protobuf_ExtensionRangeOptions {.inline.} = + message.options + +proc `options=`*(message: google_protobuf_DescriptorProto_ExtensionRange, value: google_protobuf_ExtensionRangeOptions) {.inline.} = + setoptions(message, value) + +proc sizeOfgoogle_protobuf_DescriptorProto_ExtensionRange*(message: google_protobuf_DescriptorProto_ExtensionRange): uint64 = + if hasstart(message): + result = result + sizeOfTag(1, WireType.Varint) + result = result + sizeOfInt32(message.start) + if hasfend(message): + result = result + sizeOfTag(2, WireType.Varint) + result = result + sizeOfInt32(message.fend) + if hasoptions(message): + result = result + sizeOfTag(3, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_ExtensionRangeOptions(message.options)) + +proc writegoogle_protobuf_DescriptorProto_ExtensionRange*(stream: ProtobufStream, message: google_protobuf_DescriptorProto_ExtensionRange) = + if hasstart(message): + writeInt32(stream, message.start, 1) + if hasfend(message): + writeInt32(stream, message.fend, 2) + if hasoptions(message): + writeMessage(stream, message.options, 3) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_DescriptorProto_ExtensionRange*(stream: ProtobufStream): google_protobuf_DescriptorProto_ExtensionRange = + result = newgoogle_protobuf_DescriptorProto_ExtensionRange() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.Varint) + setstart(result, readInt32(stream)) + of 2: + expectWireType(wireType, WireType.Varint) + setfend(result, readInt32(stream)) + of 3: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + setoptions(result, newgoogle_protobuf_ExtensionRangeOptions(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_DescriptorProto_ExtensionRange): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_DescriptorProto_ExtensionRange(pbs, message) + result = ss.data + +proc newgoogle_protobuf_DescriptorProto_ExtensionRange*(data: string): google_protobuf_DescriptorProto_ExtensionRange = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_DescriptorProto_ExtensionRange(pbs) + + +proc newgoogle_protobuf_MessageOptions*(): google_protobuf_MessageOptions = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.message_set_wire_format = false + result.no_standard_descriptor_accessor = false + result.deprecated = false + result.map_entry = false + result.uninterpreted_option = @[] + +proc clearmessage_set_wire_format*(message: google_protobuf_MessageOptions) = + message.message_set_wire_format = false + excl(message.hasField, [1]) + +proc hasmessage_set_wire_format*(message: google_protobuf_MessageOptions): bool = + result = contains(message.hasField, 1) + +proc setmessage_set_wire_format*(message: google_protobuf_MessageOptions, value: bool) = + message.message_set_wire_format = value + incl(message.hasField, 1) + +proc message_set_wire_format*(message: google_protobuf_MessageOptions): bool {.inline.} = + message.message_set_wire_format + +proc `message_set_wire_format=`*(message: google_protobuf_MessageOptions, value: bool) {.inline.} = + setmessage_set_wire_format(message, value) + +proc clearno_standard_descriptor_accessor*(message: google_protobuf_MessageOptions) = + message.no_standard_descriptor_accessor = false + excl(message.hasField, [2]) + +proc hasno_standard_descriptor_accessor*(message: google_protobuf_MessageOptions): bool = + result = contains(message.hasField, 2) + +proc setno_standard_descriptor_accessor*(message: google_protobuf_MessageOptions, value: bool) = + message.no_standard_descriptor_accessor = value + incl(message.hasField, 2) + +proc no_standard_descriptor_accessor*(message: google_protobuf_MessageOptions): bool {.inline.} = + message.no_standard_descriptor_accessor + +proc `no_standard_descriptor_accessor=`*(message: google_protobuf_MessageOptions, value: bool) {.inline.} = + setno_standard_descriptor_accessor(message, value) + +proc cleardeprecated*(message: google_protobuf_MessageOptions) = + message.deprecated = false + excl(message.hasField, [3]) + +proc hasdeprecated*(message: google_protobuf_MessageOptions): bool = + result = contains(message.hasField, 3) + +proc setdeprecated*(message: google_protobuf_MessageOptions, value: bool) = + message.deprecated = value + incl(message.hasField, 3) + +proc deprecated*(message: google_protobuf_MessageOptions): bool {.inline.} = + message.deprecated + +proc `deprecated=`*(message: google_protobuf_MessageOptions, value: bool) {.inline.} = + setdeprecated(message, value) + +proc clearmap_entry*(message: google_protobuf_MessageOptions) = + message.map_entry = false + excl(message.hasField, [7]) + +proc hasmap_entry*(message: google_protobuf_MessageOptions): bool = + result = contains(message.hasField, 7) + +proc setmap_entry*(message: google_protobuf_MessageOptions, value: bool) = + message.map_entry = value + incl(message.hasField, 7) + +proc map_entry*(message: google_protobuf_MessageOptions): bool {.inline.} = + message.map_entry + +proc `map_entry=`*(message: google_protobuf_MessageOptions, value: bool) {.inline.} = + setmap_entry(message, value) + +proc clearuninterpreted_option*(message: google_protobuf_MessageOptions) = + message.uninterpreted_option = @[] + excl(message.hasField, [999]) + +proc hasuninterpreted_option*(message: google_protobuf_MessageOptions): bool = + result = contains(message.hasField, 999) or (len(message.uninterpreted_option) > 0) + +proc setuninterpreted_option*(message: google_protobuf_MessageOptions, value: seq[google_protobuf_UninterpretedOption]) = + message.uninterpreted_option = value + incl(message.hasField, 999) + +proc adduninterpreted_option*(message: google_protobuf_MessageOptions, value: google_protobuf_UninterpretedOption) = + add(message.uninterpreted_option, value) + incl(message.hasField, 999) + +proc uninterpreted_option*(message: google_protobuf_MessageOptions): seq[google_protobuf_UninterpretedOption] {.inline.} = + message.uninterpreted_option + +proc `uninterpreted_option=`*(message: google_protobuf_MessageOptions, value: seq[google_protobuf_UninterpretedOption]) {.inline.} = + setuninterpreted_option(message, value) + +proc sizeOfgoogle_protobuf_MessageOptions*(message: google_protobuf_MessageOptions): uint64 = + if hasmessage_set_wire_format(message): + result = result + sizeOfTag(1, WireType.Varint) + result = result + sizeOfBool(message.message_set_wire_format) + if hasno_standard_descriptor_accessor(message): + result = result + sizeOfTag(2, WireType.Varint) + result = result + sizeOfBool(message.no_standard_descriptor_accessor) + if hasdeprecated(message): + result = result + sizeOfTag(3, WireType.Varint) + result = result + sizeOfBool(message.deprecated) + if hasmap_entry(message): + result = result + sizeOfTag(7, WireType.Varint) + result = result + sizeOfBool(message.map_entry) + for value in message.uninterpreted_option: + result = result + sizeOfTag(999, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_UninterpretedOption(value)) + +proc writegoogle_protobuf_MessageOptions*(stream: ProtobufStream, message: google_protobuf_MessageOptions) = + if hasmessage_set_wire_format(message): + writeBool(stream, message.message_set_wire_format, 1) + if hasno_standard_descriptor_accessor(message): + writeBool(stream, message.no_standard_descriptor_accessor, 2) + if hasdeprecated(message): + writeBool(stream, message.deprecated, 3) + if hasmap_entry(message): + writeBool(stream, message.map_entry, 7) + for value in message.uninterpreted_option: + writeMessage(stream, value, 999) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_MessageOptions*(stream: ProtobufStream): google_protobuf_MessageOptions = + result = newgoogle_protobuf_MessageOptions() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.Varint) + setmessage_set_wire_format(result, readBool(stream)) + of 2: + expectWireType(wireType, WireType.Varint) + setno_standard_descriptor_accessor(result, readBool(stream)) + of 3: + expectWireType(wireType, WireType.Varint) + setdeprecated(result, readBool(stream)) + of 7: + expectWireType(wireType, WireType.Varint) + setmap_entry(result, readBool(stream)) + of 999: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + adduninterpreted_option(result, newgoogle_protobuf_UninterpretedOption(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_MessageOptions): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_MessageOptions(pbs, message) + result = ss.data + +proc newgoogle_protobuf_MessageOptions*(data: string): google_protobuf_MessageOptions = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_MessageOptions(pbs) + + +proc newgoogle_protobuf_OneofOptions*(): google_protobuf_OneofOptions = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.uninterpreted_option = @[] + +proc clearuninterpreted_option*(message: google_protobuf_OneofOptions) = + message.uninterpreted_option = @[] + excl(message.hasField, [999]) + +proc hasuninterpreted_option*(message: google_protobuf_OneofOptions): bool = + result = contains(message.hasField, 999) or (len(message.uninterpreted_option) > 0) + +proc setuninterpreted_option*(message: google_protobuf_OneofOptions, value: seq[google_protobuf_UninterpretedOption]) = + message.uninterpreted_option = value + incl(message.hasField, 999) + +proc adduninterpreted_option*(message: google_protobuf_OneofOptions, value: google_protobuf_UninterpretedOption) = + add(message.uninterpreted_option, value) + incl(message.hasField, 999) + +proc uninterpreted_option*(message: google_protobuf_OneofOptions): seq[google_protobuf_UninterpretedOption] {.inline.} = + message.uninterpreted_option + +proc `uninterpreted_option=`*(message: google_protobuf_OneofOptions, value: seq[google_protobuf_UninterpretedOption]) {.inline.} = + setuninterpreted_option(message, value) + +proc sizeOfgoogle_protobuf_OneofOptions*(message: google_protobuf_OneofOptions): uint64 = + for value in message.uninterpreted_option: + result = result + sizeOfTag(999, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_UninterpretedOption(value)) + +proc writegoogle_protobuf_OneofOptions*(stream: ProtobufStream, message: google_protobuf_OneofOptions) = + for value in message.uninterpreted_option: + writeMessage(stream, value, 999) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_OneofOptions*(stream: ProtobufStream): google_protobuf_OneofOptions = + result = newgoogle_protobuf_OneofOptions() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 999: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + adduninterpreted_option(result, newgoogle_protobuf_UninterpretedOption(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_OneofOptions): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_OneofOptions(pbs, message) + result = ss.data + +proc newgoogle_protobuf_OneofOptions*(data: string): google_protobuf_OneofOptions = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_OneofOptions(pbs) + + +proc newgoogle_protobuf_OneofDescriptorProto*(): google_protobuf_OneofDescriptorProto = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.name = "" + result.options = nil + +proc clearname*(message: google_protobuf_OneofDescriptorProto) = + message.name = "" + excl(message.hasField, [1]) + +proc hasname*(message: google_protobuf_OneofDescriptorProto): bool = + result = contains(message.hasField, 1) + +proc setname*(message: google_protobuf_OneofDescriptorProto, value: string) = + message.name = value + incl(message.hasField, 1) + +proc name*(message: google_protobuf_OneofDescriptorProto): string {.inline.} = + message.name + +proc `name=`*(message: google_protobuf_OneofDescriptorProto, value: string) {.inline.} = + setname(message, value) + +proc clearoptions*(message: google_protobuf_OneofDescriptorProto) = + message.options = nil + excl(message.hasField, [2]) + +proc hasoptions*(message: google_protobuf_OneofDescriptorProto): bool = + result = contains(message.hasField, 2) + +proc setoptions*(message: google_protobuf_OneofDescriptorProto, value: google_protobuf_OneofOptions) = + message.options = value + incl(message.hasField, 2) + +proc options*(message: google_protobuf_OneofDescriptorProto): google_protobuf_OneofOptions {.inline.} = + message.options + +proc `options=`*(message: google_protobuf_OneofDescriptorProto, value: google_protobuf_OneofOptions) {.inline.} = + setoptions(message, value) + +proc sizeOfgoogle_protobuf_OneofDescriptorProto*(message: google_protobuf_OneofDescriptorProto): uint64 = + if hasname(message): + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfString(message.name) + if hasoptions(message): + result = result + sizeOfTag(2, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_OneofOptions(message.options)) + +proc writegoogle_protobuf_OneofDescriptorProto*(stream: ProtobufStream, message: google_protobuf_OneofDescriptorProto) = + if hasname(message): + writeString(stream, message.name, 1) + if hasoptions(message): + writeMessage(stream, message.options, 2) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_OneofDescriptorProto*(stream: ProtobufStream): google_protobuf_OneofDescriptorProto = + result = newgoogle_protobuf_OneofDescriptorProto() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.LengthDelimited) + setname(result, readString(stream)) + of 2: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + setoptions(result, newgoogle_protobuf_OneofOptions(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_OneofDescriptorProto): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_OneofDescriptorProto(pbs, message) + result = ss.data + +proc newgoogle_protobuf_OneofDescriptorProto*(data: string): google_protobuf_OneofDescriptorProto = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_OneofDescriptorProto(pbs) + + +proc newgoogle_protobuf_DescriptorProto_ReservedRange*(): google_protobuf_DescriptorProto_ReservedRange = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.start = 0 + result.fend = 0 + +proc clearstart*(message: google_protobuf_DescriptorProto_ReservedRange) = + message.start = 0 + excl(message.hasField, [1]) + +proc hasstart*(message: google_protobuf_DescriptorProto_ReservedRange): bool = + result = contains(message.hasField, 1) + +proc setstart*(message: google_protobuf_DescriptorProto_ReservedRange, value: int32) = + message.start = value + incl(message.hasField, 1) + +proc start*(message: google_protobuf_DescriptorProto_ReservedRange): int32 {.inline.} = + message.start + +proc `start=`*(message: google_protobuf_DescriptorProto_ReservedRange, value: int32) {.inline.} = + setstart(message, value) + +proc clearfend*(message: google_protobuf_DescriptorProto_ReservedRange) = + message.fend = 0 + excl(message.hasField, [2]) + +proc hasfend*(message: google_protobuf_DescriptorProto_ReservedRange): bool = + result = contains(message.hasField, 2) + +proc setfend*(message: google_protobuf_DescriptorProto_ReservedRange, value: int32) = + message.fend = value + incl(message.hasField, 2) + +proc fend*(message: google_protobuf_DescriptorProto_ReservedRange): int32 {.inline.} = + message.fend + +proc `fend=`*(message: google_protobuf_DescriptorProto_ReservedRange, value: int32) {.inline.} = + setfend(message, value) + +proc sizeOfgoogle_protobuf_DescriptorProto_ReservedRange*(message: google_protobuf_DescriptorProto_ReservedRange): uint64 = + if hasstart(message): + result = result + sizeOfTag(1, WireType.Varint) + result = result + sizeOfInt32(message.start) + if hasfend(message): + result = result + sizeOfTag(2, WireType.Varint) + result = result + sizeOfInt32(message.fend) + +proc writegoogle_protobuf_DescriptorProto_ReservedRange*(stream: ProtobufStream, message: google_protobuf_DescriptorProto_ReservedRange) = + if hasstart(message): + writeInt32(stream, message.start, 1) + if hasfend(message): + writeInt32(stream, message.fend, 2) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_DescriptorProto_ReservedRange*(stream: ProtobufStream): google_protobuf_DescriptorProto_ReservedRange = + result = newgoogle_protobuf_DescriptorProto_ReservedRange() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.Varint) + setstart(result, readInt32(stream)) + of 2: + expectWireType(wireType, WireType.Varint) + setfend(result, readInt32(stream)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_DescriptorProto_ReservedRange): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_DescriptorProto_ReservedRange(pbs, message) + result = ss.data + +proc newgoogle_protobuf_DescriptorProto_ReservedRange*(data: string): google_protobuf_DescriptorProto_ReservedRange = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_DescriptorProto_ReservedRange(pbs) + + +proc newgoogle_protobuf_DescriptorProto*(): google_protobuf_DescriptorProto = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.name = "" + result.field = @[] + result.extension = @[] + result.nested_type = @[] + result.enum_type = @[] + result.extension_range = @[] + result.oneof_decl = @[] + result.options = nil + result.reserved_range = @[] + result.reserved_name = @[] + +proc clearname*(message: google_protobuf_DescriptorProto) = + message.name = "" + excl(message.hasField, [1]) + +proc hasname*(message: google_protobuf_DescriptorProto): bool = + result = contains(message.hasField, 1) + +proc setname*(message: google_protobuf_DescriptorProto, value: string) = + message.name = value + incl(message.hasField, 1) + +proc name*(message: google_protobuf_DescriptorProto): string {.inline.} = + message.name + +proc `name=`*(message: google_protobuf_DescriptorProto, value: string) {.inline.} = + setname(message, value) + +proc clearfield*(message: google_protobuf_DescriptorProto) = + message.field = @[] + excl(message.hasField, [2]) + +proc hasfield*(message: google_protobuf_DescriptorProto): bool = + result = contains(message.hasField, 2) or (len(message.field) > 0) + +proc setfield*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_FieldDescriptorProto]) = + message.field = value + incl(message.hasField, 2) + +proc addfield*(message: google_protobuf_DescriptorProto, value: google_protobuf_FieldDescriptorProto) = + add(message.field, value) + incl(message.hasField, 2) + +proc field*(message: google_protobuf_DescriptorProto): seq[google_protobuf_FieldDescriptorProto] {.inline.} = + message.field + +proc `field=`*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_FieldDescriptorProto]) {.inline.} = + setfield(message, value) + +proc clearextension*(message: google_protobuf_DescriptorProto) = + message.extension = @[] + excl(message.hasField, [6]) + +proc hasextension*(message: google_protobuf_DescriptorProto): bool = + result = contains(message.hasField, 6) or (len(message.extension) > 0) + +proc setextension*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_FieldDescriptorProto]) = + message.extension = value + incl(message.hasField, 6) + +proc addextension*(message: google_protobuf_DescriptorProto, value: google_protobuf_FieldDescriptorProto) = + add(message.extension, value) + incl(message.hasField, 6) + +proc extension*(message: google_protobuf_DescriptorProto): seq[google_protobuf_FieldDescriptorProto] {.inline.} = + message.extension + +proc `extension=`*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_FieldDescriptorProto]) {.inline.} = + setextension(message, value) + +proc clearnested_type*(message: google_protobuf_DescriptorProto) = + message.nested_type = @[] + excl(message.hasField, [3]) + +proc hasnested_type*(message: google_protobuf_DescriptorProto): bool = + result = contains(message.hasField, 3) or (len(message.nested_type) > 0) + +proc setnested_type*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_DescriptorProto]) = + message.nested_type = value + incl(message.hasField, 3) + +proc addnested_type*(message: google_protobuf_DescriptorProto, value: google_protobuf_DescriptorProto) = + add(message.nested_type, value) + incl(message.hasField, 3) + +proc nested_type*(message: google_protobuf_DescriptorProto): seq[google_protobuf_DescriptorProto] {.inline.} = + message.nested_type + +proc `nested_type=`*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_DescriptorProto]) {.inline.} = + setnested_type(message, value) + +proc clearenum_type*(message: google_protobuf_DescriptorProto) = + message.enum_type = @[] + excl(message.hasField, [4]) + +proc hasenum_type*(message: google_protobuf_DescriptorProto): bool = + result = contains(message.hasField, 4) or (len(message.enum_type) > 0) + +proc setenum_type*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_EnumDescriptorProto]) = + message.enum_type = value + incl(message.hasField, 4) + +proc addenum_type*(message: google_protobuf_DescriptorProto, value: google_protobuf_EnumDescriptorProto) = + add(message.enum_type, value) + incl(message.hasField, 4) + +proc enum_type*(message: google_protobuf_DescriptorProto): seq[google_protobuf_EnumDescriptorProto] {.inline.} = + message.enum_type + +proc `enum_type=`*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_EnumDescriptorProto]) {.inline.} = + setenum_type(message, value) + +proc clearextension_range*(message: google_protobuf_DescriptorProto) = + message.extension_range = @[] + excl(message.hasField, [5]) + +proc hasextension_range*(message: google_protobuf_DescriptorProto): bool = + result = contains(message.hasField, 5) or (len(message.extension_range) > 0) + +proc setextension_range*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_DescriptorProto_ExtensionRange]) = + message.extension_range = value + incl(message.hasField, 5) + +proc addextension_range*(message: google_protobuf_DescriptorProto, value: google_protobuf_DescriptorProto_ExtensionRange) = + add(message.extension_range, value) + incl(message.hasField, 5) + +proc extension_range*(message: google_protobuf_DescriptorProto): seq[google_protobuf_DescriptorProto_ExtensionRange] {.inline.} = + message.extension_range + +proc `extension_range=`*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_DescriptorProto_ExtensionRange]) {.inline.} = + setextension_range(message, value) + +proc clearoneof_decl*(message: google_protobuf_DescriptorProto) = + message.oneof_decl = @[] + excl(message.hasField, [8]) + +proc hasoneof_decl*(message: google_protobuf_DescriptorProto): bool = + result = contains(message.hasField, 8) or (len(message.oneof_decl) > 0) + +proc setoneof_decl*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_OneofDescriptorProto]) = + message.oneof_decl = value + incl(message.hasField, 8) + +proc addoneof_decl*(message: google_protobuf_DescriptorProto, value: google_protobuf_OneofDescriptorProto) = + add(message.oneof_decl, value) + incl(message.hasField, 8) + +proc oneof_decl*(message: google_protobuf_DescriptorProto): seq[google_protobuf_OneofDescriptorProto] {.inline.} = + message.oneof_decl + +proc `oneof_decl=`*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_OneofDescriptorProto]) {.inline.} = + setoneof_decl(message, value) + +proc clearoptions*(message: google_protobuf_DescriptorProto) = + message.options = nil + excl(message.hasField, [7]) + +proc hasoptions*(message: google_protobuf_DescriptorProto): bool = + result = contains(message.hasField, 7) + +proc setoptions*(message: google_protobuf_DescriptorProto, value: google_protobuf_MessageOptions) = + message.options = value + incl(message.hasField, 7) + +proc options*(message: google_protobuf_DescriptorProto): google_protobuf_MessageOptions {.inline.} = + message.options + +proc `options=`*(message: google_protobuf_DescriptorProto, value: google_protobuf_MessageOptions) {.inline.} = + setoptions(message, value) + +proc clearreserved_range*(message: google_protobuf_DescriptorProto) = + message.reserved_range = @[] + excl(message.hasField, [9]) + +proc hasreserved_range*(message: google_protobuf_DescriptorProto): bool = + result = contains(message.hasField, 9) or (len(message.reserved_range) > 0) + +proc setreserved_range*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_DescriptorProto_ReservedRange]) = + message.reserved_range = value + incl(message.hasField, 9) + +proc addreserved_range*(message: google_protobuf_DescriptorProto, value: google_protobuf_DescriptorProto_ReservedRange) = + add(message.reserved_range, value) + incl(message.hasField, 9) + +proc reserved_range*(message: google_protobuf_DescriptorProto): seq[google_protobuf_DescriptorProto_ReservedRange] {.inline.} = + message.reserved_range + +proc `reserved_range=`*(message: google_protobuf_DescriptorProto, value: seq[google_protobuf_DescriptorProto_ReservedRange]) {.inline.} = + setreserved_range(message, value) + +proc clearreserved_name*(message: google_protobuf_DescriptorProto) = + message.reserved_name = @[] + excl(message.hasField, [10]) + +proc hasreserved_name*(message: google_protobuf_DescriptorProto): bool = + result = contains(message.hasField, 10) or (len(message.reserved_name) > 0) + +proc setreserved_name*(message: google_protobuf_DescriptorProto, value: seq[string]) = + message.reserved_name = value + incl(message.hasField, 10) + +proc addreserved_name*(message: google_protobuf_DescriptorProto, value: string) = + add(message.reserved_name, value) + incl(message.hasField, 10) + +proc reserved_name*(message: google_protobuf_DescriptorProto): seq[string] {.inline.} = + message.reserved_name + +proc `reserved_name=`*(message: google_protobuf_DescriptorProto, value: seq[string]) {.inline.} = + setreserved_name(message, value) + +proc sizeOfgoogle_protobuf_DescriptorProto*(message: google_protobuf_DescriptorProto): uint64 = + if hasname(message): + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfString(message.name) + for value in message.field: + result = result + sizeOfTag(2, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_FieldDescriptorProto(value)) + for value in message.extension: + result = result + sizeOfTag(6, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_FieldDescriptorProto(value)) + for value in message.nested_type: + result = result + sizeOfTag(3, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_DescriptorProto(value)) + for value in message.enum_type: + result = result + sizeOfTag(4, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_EnumDescriptorProto(value)) + for value in message.extension_range: + result = result + sizeOfTag(5, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_DescriptorProto_ExtensionRange(value)) + for value in message.oneof_decl: + result = result + sizeOfTag(8, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_OneofDescriptorProto(value)) + if hasoptions(message): + result = result + sizeOfTag(7, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_MessageOptions(message.options)) + for value in message.reserved_range: + result = result + sizeOfTag(9, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_DescriptorProto_ReservedRange(value)) + for value in message.reserved_name: + result = result + sizeOfTag(10, WireType.LengthDelimited) + result = result + sizeOfString(value) + +proc writegoogle_protobuf_DescriptorProto*(stream: ProtobufStream, message: google_protobuf_DescriptorProto) = + if hasname(message): + writeString(stream, message.name, 1) + for value in message.field: + writeMessage(stream, value, 2) + for value in message.extension: + writeMessage(stream, value, 6) + for value in message.nested_type: + writeMessage(stream, value, 3) + for value in message.enum_type: + writeMessage(stream, value, 4) + for value in message.extension_range: + writeMessage(stream, value, 5) + for value in message.oneof_decl: + writeMessage(stream, value, 8) + if hasoptions(message): + writeMessage(stream, message.options, 7) + for value in message.reserved_range: + writeMessage(stream, value, 9) + for value in message.reserved_name: + writeString(stream, value, 10) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_DescriptorProto*(stream: ProtobufStream): google_protobuf_DescriptorProto = + result = newgoogle_protobuf_DescriptorProto() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.LengthDelimited) + setname(result, readString(stream)) + of 2: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addfield(result, newgoogle_protobuf_FieldDescriptorProto(data)) + of 6: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addextension(result, newgoogle_protobuf_FieldDescriptorProto(data)) + of 3: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addnested_type(result, newgoogle_protobuf_DescriptorProto(data)) + of 4: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addenum_type(result, newgoogle_protobuf_EnumDescriptorProto(data)) + of 5: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addextension_range(result, newgoogle_protobuf_DescriptorProto_ExtensionRange(data)) + of 8: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addoneof_decl(result, newgoogle_protobuf_OneofDescriptorProto(data)) + of 7: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + setoptions(result, newgoogle_protobuf_MessageOptions(data)) + of 9: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addreserved_range(result, newgoogle_protobuf_DescriptorProto_ReservedRange(data)) + of 10: + expectWireType(wireType, WireType.LengthDelimited) + addreserved_name(result, readString(stream)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_DescriptorProto): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_DescriptorProto(pbs, message) + result = ss.data + +proc newgoogle_protobuf_DescriptorProto*(data: string): google_protobuf_DescriptorProto = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_DescriptorProto(pbs) + + +proc newgoogle_protobuf_FileOptions*(): google_protobuf_FileOptions = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.java_package = "" + result.java_outer_classname = "" + result.java_multiple_files = false + result.java_generate_equals_and_hash = false + result.java_string_check_utf8 = false + result.optimize_for = google_protobuf_FileOptions_OptimizeMode.SPEED + result.go_package = "" + result.cc_generic_services = false + result.java_generic_services = false + result.py_generic_services = false + result.php_generic_services = false + result.deprecated = false + result.cc_enable_arenas = false + result.objc_class_prefix = "" + result.csharp_namespace = "" + result.swift_prefix = "" + result.php_class_prefix = "" + result.php_namespace = "" + result.uninterpreted_option = @[] + +proc clearjava_package*(message: google_protobuf_FileOptions) = + message.java_package = "" + excl(message.hasField, [1]) + +proc hasjava_package*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 1) + +proc setjava_package*(message: google_protobuf_FileOptions, value: string) = + message.java_package = value + incl(message.hasField, 1) + +proc java_package*(message: google_protobuf_FileOptions): string {.inline.} = + message.java_package + +proc `java_package=`*(message: google_protobuf_FileOptions, value: string) {.inline.} = + setjava_package(message, value) + +proc clearjava_outer_classname*(message: google_protobuf_FileOptions) = + message.java_outer_classname = "" + excl(message.hasField, [8]) + +proc hasjava_outer_classname*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 8) + +proc setjava_outer_classname*(message: google_protobuf_FileOptions, value: string) = + message.java_outer_classname = value + incl(message.hasField, 8) + +proc java_outer_classname*(message: google_protobuf_FileOptions): string {.inline.} = + message.java_outer_classname + +proc `java_outer_classname=`*(message: google_protobuf_FileOptions, value: string) {.inline.} = + setjava_outer_classname(message, value) + +proc clearjava_multiple_files*(message: google_protobuf_FileOptions) = + message.java_multiple_files = false + excl(message.hasField, [10]) + +proc hasjava_multiple_files*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 10) + +proc setjava_multiple_files*(message: google_protobuf_FileOptions, value: bool) = + message.java_multiple_files = value + incl(message.hasField, 10) + +proc java_multiple_files*(message: google_protobuf_FileOptions): bool {.inline.} = + message.java_multiple_files + +proc `java_multiple_files=`*(message: google_protobuf_FileOptions, value: bool) {.inline.} = + setjava_multiple_files(message, value) + +proc clearjava_generate_equals_and_hash*(message: google_protobuf_FileOptions) = + message.java_generate_equals_and_hash = false + excl(message.hasField, [20]) + +proc hasjava_generate_equals_and_hash*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 20) + +proc setjava_generate_equals_and_hash*(message: google_protobuf_FileOptions, value: bool) = + message.java_generate_equals_and_hash = value + incl(message.hasField, 20) + +proc java_generate_equals_and_hash*(message: google_protobuf_FileOptions): bool {.inline.} = + message.java_generate_equals_and_hash + +proc `java_generate_equals_and_hash=`*(message: google_protobuf_FileOptions, value: bool) {.inline.} = + setjava_generate_equals_and_hash(message, value) + +proc clearjava_string_check_utf8*(message: google_protobuf_FileOptions) = + message.java_string_check_utf8 = false + excl(message.hasField, [27]) + +proc hasjava_string_check_utf8*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 27) + +proc setjava_string_check_utf8*(message: google_protobuf_FileOptions, value: bool) = + message.java_string_check_utf8 = value + incl(message.hasField, 27) + +proc java_string_check_utf8*(message: google_protobuf_FileOptions): bool {.inline.} = + message.java_string_check_utf8 + +proc `java_string_check_utf8=`*(message: google_protobuf_FileOptions, value: bool) {.inline.} = + setjava_string_check_utf8(message, value) + +proc clearoptimize_for*(message: google_protobuf_FileOptions) = + message.optimize_for = google_protobuf_FileOptions_OptimizeMode.SPEED + excl(message.hasField, [9]) + +proc hasoptimize_for*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 9) + +proc setoptimize_for*(message: google_protobuf_FileOptions, value: google_protobuf_FileOptions_OptimizeMode) = + message.optimize_for = value + incl(message.hasField, 9) + +proc optimize_for*(message: google_protobuf_FileOptions): google_protobuf_FileOptions_OptimizeMode {.inline.} = + message.optimize_for + +proc `optimize_for=`*(message: google_protobuf_FileOptions, value: google_protobuf_FileOptions_OptimizeMode) {.inline.} = + setoptimize_for(message, value) + +proc cleargo_package*(message: google_protobuf_FileOptions) = + message.go_package = "" + excl(message.hasField, [11]) + +proc hasgo_package*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 11) + +proc setgo_package*(message: google_protobuf_FileOptions, value: string) = + message.go_package = value + incl(message.hasField, 11) + +proc go_package*(message: google_protobuf_FileOptions): string {.inline.} = + message.go_package + +proc `go_package=`*(message: google_protobuf_FileOptions, value: string) {.inline.} = + setgo_package(message, value) + +proc clearcc_generic_services*(message: google_protobuf_FileOptions) = + message.cc_generic_services = false + excl(message.hasField, [16]) + +proc hascc_generic_services*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 16) + +proc setcc_generic_services*(message: google_protobuf_FileOptions, value: bool) = + message.cc_generic_services = value + incl(message.hasField, 16) + +proc cc_generic_services*(message: google_protobuf_FileOptions): bool {.inline.} = + message.cc_generic_services + +proc `cc_generic_services=`*(message: google_protobuf_FileOptions, value: bool) {.inline.} = + setcc_generic_services(message, value) + +proc clearjava_generic_services*(message: google_protobuf_FileOptions) = + message.java_generic_services = false + excl(message.hasField, [17]) + +proc hasjava_generic_services*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 17) + +proc setjava_generic_services*(message: google_protobuf_FileOptions, value: bool) = + message.java_generic_services = value + incl(message.hasField, 17) + +proc java_generic_services*(message: google_protobuf_FileOptions): bool {.inline.} = + message.java_generic_services + +proc `java_generic_services=`*(message: google_protobuf_FileOptions, value: bool) {.inline.} = + setjava_generic_services(message, value) + +proc clearpy_generic_services*(message: google_protobuf_FileOptions) = + message.py_generic_services = false + excl(message.hasField, [18]) + +proc haspy_generic_services*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 18) + +proc setpy_generic_services*(message: google_protobuf_FileOptions, value: bool) = + message.py_generic_services = value + incl(message.hasField, 18) + +proc py_generic_services*(message: google_protobuf_FileOptions): bool {.inline.} = + message.py_generic_services + +proc `py_generic_services=`*(message: google_protobuf_FileOptions, value: bool) {.inline.} = + setpy_generic_services(message, value) + +proc clearphp_generic_services*(message: google_protobuf_FileOptions) = + message.php_generic_services = false + excl(message.hasField, [42]) + +proc hasphp_generic_services*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 42) + +proc setphp_generic_services*(message: google_protobuf_FileOptions, value: bool) = + message.php_generic_services = value + incl(message.hasField, 42) + +proc php_generic_services*(message: google_protobuf_FileOptions): bool {.inline.} = + message.php_generic_services + +proc `php_generic_services=`*(message: google_protobuf_FileOptions, value: bool) {.inline.} = + setphp_generic_services(message, value) + +proc cleardeprecated*(message: google_protobuf_FileOptions) = + message.deprecated = false + excl(message.hasField, [23]) + +proc hasdeprecated*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 23) + +proc setdeprecated*(message: google_protobuf_FileOptions, value: bool) = + message.deprecated = value + incl(message.hasField, 23) + +proc deprecated*(message: google_protobuf_FileOptions): bool {.inline.} = + message.deprecated + +proc `deprecated=`*(message: google_protobuf_FileOptions, value: bool) {.inline.} = + setdeprecated(message, value) + +proc clearcc_enable_arenas*(message: google_protobuf_FileOptions) = + message.cc_enable_arenas = false + excl(message.hasField, [31]) + +proc hascc_enable_arenas*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 31) + +proc setcc_enable_arenas*(message: google_protobuf_FileOptions, value: bool) = + message.cc_enable_arenas = value + incl(message.hasField, 31) + +proc cc_enable_arenas*(message: google_protobuf_FileOptions): bool {.inline.} = + message.cc_enable_arenas + +proc `cc_enable_arenas=`*(message: google_protobuf_FileOptions, value: bool) {.inline.} = + setcc_enable_arenas(message, value) + +proc clearobjc_class_prefix*(message: google_protobuf_FileOptions) = + message.objc_class_prefix = "" + excl(message.hasField, [36]) + +proc hasobjc_class_prefix*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 36) + +proc setobjc_class_prefix*(message: google_protobuf_FileOptions, value: string) = + message.objc_class_prefix = value + incl(message.hasField, 36) + +proc objc_class_prefix*(message: google_protobuf_FileOptions): string {.inline.} = + message.objc_class_prefix + +proc `objc_class_prefix=`*(message: google_protobuf_FileOptions, value: string) {.inline.} = + setobjc_class_prefix(message, value) + +proc clearcsharp_namespace*(message: google_protobuf_FileOptions) = + message.csharp_namespace = "" + excl(message.hasField, [37]) + +proc hascsharp_namespace*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 37) + +proc setcsharp_namespace*(message: google_protobuf_FileOptions, value: string) = + message.csharp_namespace = value + incl(message.hasField, 37) + +proc csharp_namespace*(message: google_protobuf_FileOptions): string {.inline.} = + message.csharp_namespace + +proc `csharp_namespace=`*(message: google_protobuf_FileOptions, value: string) {.inline.} = + setcsharp_namespace(message, value) + +proc clearswift_prefix*(message: google_protobuf_FileOptions) = + message.swift_prefix = "" + excl(message.hasField, [39]) + +proc hasswift_prefix*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 39) + +proc setswift_prefix*(message: google_protobuf_FileOptions, value: string) = + message.swift_prefix = value + incl(message.hasField, 39) + +proc swift_prefix*(message: google_protobuf_FileOptions): string {.inline.} = + message.swift_prefix + +proc `swift_prefix=`*(message: google_protobuf_FileOptions, value: string) {.inline.} = + setswift_prefix(message, value) + +proc clearphp_class_prefix*(message: google_protobuf_FileOptions) = + message.php_class_prefix = "" + excl(message.hasField, [40]) + +proc hasphp_class_prefix*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 40) + +proc setphp_class_prefix*(message: google_protobuf_FileOptions, value: string) = + message.php_class_prefix = value + incl(message.hasField, 40) + +proc php_class_prefix*(message: google_protobuf_FileOptions): string {.inline.} = + message.php_class_prefix + +proc `php_class_prefix=`*(message: google_protobuf_FileOptions, value: string) {.inline.} = + setphp_class_prefix(message, value) + +proc clearphp_namespace*(message: google_protobuf_FileOptions) = + message.php_namespace = "" + excl(message.hasField, [41]) + +proc hasphp_namespace*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 41) + +proc setphp_namespace*(message: google_protobuf_FileOptions, value: string) = + message.php_namespace = value + incl(message.hasField, 41) + +proc php_namespace*(message: google_protobuf_FileOptions): string {.inline.} = + message.php_namespace + +proc `php_namespace=`*(message: google_protobuf_FileOptions, value: string) {.inline.} = + setphp_namespace(message, value) + +proc clearuninterpreted_option*(message: google_protobuf_FileOptions) = + message.uninterpreted_option = @[] + excl(message.hasField, [999]) + +proc hasuninterpreted_option*(message: google_protobuf_FileOptions): bool = + result = contains(message.hasField, 999) or (len(message.uninterpreted_option) > 0) + +proc setuninterpreted_option*(message: google_protobuf_FileOptions, value: seq[google_protobuf_UninterpretedOption]) = + message.uninterpreted_option = value + incl(message.hasField, 999) + +proc adduninterpreted_option*(message: google_protobuf_FileOptions, value: google_protobuf_UninterpretedOption) = + add(message.uninterpreted_option, value) + incl(message.hasField, 999) + +proc uninterpreted_option*(message: google_protobuf_FileOptions): seq[google_protobuf_UninterpretedOption] {.inline.} = + message.uninterpreted_option + +proc `uninterpreted_option=`*(message: google_protobuf_FileOptions, value: seq[google_protobuf_UninterpretedOption]) {.inline.} = + setuninterpreted_option(message, value) + +proc sizeOfgoogle_protobuf_FileOptions*(message: google_protobuf_FileOptions): uint64 = + if hasjava_package(message): + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfString(message.java_package) + if hasjava_outer_classname(message): + result = result + sizeOfTag(8, WireType.LengthDelimited) + result = result + sizeOfString(message.java_outer_classname) + if hasjava_multiple_files(message): + result = result + sizeOfTag(10, WireType.Varint) + result = result + sizeOfBool(message.java_multiple_files) + if hasjava_generate_equals_and_hash(message): + result = result + sizeOfTag(20, WireType.Varint) + result = result + sizeOfBool(message.java_generate_equals_and_hash) + if hasjava_string_check_utf8(message): + result = result + sizeOfTag(27, WireType.Varint) + result = result + sizeOfBool(message.java_string_check_utf8) + if hasoptimize_for(message): + result = result + sizeOfTag(9, WireType.Varint) + result = result + sizeOfEnum[google_protobuf_FileOptions_OptimizeMode](message.optimize_for) + if hasgo_package(message): + result = result + sizeOfTag(11, WireType.LengthDelimited) + result = result + sizeOfString(message.go_package) + if hascc_generic_services(message): + result = result + sizeOfTag(16, WireType.Varint) + result = result + sizeOfBool(message.cc_generic_services) + if hasjava_generic_services(message): + result = result + sizeOfTag(17, WireType.Varint) + result = result + sizeOfBool(message.java_generic_services) + if haspy_generic_services(message): + result = result + sizeOfTag(18, WireType.Varint) + result = result + sizeOfBool(message.py_generic_services) + if hasphp_generic_services(message): + result = result + sizeOfTag(42, WireType.Varint) + result = result + sizeOfBool(message.php_generic_services) + if hasdeprecated(message): + result = result + sizeOfTag(23, WireType.Varint) + result = result + sizeOfBool(message.deprecated) + if hascc_enable_arenas(message): + result = result + sizeOfTag(31, WireType.Varint) + result = result + sizeOfBool(message.cc_enable_arenas) + if hasobjc_class_prefix(message): + result = result + sizeOfTag(36, WireType.LengthDelimited) + result = result + sizeOfString(message.objc_class_prefix) + if hascsharp_namespace(message): + result = result + sizeOfTag(37, WireType.LengthDelimited) + result = result + sizeOfString(message.csharp_namespace) + if hasswift_prefix(message): + result = result + sizeOfTag(39, WireType.LengthDelimited) + result = result + sizeOfString(message.swift_prefix) + if hasphp_class_prefix(message): + result = result + sizeOfTag(40, WireType.LengthDelimited) + result = result + sizeOfString(message.php_class_prefix) + if hasphp_namespace(message): + result = result + sizeOfTag(41, WireType.LengthDelimited) + result = result + sizeOfString(message.php_namespace) + for value in message.uninterpreted_option: + result = result + sizeOfTag(999, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_UninterpretedOption(value)) + +proc writegoogle_protobuf_FileOptions*(stream: ProtobufStream, message: google_protobuf_FileOptions) = + if hasjava_package(message): + writeString(stream, message.java_package, 1) + if hasjava_outer_classname(message): + writeString(stream, message.java_outer_classname, 8) + if hasjava_multiple_files(message): + writeBool(stream, message.java_multiple_files, 10) + if hasjava_generate_equals_and_hash(message): + writeBool(stream, message.java_generate_equals_and_hash, 20) + if hasjava_string_check_utf8(message): + writeBool(stream, message.java_string_check_utf8, 27) + if hasoptimize_for(message): + writeEnum(stream, message.optimize_for, 9) + if hasgo_package(message): + writeString(stream, message.go_package, 11) + if hascc_generic_services(message): + writeBool(stream, message.cc_generic_services, 16) + if hasjava_generic_services(message): + writeBool(stream, message.java_generic_services, 17) + if haspy_generic_services(message): + writeBool(stream, message.py_generic_services, 18) + if hasphp_generic_services(message): + writeBool(stream, message.php_generic_services, 42) + if hasdeprecated(message): + writeBool(stream, message.deprecated, 23) + if hascc_enable_arenas(message): + writeBool(stream, message.cc_enable_arenas, 31) + if hasobjc_class_prefix(message): + writeString(stream, message.objc_class_prefix, 36) + if hascsharp_namespace(message): + writeString(stream, message.csharp_namespace, 37) + if hasswift_prefix(message): + writeString(stream, message.swift_prefix, 39) + if hasphp_class_prefix(message): + writeString(stream, message.php_class_prefix, 40) + if hasphp_namespace(message): + writeString(stream, message.php_namespace, 41) + for value in message.uninterpreted_option: + writeMessage(stream, value, 999) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_FileOptions*(stream: ProtobufStream): google_protobuf_FileOptions = + result = newgoogle_protobuf_FileOptions() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.LengthDelimited) + setjava_package(result, readString(stream)) + of 8: + expectWireType(wireType, WireType.LengthDelimited) + setjava_outer_classname(result, readString(stream)) + of 10: + expectWireType(wireType, WireType.Varint) + setjava_multiple_files(result, readBool(stream)) + of 20: + expectWireType(wireType, WireType.Varint) + setjava_generate_equals_and_hash(result, readBool(stream)) + of 27: + expectWireType(wireType, WireType.Varint) + setjava_string_check_utf8(result, readBool(stream)) + of 9: + expectWireType(wireType, WireType.Varint) + setoptimize_for(result, readEnum[google_protobuf_FileOptions_OptimizeMode](stream)) + of 11: + expectWireType(wireType, WireType.LengthDelimited) + setgo_package(result, readString(stream)) + of 16: + expectWireType(wireType, WireType.Varint) + setcc_generic_services(result, readBool(stream)) + of 17: + expectWireType(wireType, WireType.Varint) + setjava_generic_services(result, readBool(stream)) + of 18: + expectWireType(wireType, WireType.Varint) + setpy_generic_services(result, readBool(stream)) + of 42: + expectWireType(wireType, WireType.Varint) + setphp_generic_services(result, readBool(stream)) + of 23: + expectWireType(wireType, WireType.Varint) + setdeprecated(result, readBool(stream)) + of 31: + expectWireType(wireType, WireType.Varint) + setcc_enable_arenas(result, readBool(stream)) + of 36: + expectWireType(wireType, WireType.LengthDelimited) + setobjc_class_prefix(result, readString(stream)) + of 37: + expectWireType(wireType, WireType.LengthDelimited) + setcsharp_namespace(result, readString(stream)) + of 39: + expectWireType(wireType, WireType.LengthDelimited) + setswift_prefix(result, readString(stream)) + of 40: + expectWireType(wireType, WireType.LengthDelimited) + setphp_class_prefix(result, readString(stream)) + of 41: + expectWireType(wireType, WireType.LengthDelimited) + setphp_namespace(result, readString(stream)) + of 999: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + adduninterpreted_option(result, newgoogle_protobuf_UninterpretedOption(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_FileOptions): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_FileOptions(pbs, message) + result = ss.data + +proc newgoogle_protobuf_FileOptions*(data: string): google_protobuf_FileOptions = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_FileOptions(pbs) + + +proc newgoogle_protobuf_ServiceOptions*(): google_protobuf_ServiceOptions = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.deprecated = false + result.uninterpreted_option = @[] + +proc cleardeprecated*(message: google_protobuf_ServiceOptions) = + message.deprecated = false + excl(message.hasField, [33]) + +proc hasdeprecated*(message: google_protobuf_ServiceOptions): bool = + result = contains(message.hasField, 33) + +proc setdeprecated*(message: google_protobuf_ServiceOptions, value: bool) = + message.deprecated = value + incl(message.hasField, 33) + +proc deprecated*(message: google_protobuf_ServiceOptions): bool {.inline.} = + message.deprecated + +proc `deprecated=`*(message: google_protobuf_ServiceOptions, value: bool) {.inline.} = + setdeprecated(message, value) + +proc clearuninterpreted_option*(message: google_protobuf_ServiceOptions) = + message.uninterpreted_option = @[] + excl(message.hasField, [999]) + +proc hasuninterpreted_option*(message: google_protobuf_ServiceOptions): bool = + result = contains(message.hasField, 999) or (len(message.uninterpreted_option) > 0) + +proc setuninterpreted_option*(message: google_protobuf_ServiceOptions, value: seq[google_protobuf_UninterpretedOption]) = + message.uninterpreted_option = value + incl(message.hasField, 999) + +proc adduninterpreted_option*(message: google_protobuf_ServiceOptions, value: google_protobuf_UninterpretedOption) = + add(message.uninterpreted_option, value) + incl(message.hasField, 999) + +proc uninterpreted_option*(message: google_protobuf_ServiceOptions): seq[google_protobuf_UninterpretedOption] {.inline.} = + message.uninterpreted_option + +proc `uninterpreted_option=`*(message: google_protobuf_ServiceOptions, value: seq[google_protobuf_UninterpretedOption]) {.inline.} = + setuninterpreted_option(message, value) + +proc sizeOfgoogle_protobuf_ServiceOptions*(message: google_protobuf_ServiceOptions): uint64 = + if hasdeprecated(message): + result = result + sizeOfTag(33, WireType.Varint) + result = result + sizeOfBool(message.deprecated) + for value in message.uninterpreted_option: + result = result + sizeOfTag(999, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_UninterpretedOption(value)) + +proc writegoogle_protobuf_ServiceOptions*(stream: ProtobufStream, message: google_protobuf_ServiceOptions) = + if hasdeprecated(message): + writeBool(stream, message.deprecated, 33) + for value in message.uninterpreted_option: + writeMessage(stream, value, 999) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_ServiceOptions*(stream: ProtobufStream): google_protobuf_ServiceOptions = + result = newgoogle_protobuf_ServiceOptions() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 33: + expectWireType(wireType, WireType.Varint) + setdeprecated(result, readBool(stream)) + of 999: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + adduninterpreted_option(result, newgoogle_protobuf_UninterpretedOption(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_ServiceOptions): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_ServiceOptions(pbs, message) + result = ss.data + +proc newgoogle_protobuf_ServiceOptions*(data: string): google_protobuf_ServiceOptions = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_ServiceOptions(pbs) + + +proc newgoogle_protobuf_MethodOptions*(): google_protobuf_MethodOptions = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.deprecated = false + result.idempotency_level = google_protobuf_MethodOptions_IdempotencyLevel.IDEMPOTENCY_UNKNOWN + result.uninterpreted_option = @[] + +proc cleardeprecated*(message: google_protobuf_MethodOptions) = + message.deprecated = false + excl(message.hasField, [33]) + +proc hasdeprecated*(message: google_protobuf_MethodOptions): bool = + result = contains(message.hasField, 33) + +proc setdeprecated*(message: google_protobuf_MethodOptions, value: bool) = + message.deprecated = value + incl(message.hasField, 33) + +proc deprecated*(message: google_protobuf_MethodOptions): bool {.inline.} = + message.deprecated + +proc `deprecated=`*(message: google_protobuf_MethodOptions, value: bool) {.inline.} = + setdeprecated(message, value) + +proc clearidempotency_level*(message: google_protobuf_MethodOptions) = + message.idempotency_level = google_protobuf_MethodOptions_IdempotencyLevel.IDEMPOTENCY_UNKNOWN + excl(message.hasField, [34]) + +proc hasidempotency_level*(message: google_protobuf_MethodOptions): bool = + result = contains(message.hasField, 34) + +proc setidempotency_level*(message: google_protobuf_MethodOptions, value: google_protobuf_MethodOptions_IdempotencyLevel) = + message.idempotency_level = value + incl(message.hasField, 34) + +proc idempotency_level*(message: google_protobuf_MethodOptions): google_protobuf_MethodOptions_IdempotencyLevel {.inline.} = + message.idempotency_level + +proc `idempotency_level=`*(message: google_protobuf_MethodOptions, value: google_protobuf_MethodOptions_IdempotencyLevel) {.inline.} = + setidempotency_level(message, value) + +proc clearuninterpreted_option*(message: google_protobuf_MethodOptions) = + message.uninterpreted_option = @[] + excl(message.hasField, [999]) + +proc hasuninterpreted_option*(message: google_protobuf_MethodOptions): bool = + result = contains(message.hasField, 999) or (len(message.uninterpreted_option) > 0) + +proc setuninterpreted_option*(message: google_protobuf_MethodOptions, value: seq[google_protobuf_UninterpretedOption]) = + message.uninterpreted_option = value + incl(message.hasField, 999) + +proc adduninterpreted_option*(message: google_protobuf_MethodOptions, value: google_protobuf_UninterpretedOption) = + add(message.uninterpreted_option, value) + incl(message.hasField, 999) + +proc uninterpreted_option*(message: google_protobuf_MethodOptions): seq[google_protobuf_UninterpretedOption] {.inline.} = + message.uninterpreted_option + +proc `uninterpreted_option=`*(message: google_protobuf_MethodOptions, value: seq[google_protobuf_UninterpretedOption]) {.inline.} = + setuninterpreted_option(message, value) + +proc sizeOfgoogle_protobuf_MethodOptions*(message: google_protobuf_MethodOptions): uint64 = + if hasdeprecated(message): + result = result + sizeOfTag(33, WireType.Varint) + result = result + sizeOfBool(message.deprecated) + if hasidempotency_level(message): + result = result + sizeOfTag(34, WireType.Varint) + result = result + sizeOfEnum[google_protobuf_MethodOptions_IdempotencyLevel](message.idempotency_level) + for value in message.uninterpreted_option: + result = result + sizeOfTag(999, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_UninterpretedOption(value)) + +proc writegoogle_protobuf_MethodOptions*(stream: ProtobufStream, message: google_protobuf_MethodOptions) = + if hasdeprecated(message): + writeBool(stream, message.deprecated, 33) + if hasidempotency_level(message): + writeEnum(stream, message.idempotency_level, 34) + for value in message.uninterpreted_option: + writeMessage(stream, value, 999) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_MethodOptions*(stream: ProtobufStream): google_protobuf_MethodOptions = + result = newgoogle_protobuf_MethodOptions() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 33: + expectWireType(wireType, WireType.Varint) + setdeprecated(result, readBool(stream)) + of 34: + expectWireType(wireType, WireType.Varint) + setidempotency_level(result, readEnum[google_protobuf_MethodOptions_IdempotencyLevel](stream)) + of 999: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + adduninterpreted_option(result, newgoogle_protobuf_UninterpretedOption(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_MethodOptions): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_MethodOptions(pbs, message) + result = ss.data + +proc newgoogle_protobuf_MethodOptions*(data: string): google_protobuf_MethodOptions = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_MethodOptions(pbs) + + +proc newgoogle_protobuf_MethodDescriptorProto*(): google_protobuf_MethodDescriptorProto = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.name = "" + result.input_type = "" + result.output_type = "" + result.options = nil + result.client_streaming = false + result.server_streaming = false + +proc clearname*(message: google_protobuf_MethodDescriptorProto) = + message.name = "" + excl(message.hasField, [1]) + +proc hasname*(message: google_protobuf_MethodDescriptorProto): bool = + result = contains(message.hasField, 1) + +proc setname*(message: google_protobuf_MethodDescriptorProto, value: string) = + message.name = value + incl(message.hasField, 1) + +proc name*(message: google_protobuf_MethodDescriptorProto): string {.inline.} = + message.name + +proc `name=`*(message: google_protobuf_MethodDescriptorProto, value: string) {.inline.} = + setname(message, value) + +proc clearinput_type*(message: google_protobuf_MethodDescriptorProto) = + message.input_type = "" + excl(message.hasField, [2]) + +proc hasinput_type*(message: google_protobuf_MethodDescriptorProto): bool = + result = contains(message.hasField, 2) + +proc setinput_type*(message: google_protobuf_MethodDescriptorProto, value: string) = + message.input_type = value + incl(message.hasField, 2) + +proc input_type*(message: google_protobuf_MethodDescriptorProto): string {.inline.} = + message.input_type + +proc `input_type=`*(message: google_protobuf_MethodDescriptorProto, value: string) {.inline.} = + setinput_type(message, value) + +proc clearoutput_type*(message: google_protobuf_MethodDescriptorProto) = + message.output_type = "" + excl(message.hasField, [3]) + +proc hasoutput_type*(message: google_protobuf_MethodDescriptorProto): bool = + result = contains(message.hasField, 3) + +proc setoutput_type*(message: google_protobuf_MethodDescriptorProto, value: string) = + message.output_type = value + incl(message.hasField, 3) + +proc output_type*(message: google_protobuf_MethodDescriptorProto): string {.inline.} = + message.output_type + +proc `output_type=`*(message: google_protobuf_MethodDescriptorProto, value: string) {.inline.} = + setoutput_type(message, value) + +proc clearoptions*(message: google_protobuf_MethodDescriptorProto) = + message.options = nil + excl(message.hasField, [4]) + +proc hasoptions*(message: google_protobuf_MethodDescriptorProto): bool = + result = contains(message.hasField, 4) + +proc setoptions*(message: google_protobuf_MethodDescriptorProto, value: google_protobuf_MethodOptions) = + message.options = value + incl(message.hasField, 4) + +proc options*(message: google_protobuf_MethodDescriptorProto): google_protobuf_MethodOptions {.inline.} = + message.options + +proc `options=`*(message: google_protobuf_MethodDescriptorProto, value: google_protobuf_MethodOptions) {.inline.} = + setoptions(message, value) + +proc clearclient_streaming*(message: google_protobuf_MethodDescriptorProto) = + message.client_streaming = false + excl(message.hasField, [5]) + +proc hasclient_streaming*(message: google_protobuf_MethodDescriptorProto): bool = + result = contains(message.hasField, 5) + +proc setclient_streaming*(message: google_protobuf_MethodDescriptorProto, value: bool) = + message.client_streaming = value + incl(message.hasField, 5) + +proc client_streaming*(message: google_protobuf_MethodDescriptorProto): bool {.inline.} = + message.client_streaming + +proc `client_streaming=`*(message: google_protobuf_MethodDescriptorProto, value: bool) {.inline.} = + setclient_streaming(message, value) + +proc clearserver_streaming*(message: google_protobuf_MethodDescriptorProto) = + message.server_streaming = false + excl(message.hasField, [6]) + +proc hasserver_streaming*(message: google_protobuf_MethodDescriptorProto): bool = + result = contains(message.hasField, 6) + +proc setserver_streaming*(message: google_protobuf_MethodDescriptorProto, value: bool) = + message.server_streaming = value + incl(message.hasField, 6) + +proc server_streaming*(message: google_protobuf_MethodDescriptorProto): bool {.inline.} = + message.server_streaming + +proc `server_streaming=`*(message: google_protobuf_MethodDescriptorProto, value: bool) {.inline.} = + setserver_streaming(message, value) + +proc sizeOfgoogle_protobuf_MethodDescriptorProto*(message: google_protobuf_MethodDescriptorProto): uint64 = + if hasname(message): + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfString(message.name) + if hasinput_type(message): + result = result + sizeOfTag(2, WireType.LengthDelimited) + result = result + sizeOfString(message.input_type) + if hasoutput_type(message): + result = result + sizeOfTag(3, WireType.LengthDelimited) + result = result + sizeOfString(message.output_type) + if hasoptions(message): + result = result + sizeOfTag(4, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_MethodOptions(message.options)) + if hasclient_streaming(message): + result = result + sizeOfTag(5, WireType.Varint) + result = result + sizeOfBool(message.client_streaming) + if hasserver_streaming(message): + result = result + sizeOfTag(6, WireType.Varint) + result = result + sizeOfBool(message.server_streaming) + +proc writegoogle_protobuf_MethodDescriptorProto*(stream: ProtobufStream, message: google_protobuf_MethodDescriptorProto) = + if hasname(message): + writeString(stream, message.name, 1) + if hasinput_type(message): + writeString(stream, message.input_type, 2) + if hasoutput_type(message): + writeString(stream, message.output_type, 3) + if hasoptions(message): + writeMessage(stream, message.options, 4) + if hasclient_streaming(message): + writeBool(stream, message.client_streaming, 5) + if hasserver_streaming(message): + writeBool(stream, message.server_streaming, 6) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_MethodDescriptorProto*(stream: ProtobufStream): google_protobuf_MethodDescriptorProto = + result = newgoogle_protobuf_MethodDescriptorProto() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.LengthDelimited) + setname(result, readString(stream)) + of 2: + expectWireType(wireType, WireType.LengthDelimited) + setinput_type(result, readString(stream)) + of 3: + expectWireType(wireType, WireType.LengthDelimited) + setoutput_type(result, readString(stream)) + of 4: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + setoptions(result, newgoogle_protobuf_MethodOptions(data)) + of 5: + expectWireType(wireType, WireType.Varint) + setclient_streaming(result, readBool(stream)) + of 6: + expectWireType(wireType, WireType.Varint) + setserver_streaming(result, readBool(stream)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_MethodDescriptorProto): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_MethodDescriptorProto(pbs, message) + result = ss.data + +proc newgoogle_protobuf_MethodDescriptorProto*(data: string): google_protobuf_MethodDescriptorProto = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_MethodDescriptorProto(pbs) + + +proc newgoogle_protobuf_ServiceDescriptorProto*(): google_protobuf_ServiceDescriptorProto = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.name = "" + result.fmethod = @[] + result.options = nil + +proc clearname*(message: google_protobuf_ServiceDescriptorProto) = + message.name = "" + excl(message.hasField, [1]) + +proc hasname*(message: google_protobuf_ServiceDescriptorProto): bool = + result = contains(message.hasField, 1) + +proc setname*(message: google_protobuf_ServiceDescriptorProto, value: string) = + message.name = value + incl(message.hasField, 1) + +proc name*(message: google_protobuf_ServiceDescriptorProto): string {.inline.} = + message.name + +proc `name=`*(message: google_protobuf_ServiceDescriptorProto, value: string) {.inline.} = + setname(message, value) + +proc clearfmethod*(message: google_protobuf_ServiceDescriptorProto) = + message.fmethod = @[] + excl(message.hasField, [2]) + +proc hasfmethod*(message: google_protobuf_ServiceDescriptorProto): bool = + result = contains(message.hasField, 2) or (len(message.fmethod) > 0) + +proc setfmethod*(message: google_protobuf_ServiceDescriptorProto, value: seq[google_protobuf_MethodDescriptorProto]) = + message.fmethod = value + incl(message.hasField, 2) + +proc addfmethod*(message: google_protobuf_ServiceDescriptorProto, value: google_protobuf_MethodDescriptorProto) = + add(message.fmethod, value) + incl(message.hasField, 2) + +proc fmethod*(message: google_protobuf_ServiceDescriptorProto): seq[google_protobuf_MethodDescriptorProto] {.inline.} = + message.fmethod + +proc `fmethod=`*(message: google_protobuf_ServiceDescriptorProto, value: seq[google_protobuf_MethodDescriptorProto]) {.inline.} = + setfmethod(message, value) + +proc clearoptions*(message: google_protobuf_ServiceDescriptorProto) = + message.options = nil + excl(message.hasField, [3]) + +proc hasoptions*(message: google_protobuf_ServiceDescriptorProto): bool = + result = contains(message.hasField, 3) + +proc setoptions*(message: google_protobuf_ServiceDescriptorProto, value: google_protobuf_ServiceOptions) = + message.options = value + incl(message.hasField, 3) + +proc options*(message: google_protobuf_ServiceDescriptorProto): google_protobuf_ServiceOptions {.inline.} = + message.options + +proc `options=`*(message: google_protobuf_ServiceDescriptorProto, value: google_protobuf_ServiceOptions) {.inline.} = + setoptions(message, value) + +proc sizeOfgoogle_protobuf_ServiceDescriptorProto*(message: google_protobuf_ServiceDescriptorProto): uint64 = + if hasname(message): + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfString(message.name) + for value in message.fmethod: + result = result + sizeOfTag(2, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_MethodDescriptorProto(value)) + if hasoptions(message): + result = result + sizeOfTag(3, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_ServiceOptions(message.options)) + +proc writegoogle_protobuf_ServiceDescriptorProto*(stream: ProtobufStream, message: google_protobuf_ServiceDescriptorProto) = + if hasname(message): + writeString(stream, message.name, 1) + for value in message.fmethod: + writeMessage(stream, value, 2) + if hasoptions(message): + writeMessage(stream, message.options, 3) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_ServiceDescriptorProto*(stream: ProtobufStream): google_protobuf_ServiceDescriptorProto = + result = newgoogle_protobuf_ServiceDescriptorProto() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.LengthDelimited) + setname(result, readString(stream)) + of 2: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addfmethod(result, newgoogle_protobuf_MethodDescriptorProto(data)) + of 3: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + setoptions(result, newgoogle_protobuf_ServiceOptions(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_ServiceDescriptorProto): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_ServiceDescriptorProto(pbs, message) + result = ss.data + +proc newgoogle_protobuf_ServiceDescriptorProto*(data: string): google_protobuf_ServiceDescriptorProto = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_ServiceDescriptorProto(pbs) + + +proc newgoogle_protobuf_FileDescriptorProto*(): google_protobuf_FileDescriptorProto = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.name = "" + result.package = "" + result.dependency = @[] + result.public_dependency = @[] + result.weak_dependency = @[] + result.message_type = @[] + result.enum_type = @[] + result.service = @[] + result.extension = @[] + result.options = nil + result.source_code_info = nil + result.syntax = "" + +proc clearname*(message: google_protobuf_FileDescriptorProto) = + message.name = "" + excl(message.hasField, [1]) + +proc hasname*(message: google_protobuf_FileDescriptorProto): bool = + result = contains(message.hasField, 1) + +proc setname*(message: google_protobuf_FileDescriptorProto, value: string) = + message.name = value + incl(message.hasField, 1) + +proc name*(message: google_protobuf_FileDescriptorProto): string {.inline.} = + message.name + +proc `name=`*(message: google_protobuf_FileDescriptorProto, value: string) {.inline.} = + setname(message, value) + +proc clearpackage*(message: google_protobuf_FileDescriptorProto) = + message.package = "" + excl(message.hasField, [2]) + +proc haspackage*(message: google_protobuf_FileDescriptorProto): bool = + result = contains(message.hasField, 2) + +proc setpackage*(message: google_protobuf_FileDescriptorProto, value: string) = + message.package = value + incl(message.hasField, 2) + +proc package*(message: google_protobuf_FileDescriptorProto): string {.inline.} = + message.package + +proc `package=`*(message: google_protobuf_FileDescriptorProto, value: string) {.inline.} = + setpackage(message, value) + +proc cleardependency*(message: google_protobuf_FileDescriptorProto) = + message.dependency = @[] + excl(message.hasField, [3]) + +proc hasdependency*(message: google_protobuf_FileDescriptorProto): bool = + result = contains(message.hasField, 3) or (len(message.dependency) > 0) + +proc setdependency*(message: google_protobuf_FileDescriptorProto, value: seq[string]) = + message.dependency = value + incl(message.hasField, 3) + +proc adddependency*(message: google_protobuf_FileDescriptorProto, value: string) = + add(message.dependency, value) + incl(message.hasField, 3) + +proc dependency*(message: google_protobuf_FileDescriptorProto): seq[string] {.inline.} = + message.dependency + +proc `dependency=`*(message: google_protobuf_FileDescriptorProto, value: seq[string]) {.inline.} = + setdependency(message, value) + +proc clearpublic_dependency*(message: google_protobuf_FileDescriptorProto) = + message.public_dependency = @[] + excl(message.hasField, [10]) + +proc haspublic_dependency*(message: google_protobuf_FileDescriptorProto): bool = + result = contains(message.hasField, 10) or (len(message.public_dependency) > 0) + +proc setpublic_dependency*(message: google_protobuf_FileDescriptorProto, value: seq[int32]) = + message.public_dependency = value + incl(message.hasField, 10) + +proc addpublic_dependency*(message: google_protobuf_FileDescriptorProto, value: int32) = + add(message.public_dependency, value) + incl(message.hasField, 10) + +proc public_dependency*(message: google_protobuf_FileDescriptorProto): seq[int32] {.inline.} = + message.public_dependency + +proc `public_dependency=`*(message: google_protobuf_FileDescriptorProto, value: seq[int32]) {.inline.} = + setpublic_dependency(message, value) + +proc clearweak_dependency*(message: google_protobuf_FileDescriptorProto) = + message.weak_dependency = @[] + excl(message.hasField, [11]) + +proc hasweak_dependency*(message: google_protobuf_FileDescriptorProto): bool = + result = contains(message.hasField, 11) or (len(message.weak_dependency) > 0) + +proc setweak_dependency*(message: google_protobuf_FileDescriptorProto, value: seq[int32]) = + message.weak_dependency = value + incl(message.hasField, 11) + +proc addweak_dependency*(message: google_protobuf_FileDescriptorProto, value: int32) = + add(message.weak_dependency, value) + incl(message.hasField, 11) + +proc weak_dependency*(message: google_protobuf_FileDescriptorProto): seq[int32] {.inline.} = + message.weak_dependency + +proc `weak_dependency=`*(message: google_protobuf_FileDescriptorProto, value: seq[int32]) {.inline.} = + setweak_dependency(message, value) + +proc clearmessage_type*(message: google_protobuf_FileDescriptorProto) = + message.message_type = @[] + excl(message.hasField, [4]) + +proc hasmessage_type*(message: google_protobuf_FileDescriptorProto): bool = + result = contains(message.hasField, 4) or (len(message.message_type) > 0) + +proc setmessage_type*(message: google_protobuf_FileDescriptorProto, value: seq[google_protobuf_DescriptorProto]) = + message.message_type = value + incl(message.hasField, 4) + +proc addmessage_type*(message: google_protobuf_FileDescriptorProto, value: google_protobuf_DescriptorProto) = + add(message.message_type, value) + incl(message.hasField, 4) + +proc message_type*(message: google_protobuf_FileDescriptorProto): seq[google_protobuf_DescriptorProto] {.inline.} = + message.message_type + +proc `message_type=`*(message: google_protobuf_FileDescriptorProto, value: seq[google_protobuf_DescriptorProto]) {.inline.} = + setmessage_type(message, value) + +proc clearenum_type*(message: google_protobuf_FileDescriptorProto) = + message.enum_type = @[] + excl(message.hasField, [5]) + +proc hasenum_type*(message: google_protobuf_FileDescriptorProto): bool = + result = contains(message.hasField, 5) or (len(message.enum_type) > 0) + +proc setenum_type*(message: google_protobuf_FileDescriptorProto, value: seq[google_protobuf_EnumDescriptorProto]) = + message.enum_type = value + incl(message.hasField, 5) + +proc addenum_type*(message: google_protobuf_FileDescriptorProto, value: google_protobuf_EnumDescriptorProto) = + add(message.enum_type, value) + incl(message.hasField, 5) + +proc enum_type*(message: google_protobuf_FileDescriptorProto): seq[google_protobuf_EnumDescriptorProto] {.inline.} = + message.enum_type + +proc `enum_type=`*(message: google_protobuf_FileDescriptorProto, value: seq[google_protobuf_EnumDescriptorProto]) {.inline.} = + setenum_type(message, value) + +proc clearservice*(message: google_protobuf_FileDescriptorProto) = + message.service = @[] + excl(message.hasField, [6]) + +proc hasservice*(message: google_protobuf_FileDescriptorProto): bool = + result = contains(message.hasField, 6) or (len(message.service) > 0) + +proc setservice*(message: google_protobuf_FileDescriptorProto, value: seq[google_protobuf_ServiceDescriptorProto]) = + message.service = value + incl(message.hasField, 6) + +proc addservice*(message: google_protobuf_FileDescriptorProto, value: google_protobuf_ServiceDescriptorProto) = + add(message.service, value) + incl(message.hasField, 6) + +proc service*(message: google_protobuf_FileDescriptorProto): seq[google_protobuf_ServiceDescriptorProto] {.inline.} = + message.service + +proc `service=`*(message: google_protobuf_FileDescriptorProto, value: seq[google_protobuf_ServiceDescriptorProto]) {.inline.} = + setservice(message, value) + +proc clearextension*(message: google_protobuf_FileDescriptorProto) = + message.extension = @[] + excl(message.hasField, [7]) + +proc hasextension*(message: google_protobuf_FileDescriptorProto): bool = + result = contains(message.hasField, 7) or (len(message.extension) > 0) + +proc setextension*(message: google_protobuf_FileDescriptorProto, value: seq[google_protobuf_FieldDescriptorProto]) = + message.extension = value + incl(message.hasField, 7) + +proc addextension*(message: google_protobuf_FileDescriptorProto, value: google_protobuf_FieldDescriptorProto) = + add(message.extension, value) + incl(message.hasField, 7) + +proc extension*(message: google_protobuf_FileDescriptorProto): seq[google_protobuf_FieldDescriptorProto] {.inline.} = + message.extension + +proc `extension=`*(message: google_protobuf_FileDescriptorProto, value: seq[google_protobuf_FieldDescriptorProto]) {.inline.} = + setextension(message, value) + +proc clearoptions*(message: google_protobuf_FileDescriptorProto) = + message.options = nil + excl(message.hasField, [8]) + +proc hasoptions*(message: google_protobuf_FileDescriptorProto): bool = + result = contains(message.hasField, 8) + +proc setoptions*(message: google_protobuf_FileDescriptorProto, value: google_protobuf_FileOptions) = + message.options = value + incl(message.hasField, 8) + +proc options*(message: google_protobuf_FileDescriptorProto): google_protobuf_FileOptions {.inline.} = + message.options + +proc `options=`*(message: google_protobuf_FileDescriptorProto, value: google_protobuf_FileOptions) {.inline.} = + setoptions(message, value) + +proc clearsource_code_info*(message: google_protobuf_FileDescriptorProto) = + message.source_code_info = nil + excl(message.hasField, [9]) + +proc hassource_code_info*(message: google_protobuf_FileDescriptorProto): bool = + result = contains(message.hasField, 9) + +proc setsource_code_info*(message: google_protobuf_FileDescriptorProto, value: google_protobuf_SourceCodeInfo) = + message.source_code_info = value + incl(message.hasField, 9) + +proc source_code_info*(message: google_protobuf_FileDescriptorProto): google_protobuf_SourceCodeInfo {.inline.} = + message.source_code_info + +proc `source_code_info=`*(message: google_protobuf_FileDescriptorProto, value: google_protobuf_SourceCodeInfo) {.inline.} = + setsource_code_info(message, value) + +proc clearsyntax*(message: google_protobuf_FileDescriptorProto) = + message.syntax = "" + excl(message.hasField, [12]) + +proc hassyntax*(message: google_protobuf_FileDescriptorProto): bool = + result = contains(message.hasField, 12) + +proc setsyntax*(message: google_protobuf_FileDescriptorProto, value: string) = + message.syntax = value + incl(message.hasField, 12) + +proc syntax*(message: google_protobuf_FileDescriptorProto): string {.inline.} = + message.syntax + +proc `syntax=`*(message: google_protobuf_FileDescriptorProto, value: string) {.inline.} = + setsyntax(message, value) + +proc sizeOfgoogle_protobuf_FileDescriptorProto*(message: google_protobuf_FileDescriptorProto): uint64 = + if hasname(message): + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfString(message.name) + if haspackage(message): + result = result + sizeOfTag(2, WireType.LengthDelimited) + result = result + sizeOfString(message.package) + for value in message.dependency: + result = result + sizeOfTag(3, WireType.LengthDelimited) + result = result + sizeOfString(value) + if haspublic_dependency(message): + result = result + sizeOfTag(10, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(packedFieldSize(message.public_dependency, FieldType.Int32)) + if hasweak_dependency(message): + result = result + sizeOfTag(11, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(packedFieldSize(message.weak_dependency, FieldType.Int32)) + for value in message.message_type: + result = result + sizeOfTag(4, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_DescriptorProto(value)) + for value in message.enum_type: + result = result + sizeOfTag(5, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_EnumDescriptorProto(value)) + for value in message.service: + result = result + sizeOfTag(6, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_ServiceDescriptorProto(value)) + for value in message.extension: + result = result + sizeOfTag(7, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_FieldDescriptorProto(value)) + if hasoptions(message): + result = result + sizeOfTag(8, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_FileOptions(message.options)) + if hassource_code_info(message): + result = result + sizeOfTag(9, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_SourceCodeInfo(message.source_code_info)) + if hassyntax(message): + result = result + sizeOfTag(12, WireType.LengthDelimited) + result = result + sizeOfString(message.syntax) + +proc writegoogle_protobuf_FileDescriptorProto*(stream: ProtobufStream, message: google_protobuf_FileDescriptorProto) = + if hasname(message): + writeString(stream, message.name, 1) + if haspackage(message): + writeString(stream, message.package, 2) + for value in message.dependency: + writeString(stream, value, 3) + for value in message.public_dependency: + writeInt32(stream, value, 10) + for value in message.weak_dependency: + writeInt32(stream, value, 11) + for value in message.message_type: + writeMessage(stream, value, 4) + for value in message.enum_type: + writeMessage(stream, value, 5) + for value in message.service: + writeMessage(stream, value, 6) + for value in message.extension: + writeMessage(stream, value, 7) + if hasoptions(message): + writeMessage(stream, message.options, 8) + if hassource_code_info(message): + writeMessage(stream, message.source_code_info, 9) + if hassyntax(message): + writeString(stream, message.syntax, 12) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_FileDescriptorProto*(stream: ProtobufStream): google_protobuf_FileDescriptorProto = + result = newgoogle_protobuf_FileDescriptorProto() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.LengthDelimited) + setname(result, readString(stream)) + of 2: + expectWireType(wireType, WireType.LengthDelimited) + setpackage(result, readString(stream)) + of 3: + expectWireType(wireType, WireType.LengthDelimited) + adddependency(result, readString(stream)) + of 10: + expectWireType(wireType, WireType.Varint, WireType.LengthDelimited) + if wireType == WireType.LengthDelimited: + let + size = readVarint(stream) + start = uint64(getPosition(stream)) + var consumed = 0'u64 + while consumed < size: + addpublic_dependency(result, readInt32(stream)) + consumed = uint64(getPosition(stream)) - start + if consumed != size: + raise newException(Exception, "packed field size mismatch") + else: + addpublic_dependency(result, readInt32(stream)) + of 11: + expectWireType(wireType, WireType.Varint, WireType.LengthDelimited) + if wireType == WireType.LengthDelimited: + let + size = readVarint(stream) + start = uint64(getPosition(stream)) + var consumed = 0'u64 + while consumed < size: + addweak_dependency(result, readInt32(stream)) + consumed = uint64(getPosition(stream)) - start + if consumed != size: + raise newException(Exception, "packed field size mismatch") + else: + addweak_dependency(result, readInt32(stream)) + of 4: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addmessage_type(result, newgoogle_protobuf_DescriptorProto(data)) + of 5: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addenum_type(result, newgoogle_protobuf_EnumDescriptorProto(data)) + of 6: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addservice(result, newgoogle_protobuf_ServiceDescriptorProto(data)) + of 7: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addextension(result, newgoogle_protobuf_FieldDescriptorProto(data)) + of 8: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + setoptions(result, newgoogle_protobuf_FileOptions(data)) + of 9: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + setsource_code_info(result, newgoogle_protobuf_SourceCodeInfo(data)) + of 12: + expectWireType(wireType, WireType.LengthDelimited) + setsyntax(result, readString(stream)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_FileDescriptorProto): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_FileDescriptorProto(pbs, message) + result = ss.data + +proc newgoogle_protobuf_FileDescriptorProto*(data: string): google_protobuf_FileDescriptorProto = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_FileDescriptorProto(pbs) + + +proc newgoogle_protobuf_FileDescriptorSet*(): google_protobuf_FileDescriptorSet = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.file = @[] + +proc clearfile*(message: google_protobuf_FileDescriptorSet) = + message.file = @[] + excl(message.hasField, [1]) + +proc hasfile*(message: google_protobuf_FileDescriptorSet): bool = + result = contains(message.hasField, 1) or (len(message.file) > 0) + +proc setfile*(message: google_protobuf_FileDescriptorSet, value: seq[google_protobuf_FileDescriptorProto]) = + message.file = value + incl(message.hasField, 1) + +proc addfile*(message: google_protobuf_FileDescriptorSet, value: google_protobuf_FileDescriptorProto) = + add(message.file, value) + incl(message.hasField, 1) + +proc file*(message: google_protobuf_FileDescriptorSet): seq[google_protobuf_FileDescriptorProto] {.inline.} = + message.file + +proc `file=`*(message: google_protobuf_FileDescriptorSet, value: seq[google_protobuf_FileDescriptorProto]) {.inline.} = + setfile(message, value) + +proc sizeOfgoogle_protobuf_FileDescriptorSet*(message: google_protobuf_FileDescriptorSet): uint64 = + for value in message.file: + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_FileDescriptorProto(value)) + +proc writegoogle_protobuf_FileDescriptorSet*(stream: ProtobufStream, message: google_protobuf_FileDescriptorSet) = + for value in message.file: + writeMessage(stream, value, 1) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_FileDescriptorSet*(stream: ProtobufStream): google_protobuf_FileDescriptorSet = + result = newgoogle_protobuf_FileDescriptorSet() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addfile(result, newgoogle_protobuf_FileDescriptorProto(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_FileDescriptorSet): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_FileDescriptorSet(pbs, message) + result = ss.data + +proc newgoogle_protobuf_FileDescriptorSet*(data: string): google_protobuf_FileDescriptorSet = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_FileDescriptorSet(pbs) + + +proc newgoogle_protobuf_GeneratedCodeInfo_Annotation*(): google_protobuf_GeneratedCodeInfo_Annotation = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.path = @[] + result.source_file = "" + result.begin = 0 + result.fend = 0 + +proc clearpath*(message: google_protobuf_GeneratedCodeInfo_Annotation) = + message.path = @[] + excl(message.hasField, [1]) + +proc haspath*(message: google_protobuf_GeneratedCodeInfo_Annotation): bool = + result = contains(message.hasField, 1) or (len(message.path) > 0) + +proc setpath*(message: google_protobuf_GeneratedCodeInfo_Annotation, value: seq[int32]) = + message.path = value + incl(message.hasField, 1) + +proc addpath*(message: google_protobuf_GeneratedCodeInfo_Annotation, value: int32) = + add(message.path, value) + incl(message.hasField, 1) + +proc path*(message: google_protobuf_GeneratedCodeInfo_Annotation): seq[int32] {.inline.} = + message.path + +proc `path=`*(message: google_protobuf_GeneratedCodeInfo_Annotation, value: seq[int32]) {.inline.} = + setpath(message, value) + +proc clearsource_file*(message: google_protobuf_GeneratedCodeInfo_Annotation) = + message.source_file = "" + excl(message.hasField, [2]) + +proc hassource_file*(message: google_protobuf_GeneratedCodeInfo_Annotation): bool = + result = contains(message.hasField, 2) + +proc setsource_file*(message: google_protobuf_GeneratedCodeInfo_Annotation, value: string) = + message.source_file = value + incl(message.hasField, 2) + +proc source_file*(message: google_protobuf_GeneratedCodeInfo_Annotation): string {.inline.} = + message.source_file + +proc `source_file=`*(message: google_protobuf_GeneratedCodeInfo_Annotation, value: string) {.inline.} = + setsource_file(message, value) + +proc clearbegin*(message: google_protobuf_GeneratedCodeInfo_Annotation) = + message.begin = 0 + excl(message.hasField, [3]) + +proc hasbegin*(message: google_protobuf_GeneratedCodeInfo_Annotation): bool = + result = contains(message.hasField, 3) + +proc setbegin*(message: google_protobuf_GeneratedCodeInfo_Annotation, value: int32) = + message.begin = value + incl(message.hasField, 3) + +proc begin*(message: google_protobuf_GeneratedCodeInfo_Annotation): int32 {.inline.} = + message.begin + +proc `begin=`*(message: google_protobuf_GeneratedCodeInfo_Annotation, value: int32) {.inline.} = + setbegin(message, value) + +proc clearfend*(message: google_protobuf_GeneratedCodeInfo_Annotation) = + message.fend = 0 + excl(message.hasField, [4]) + +proc hasfend*(message: google_protobuf_GeneratedCodeInfo_Annotation): bool = + result = contains(message.hasField, 4) + +proc setfend*(message: google_protobuf_GeneratedCodeInfo_Annotation, value: int32) = + message.fend = value + incl(message.hasField, 4) + +proc fend*(message: google_protobuf_GeneratedCodeInfo_Annotation): int32 {.inline.} = + message.fend + +proc `fend=`*(message: google_protobuf_GeneratedCodeInfo_Annotation, value: int32) {.inline.} = + setfend(message, value) + +proc sizeOfgoogle_protobuf_GeneratedCodeInfo_Annotation*(message: google_protobuf_GeneratedCodeInfo_Annotation): uint64 = + if haspath(message): + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(packedFieldSize(message.path, FieldType.Int32)) + if hassource_file(message): + result = result + sizeOfTag(2, WireType.LengthDelimited) + result = result + sizeOfString(message.source_file) + if hasbegin(message): + result = result + sizeOfTag(3, WireType.Varint) + result = result + sizeOfInt32(message.begin) + if hasfend(message): + result = result + sizeOfTag(4, WireType.Varint) + result = result + sizeOfInt32(message.fend) + +proc writegoogle_protobuf_GeneratedCodeInfo_Annotation*(stream: ProtobufStream, message: google_protobuf_GeneratedCodeInfo_Annotation) = + if haspath(message): + writeTag(stream, 1, WireType.LengthDelimited) + writeVarint(stream, packedFieldSize(message.path, FieldType.Int32)) + for value in message.path: + writeInt32(stream, value) + if hassource_file(message): + writeString(stream, message.source_file, 2) + if hasbegin(message): + writeInt32(stream, message.begin, 3) + if hasfend(message): + writeInt32(stream, message.fend, 4) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_GeneratedCodeInfo_Annotation*(stream: ProtobufStream): google_protobuf_GeneratedCodeInfo_Annotation = + result = newgoogle_protobuf_GeneratedCodeInfo_Annotation() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.Varint, WireType.LengthDelimited) + if wireType == WireType.LengthDelimited: + let + size = readVarint(stream) + start = uint64(getPosition(stream)) + var consumed = 0'u64 + while consumed < size: + addpath(result, readInt32(stream)) + consumed = uint64(getPosition(stream)) - start + if consumed != size: + raise newException(Exception, "packed field size mismatch") + else: + addpath(result, readInt32(stream)) + of 2: + expectWireType(wireType, WireType.LengthDelimited) + setsource_file(result, readString(stream)) + of 3: + expectWireType(wireType, WireType.Varint) + setbegin(result, readInt32(stream)) + of 4: + expectWireType(wireType, WireType.Varint) + setfend(result, readInt32(stream)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_GeneratedCodeInfo_Annotation): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_GeneratedCodeInfo_Annotation(pbs, message) + result = ss.data + +proc newgoogle_protobuf_GeneratedCodeInfo_Annotation*(data: string): google_protobuf_GeneratedCodeInfo_Annotation = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_GeneratedCodeInfo_Annotation(pbs) + + +proc newgoogle_protobuf_GeneratedCodeInfo*(): google_protobuf_GeneratedCodeInfo = + new(result) + result.hasField = initIntSet() + result.unknownFields = @[] + result.annotation = @[] + +proc clearannotation*(message: google_protobuf_GeneratedCodeInfo) = + message.annotation = @[] + excl(message.hasField, [1]) + +proc hasannotation*(message: google_protobuf_GeneratedCodeInfo): bool = + result = contains(message.hasField, 1) or (len(message.annotation) > 0) + +proc setannotation*(message: google_protobuf_GeneratedCodeInfo, value: seq[google_protobuf_GeneratedCodeInfo_Annotation]) = + message.annotation = value + incl(message.hasField, 1) + +proc addannotation*(message: google_protobuf_GeneratedCodeInfo, value: google_protobuf_GeneratedCodeInfo_Annotation) = + add(message.annotation, value) + incl(message.hasField, 1) + +proc annotation*(message: google_protobuf_GeneratedCodeInfo): seq[google_protobuf_GeneratedCodeInfo_Annotation] {.inline.} = + message.annotation + +proc `annotation=`*(message: google_protobuf_GeneratedCodeInfo, value: seq[google_protobuf_GeneratedCodeInfo_Annotation]) {.inline.} = + setannotation(message, value) + +proc sizeOfgoogle_protobuf_GeneratedCodeInfo*(message: google_protobuf_GeneratedCodeInfo): uint64 = + for value in message.annotation: + result = result + sizeOfTag(1, WireType.LengthDelimited) + result = result + sizeOfLengthDelimited(sizeOfgoogle_protobuf_GeneratedCodeInfo_Annotation(value)) + +proc writegoogle_protobuf_GeneratedCodeInfo*(stream: ProtobufStream, message: google_protobuf_GeneratedCodeInfo) = + for value in message.annotation: + writeMessage(stream, value, 1) + writeUnknownFields(stream, message.unknownFields) + +proc readgoogle_protobuf_GeneratedCodeInfo*(stream: ProtobufStream): google_protobuf_GeneratedCodeInfo = + result = newgoogle_protobuf_GeneratedCodeInfo() + while not atEnd(stream): + let + tag = readTag(stream) + wireType = wireType(tag) + case fieldNumber(tag) + of 0: + raise newException(InvalidFieldNumberError, "Invalid field number: 0") + of 1: + expectWireType(wireType, WireType.LengthDelimited) + let data = readLengthDelimited(stream) + addannotation(result, newgoogle_protobuf_GeneratedCodeInfo_Annotation(data)) + else: readUnknownField(stream, tag, result.unknownFields) + +proc serialize*(message: google_protobuf_GeneratedCodeInfo): string = + let + ss = newStringStream() + pbs = newProtobufStream(ss) + writegoogle_protobuf_GeneratedCodeInfo(pbs, message) + result = ss.data + +proc newgoogle_protobuf_GeneratedCodeInfo*(data: string): google_protobuf_GeneratedCodeInfo = + let + ss = newStringStream(data) + pbs = newProtobufStream(ss) + result = readgoogle_protobuf_GeneratedCodeInfo(pbs) + + diff --git a/nimpb/compiler/generator.nim b/nimpb/compiler/generator.nim new file mode 100644 index 0000000..ea3531a --- /dev/null +++ b/nimpb/compiler/generator.nim @@ -0,0 +1,1084 @@ +import algorithm +import os +import pegs +import sequtils +import sets +import strformat +import strutils +import tables + +import descriptor_pb + +import ../nimpb + +type + Names = distinct seq[string] + + Enum = ref object + names: Names + values: seq[tuple[name: string, number: int]] + defaultValue: string + + Field = ref object + number: int + name: string + label: google_protobuf_FieldDescriptorProto_Label + ftype: google_protobuf_FieldDescriptorProto_Type + typeName: string + packed: bool + oneof: Oneof + mapEntry: Message + defaultValue: string + message: Message + jsonName: string + + Message = ref object + names: Names + fields: seq[Field] + oneofs: seq[Oneof] + mapEntry: bool + file: ProtoFile + + Oneof = ref object + name: string + fields: seq[Field] + + ProcessedFile = ref object + name: string + data: string + + ProtoFile = ref object + fdesc: google_protobuf_FileDescriptorProto + enums: seq[Enum] + messages: seq[Message] + syntax: Syntax + dependencies: seq[ProtoFile] + serviceGenerator: ServiceGenerator + + Syntax {.pure.} = enum + Proto2 + Proto3 + + ServiceGenerator* = proc (service: Service): string + + Service* = ref object + name*: string + package*: string + methods*: seq[ServiceMethod] + + ServiceMethod* = ref object + name*: string + inputType*: string + outputType*: string + clientStreaming*: bool + serverStreaming*: bool + +when defined(debug): + proc log(msg: string) = + stderr.write(msg) + stderr.write("\n") +else: + proc log(msg: string) = discard + +proc initNamesFromTypeName(typename: string): Names = + if typename[0] != '.': + raise newException(Exception, "relative names not supported") + let parts = split(typename[1..^1], ".") + result = Names(parts) + +proc `$`(names: Names): string = + let n = seq[string](names) + result = join(n, "_") + +proc add(names: var Names, s: string) = + add(seq[string](names), s) + +proc `&`(names: Names, s: string): Names = + result = names + add(result, s) + +proc isRepeated(field: Field): bool = + result = field.label == google_protobuf_FieldDescriptorProtoLabel.LabelRepeated + +proc isMessage(field: Field): bool = + result = field.ftype == google_protobuf_FieldDescriptorProtoType.TypeMessage + +proc isEnum(field: Field): bool = + result = field.ftype == google_protobuf_FieldDescriptorProtoType.TypeEnum + +proc isNumeric(field: Field): bool = + case field.ftype + of google_protobuf_FieldDescriptorProtoType.TypeDouble, google_protobuf_FieldDescriptorProtoType.TypeFloat, + google_protobuf_FieldDescriptorProtoType.TypeInt64, google_protobuf_FieldDescriptorProtoType.TypeUInt64, + google_protobuf_FieldDescriptorProtoType.TypeInt32, google_protobuf_FieldDescriptorProtoType.TypeFixed64, + google_protobuf_FieldDescriptorProtoType.TypeFixed32, google_protobuf_FieldDescriptorProtoType.TypeBool, + google_protobuf_FieldDescriptorProtoType.TypeUInt32, google_protobuf_FieldDescriptorProtoType.TypeEnum, + google_protobuf_FieldDescriptorProtoType.TypeSFixed32, google_protobuf_FieldDescriptorProtoType.TypeSFixed64, + google_protobuf_FieldDescriptorProtoType.TypeSInt32, google_protobuf_FieldDescriptorProtoType.TypeSInt64: + result = true + else: discard + +proc isMapEntry(message: Message): bool = + result = message.mapEntry + +proc isMapEntry(field: Field): bool = + result = field.mapEntry != nil + +proc nimTypeName(field: Field): string = + case field.ftype + of google_protobuf_FieldDescriptorProtoType.TypeDouble: result = "float64" + of google_protobuf_FieldDescriptorProtoType.TypeFloat: result = "float32" + of google_protobuf_FieldDescriptorProtoType.TypeInt64: result = "int64" + of google_protobuf_FieldDescriptorProtoType.TypeUInt64: result = "uint64" + of google_protobuf_FieldDescriptorProtoType.TypeInt32: result = "int32" + of google_protobuf_FieldDescriptorProtoType.TypeFixed64: result = "uint64" + of google_protobuf_FieldDescriptorProtoType.TypeFixed32: result = "uint32" + of google_protobuf_FieldDescriptorProtoType.TypeBool: result = "bool" + of google_protobuf_FieldDescriptorProtoType.TypeString: result = "string" + of google_protobuf_FieldDescriptorProtoType.TypeGroup: result = "" + of google_protobuf_FieldDescriptorProtoType.TypeMessage: result = field.typeName + of google_protobuf_FieldDescriptorProtoType.TypeBytes: result = "bytes" + of google_protobuf_FieldDescriptorProtoType.TypeUInt32: result = "uint32" + of google_protobuf_FieldDescriptorProtoType.TypeEnum: result = field.typeName + of google_protobuf_FieldDescriptorProtoType.TypeSFixed32: result = "int32" + of google_protobuf_FieldDescriptorProtoType.TypeSFixed64: result = "int64" + of google_protobuf_FieldDescriptorProtoType.TypeSInt32: result = "int32" + of google_protobuf_FieldDescriptorProtoType.TypeSInt64: result = "int64" + +proc mapKeyType(field: Field): string = + for f in field.mapEntry.fields: + if f.name == "key": + return f.nimTypeName + +proc mapValueField(field: Field): Field = + for f in field.mapEntry.fields: + if f.name == "value": + return f + +proc mapValueType(field: Field): string = + for f in field.mapEntry.fields: + if f.name == "value": + return f.nimTypeName + +proc `$`(ft: google_protobuf_FieldDescriptorProtoType): string = + case ft + of google_protobuf_FieldDescriptorProtoType.TypeDouble: result = "Double" + of google_protobuf_FieldDescriptorProtoType.TypeFloat: result = "Float" + of google_protobuf_FieldDescriptorProtoType.TypeInt64: result = "Int64" + of google_protobuf_FieldDescriptorProtoType.TypeUInt64: result = "UInt64" + of google_protobuf_FieldDescriptorProtoType.TypeInt32: result = "Int32" + of google_protobuf_FieldDescriptorProtoType.TypeFixed64: result = "Fixed64" + of google_protobuf_FieldDescriptorProtoType.TypeFixed32: result = "Fixed32" + of google_protobuf_FieldDescriptorProtoType.TypeBool: result = "Bool" + of google_protobuf_FieldDescriptorProtoType.TypeString: result = "String" + of google_protobuf_FieldDescriptorProtoType.TypeGroup: result = "Group" + of google_protobuf_FieldDescriptorProtoType.TypeMessage: result = "Message" + of google_protobuf_FieldDescriptorProtoType.TypeBytes: result = "Bytes" + of google_protobuf_FieldDescriptorProtoType.TypeUInt32: result = "UInt32" + of google_protobuf_FieldDescriptorProtoType.TypeEnum: result = "Enum" + of google_protobuf_FieldDescriptorProtoType.TypeSFixed32: result = "SFixed32" + of google_protobuf_FieldDescriptorProtoType.TypeSFixed64: result = "SFixed64" + of google_protobuf_FieldDescriptorProtoType.TypeSInt32: result = "SInt32" + of google_protobuf_FieldDescriptorProtoType.TypeSInt64: result = "SInt64" + +proc defaultValue(ftype: google_protobuf_FieldDescriptorProto_Type): string = + case ftype + of google_protobuf_FieldDescriptorProtoType.TypeDouble: result = "0" + of google_protobuf_FieldDescriptorProtoType.TypeFloat: result = "0" + of google_protobuf_FieldDescriptorProtoType.TypeInt64: result = "0" + of google_protobuf_FieldDescriptorProtoType.TypeUInt64: result = "0" + of google_protobuf_FieldDescriptorProtoType.TypeInt32: result = "0" + of google_protobuf_FieldDescriptorProtoType.TypeFixed64: result = "0" + of google_protobuf_FieldDescriptorProtoType.TypeFixed32: result = "0" + of google_protobuf_FieldDescriptorProtoType.TypeBool: result = "false" + of google_protobuf_FieldDescriptorProtoType.TypeString: result = "\"\"" + of google_protobuf_FieldDescriptorProtoType.TypeGroup: result = "" + of google_protobuf_FieldDescriptorProtoType.TypeMessage: result = "nil" + of google_protobuf_FieldDescriptorProtoType.TypeBytes: result = "bytes(\"\")" + of google_protobuf_FieldDescriptorProtoType.TypeUInt32: result = "0" + of google_protobuf_FieldDescriptorProtoType.TypeEnum: result = "0" + of google_protobuf_FieldDescriptorProtoType.TypeSFixed32: result = "0" + of google_protobuf_FieldDescriptorProtoType.TypeSFixed64: result = "0" + of google_protobuf_FieldDescriptorProtoType.TypeSInt32: result = "0" + of google_protobuf_FieldDescriptorProtoType.TypeSInt64: result = "0" + +proc findEnum(file: ProtoFile, typeName: string): Enum = + for e in file.enums: + if $e.names == typeName: + return e + for dep in file.dependencies: + result = findEnum(dep, typeName) + if result != nil: + break + +proc defaultValue(field: Field): string = + if field.defaultValue != nil: + if isEnum(field): + return &"{field.typeName}.{field.defaultValue}" + elif field.ftype == google_protobuf_FieldDescriptorProtoType.TypeString: + return escape(field.defaultValue) + else: + return field.defaultValue + elif isMapEntry(field): + return &"newTable[{field.mapKeyType}, {field.mapValueType}]()" + elif isRepeated(field): + return "@[]" + elif isEnum(field): + let e = findEnum(field.message.file, field.typeName) + if e != nil: + result = e.defaultValue + else: + result = &"cast[{field.typeName}](0)" + else: + result = defaultValue(field.ftype) + +proc wiretypeStr(field: Field): string = + result = "WireType." + case field.ftype + of google_protobuf_FieldDescriptorProtoType.TypeDouble: result &= "Fixed64" + of google_protobuf_FieldDescriptorProtoType.TypeFloat: result &= "Fixed32" + of google_protobuf_FieldDescriptorProtoType.TypeInt64: result &= "Varint" + of google_protobuf_FieldDescriptorProtoType.TypeUInt64: result &= "Varint" + of google_protobuf_FieldDescriptorProtoType.TypeInt32: result &= "Varint" + of google_protobuf_FieldDescriptorProtoType.TypeFixed64: result &= "Fixed64" + of google_protobuf_FieldDescriptorProtoType.TypeFixed32: result &= "Fixed32" + of google_protobuf_FieldDescriptorProtoType.TypeBool: result &= "Varint" + of google_protobuf_FieldDescriptorProtoType.TypeString: result &= "LengthDelimited" + of google_protobuf_FieldDescriptorProtoType.TypeGroup: result &= "" + of google_protobuf_FieldDescriptorProtoType.TypeMessage: result &= "LengthDelimited" + of google_protobuf_FieldDescriptorProtoType.TypeBytes: result &= "LengthDelimited" + of google_protobuf_FieldDescriptorProtoType.TypeUInt32: result &= "Varint" + of google_protobuf_FieldDescriptorProtoType.TypeEnum: result &= &"Varint" + of google_protobuf_FieldDescriptorProtoType.TypeSFixed32: result &= "Fixed32" + of google_protobuf_FieldDescriptorProtoType.TypeSFixed64: result &= "Fixed64" + of google_protobuf_FieldDescriptorProtoType.TypeSInt32: result &= "Varint" + of google_protobuf_FieldDescriptorProtoType.TypeSInt64: result &= "Varint" + +proc fieldTypeStr(field: Field): string = + result = "FieldType." & $field.ftype + +proc isKeyword(s: string): bool = + case s + of "addr", "and", "as", "asm", "bind", "block", "break", "case", "cast", + "concept", "const", "continue", "converter", "defer", "discard", + "distinct", "div", "do", "elif", "else", "end", "enum", "except", + "export", "finally", "for", "from", "func", "if", "import", "in", + "include", "interface", "is", "isnot", "iterator", "let", "macro", + "method", "mixin", "mod", "nil", "not", "notin", "object", "of", "or", + "out", "proc", "ptr", "raise", "ref", "return", "shl", "shr", "static", + "template", "try", "tuple", "type", "using", "var", "when", "while", + "xor", "yield": + result = true + else: + result = false + +proc writeProc(field: Field): string = + if isMapEntry(field): + result = &"write{field.typeName}KV" + elif isMessage(field): + result = "writeMessage" + elif isEnum(field): + result = "writeEnum" + else: + result = &"write{field.typeName}" + +proc readProc(field: Field): string = + if isMapEntry(field): + result = &"read{field.typeName}KV" + elif isEnum(field): + result = &"readEnum[{field.typeName}]" + else: + result = &"read{field.typeName}" + +proc sizeOfProc(field: Field): string = + if isMapEntry(field): + result = &"sizeOf{field.typeName}KV" + elif isEnum(field): + result = &"sizeOfEnum[{field.typeName}]" + else: + result = &"sizeOf{field.typeName}" + +proc newField(file: ProtoFile, message: Message, desc: google_protobuf_FieldDescriptorProto): Field = + new(result) + + result.name = desc.name + result.number = desc.number + result.label = desc.label + result.ftype = desc.ftype + result.typeName = "" + result.packed = false + result.mapEntry = nil + result.message = message + + # Identifiers cannot start/end with underscore + removePrefix(result.name, '_') + removeSuffix(result.name, '_') + + # Consecutive underscores are not allowed + result.name = replace(result.name, peg"'_' '_'+", "_") + + if isKeyword(result.name): + result.name = "f" & result.name + + if isRepeated(result) and isNumeric(result): + if hasOptions(desc): + if hasPacked(desc.options): + result.packed = desc.options.packed + else: + result.packed = + if file.syntax == Syntax.Proto2: + false + else: + true + else: + result.packed = + if file.syntax == Syntax.Proto2: + false + else: + true + + if hasOneof_index(desc): + result.oneof = message.oneofs[desc.oneof_index] + add(result.oneof.fields, result) + + if isMessage(result) or isEnum(result): + result.typeName = $initNamesFromTypeName(desc.type_name) + else: + result.typeName = $result.ftype + + if hasDefaultValue(desc): + result.defaultValue = desc.default_value + + if hasJsonName(desc): + result.jsonName = desc.jsonName + + log(&"newField {result.name} {$result.ftype} {result.typeName} PACKED={result.packed} SYNTAX={file.syntax}") + +proc newOneof(name: string): Oneof = + new(result) + result.fields = @[] + result.name = name + +proc newMessage(file: ProtoFile, names: Names, desc: google_protobuf_DescriptorProto): Message = + new(result) + + result.names = names + result.fields = @[] + result.oneofs = @[] + result.mapEntry = false + result.file = file + + if hasOptions(desc) and hasMapEntry(desc.options): + result.mapEntry = desc.options.mapEntry + + log(&"newMessage {$result.names}") + + for oneof in desc.oneof_decl: + add(result.oneofs, newOneof(oneof.name)) + + for field in desc.field: + add(result.fields, newField(file, result, field)) + +proc fixMapEntry(file: ProtoFile, message: Message): bool = + for field in message.fields: + for msg in file.messages: + if $msg.names == field.typeName: + if msg.mapEntry: + log(&"fixing map {field.name} {msg.names}") + field.mapEntry = msg + result = true + +proc newEnum(names: Names, desc: google_protobuf_EnumDescriptorProto): Enum = + new(result) + + result.names = names & desc.name + result.values = @[] + + log(&"newEnum {$result.names}") + + for value in desc.value: + add(result.values, (value.name, int(value.number))) + + result.defaultValue = &"{result.names}.{result.values[0].name}" + + type EnumValue = tuple[name: string, number: int] + + sort(result.values, proc (x, y: EnumValue): int = + system.cmp(x.number, y.number) + ) + +proc newService(service: google_protobuf_ServiceDescriptorProto, + file: ProtoFile): Service = + new(result) + result.name = service.name + result.package = file.fdesc.package + result.methods = @[] + + for meth in service.fmethod: + var m: ServiceMethod + new(m) + + m.name = meth.name + m.inputType = $initNamesFromTypeName(meth.inputType) + m.outputType = $initNamesFromTypeName(meth.outputType) + m.clientStreaming = meth.clientStreaming + m.serverStreaming = meth.serverStreaming + + add(result.methods, m) + +iterator messages(desc: google_protobuf_DescriptorProto, names: Names): tuple[names: Names, desc: google_protobuf_DescriptorProto] = + var stack: seq[tuple[names: Names, desc: google_protobuf_DescriptorProto]] = @[] + + for nested in desc.nested_type: + add(stack, (names, nested)) + + while len(stack) > 0: + let (names, submsg) = pop(stack) + + let subnames = names & submsg.name + yield (subnames, submsg) + + for desc in submsg.nested_type: + add(stack, (subnames, desc)) + +iterator messages(fdesc: google_protobuf_FileDescriptorProto, names: Names): tuple[names: Names, desc: google_protobuf_DescriptorProto] = + for desc in fdesc.message_type: + let subnames = names & desc.name + yield (subnames, desc) + + for x in messages(desc, subnames): + yield x + +proc quoteReserved(name: string): string = + case name + of "type": result = &"`{name}`" + else: result = name + +proc accessor(field: Field): string = + if field.oneof != nil: + result = &"{field.oneof.name}.{quoteReserved(field.name)}" + else: + result = quoteReserved(field.name) + +proc dependencies(field: Field): seq[string] = + result = @[] + + if isMessage(field) or isEnum(field): + add(result, field.typeName) + +proc dependencies(message: Message): seq[string] = + result = @[] + + for field in message.fields: + add(result, dependencies(field)) + +proc toposort(graph: TableRef[string, HashSet[string]]): seq[string] = + type State = enum Unknown, Gray, Black + + var + enter = toSeq(keys(graph)) + state = newTable[string, State]() + order: seq[string] = @[] + + proc dfs(node: string) = + state[node] = Gray + if node in graph: + for k in graph[node]: + let sk = + if k in state: + state[k] + else: + Unknown + + if sk == Gray: + # cycle + continue + elif sk == Black: + continue + + let idx = find(enter, k) + if idx != -1: + delete(enter, idx) + + dfs(k) + insert(order, node, 0) + state[node] = Black + + while len(enter) > 0: + dfs(pop(enter)) + + result = order + +iterator sortDependencies(messages: seq[Message]): Message = + let + deps = newTable[string, HashSet[string]]() + byname = newTable[string, Message]() + + for message in messages: + deps[$message.names] = toSet(dependencies(message)) + byname[$message.names] = message + + let order = reversed(toposort(deps)) + + for name in order: + if name in byname: + yield byname[name] + +proc parseFile(name: string, fdesc: google_protobuf_FileDescriptorProto): ProtoFile = + log(&"parsing {name}") + + new(result) + + result.fdesc = fdesc + result.messages = @[] + result.enums = @[] + result.dependencies = @[] + + if hasSyntax(fdesc): + if fdesc.syntax == "proto2": + result.syntax = Syntax.Proto2 + elif fdesc.syntax == "proto3": + result.syntax = Syntax.Proto3 + else: + raise newException(Exception, "unrecognized syntax: " & fdesc.syntax) + else: + result.syntax = Syntax.Proto2 + + let basename = + if hasPackage(fdesc): + Names(split(fdesc.package, ".")) + else: + Names(@[]) + + for e in fdesc.enum_type: + add(result.enums, newEnum(basename, e)) + + for name, message in messages(fdesc, basename): + add(result.messages, newMessage(result, name, message)) + + for e in message.enum_type: + add(result.enums, newEnum(name, e)) + +proc addLine(s: var string, line: string) = + if not isNilOrWhitespace(line): + s &= line + s &= "\n" + +iterator genType(e: Enum): string = + yield &"{e.names}* {{.pure.}} = enum" + for item in e.values: + let (name, number) = item + yield indent(&"{name} = {number}", 4) + +proc fullType(field: Field): string = + if isMapEntry(field): + result = &"TableRef[{field.mapKeyType}, {field.mapValueType}]" + else: + result = field.nimTypeName + if isRepeated(field): + result = &"seq[{result}]" + +proc mapKeyField(message: Message): Field = + for field in message.fields: + if field.name == "key": + return field + +proc mapValueField(message: Message): Field = + for field in message.fields: + if field.name == "value": + return field + +iterator genType(message: Message): string = + if not isMapEntry(message): + yield &"{message.names}* = ref {message.names}Obj" + yield &"{message.names}Obj* = object of RootObj" + yield indent(&"hasField: IntSet", 4) + yield indent(&"unknownFields: seq[UnknownField]", 4) + + for field in message.fields: + if isMapEntry(field): + yield indent(&"{field.name}: TableRef[{mapKeyType(field)}, {mapValueType(field)}]", 4) + elif field.oneof == nil: + yield indent(&"{quoteReserved(field.name)}: {field.fullType}", 4) + + for oneof in message.oneofs: + yield indent(&"{oneof.name}: {message.names}_{oneof.name}_OneOf", 4) + + for oneof in message.oneofs: + yield "" + yield &"{message.names}_{oneof.name}_OneOf* {{.union.}} = object" + for field in oneof.fields: + yield indent(&"{quoteReserved(field.name)}: {field.fullType}", 4) + +iterator genNewMessageProc(msg: Message): string = + yield &"proc new{msg.names}*(): {msg.names} =" + yield indent("new(result)", 4) + yield indent("result.hasField = initIntSet()", 4) + yield indent("result.unknownFields = @[]", 4) + for field in msg.fields: + yield indent(&"result.{field.accessor} = {defaultValue(field)}", 4) + yield "" + +iterator oneofSiblings(field: Field): Field = + if field.oneof != nil: + for sibling in field.oneof.fields: + if sibling == field: + continue + yield sibling + +iterator genClearFieldProc(msg: Message, field: Field): string = + yield &"proc clear{field.name}*(message: {msg.names}) =" + yield indent(&"message.{field.accessor} = {defaultValue(field)}", 4) + var numbers: seq[int] = @[field.number] + for sibling in oneofSiblings(field): + add(numbers, sibling.number) + yield indent(&"excl(message.hasField, [{join(numbers, \", \")}])", 4) + yield "" + +iterator genHasFieldProc(msg: Message, field: Field): string = + yield &"proc has{field.name}*(message: {msg.names}): bool =" + var check = indent(&"result = contains(message.hasField, {field.number})", 4) + if isRepeated(field) or isMapEntry(field): + check = &"{check} or (len(message.{field.accessor}) > 0)" + yield check + yield "" + +iterator genSetFieldProc(msg: Message, field: Field): string = + yield &"proc set{field.name}*(message: {msg.names}, value: {field.fullType}) =" + yield indent(&"message.{field.accessor} = value", 4) + yield indent(&"incl(message.hasField, {field.number})", 4) + var numbers: seq[int] = @[] + for sibling in oneofSiblings(field): + add(numbers, sibling.number) + if len(numbers) > 0: + yield indent(&"excl(message.hasField, [{join(numbers, \", \")}])", 4) + yield "" + +iterator genAddToFieldProc(msg: Message, field: Field): string = + yield &"proc add{field.name}*(message: {msg.names}, value: {field.nimTypeName}) =" + yield indent(&"add(message.{field.name}, value)", 4) + yield indent(&"incl(message.hasField, {field.number})", 4) + yield "" + +iterator genFieldAccessorProcs(msg: Message, field: Field): string = + yield &"proc {quoteReserved(field.name)}*(message: {msg.names}): {field.fullType} {{.inline.}} =" + yield indent(&"message.{field.accessor}", 4) + yield "" + + yield &"proc `{field.name}=`*(message: {msg.names}, value: {field.fullType}) {{.inline.}} =" + yield indent(&"set{field.name}(message, value)", 4) + yield "" + +iterator genWriteMapKVProc(msg: Message): string = + let + key = mapKeyField(msg) + value = mapValueField(msg) + + yield &"proc write{msg.names}KV(stream: ProtobufStream, key: {key.fullType}, value: {value.fullType}) =" + yield indent(&"{key.writeProc}(stream, key, {key.number})", 4) + yield indent(&"{value.writeProc}(stream, value, {value.number})", 4) + yield "" + +iterator genWriteMessageProc(msg: Message): string = + yield &"proc write{msg.names}*(stream: ProtobufStream, message: {msg.names}) =" + + for field in msg.fields: + if isMapEntry(field): + yield indent(&"for key, value in message.{field.name}:", 4) + yield indent(&"writeTag(stream, {field.number}, {wiretypeStr(field)})", 8) + yield indent(&"writeVarint(stream, {field.sizeOfProc}(key, value))", 8) + yield indent(&"{field.writeProc}(stream, key, value)", 8) + elif isRepeated(field): + if field.packed: + yield indent(&"if has{field.name}(message):", 4) + yield indent(&"writeTag(stream, {field.number}, WireType.LengthDelimited)", 8) + yield indent(&"writeVarint(stream, packedFieldSize(message.{field.name}, {field.fieldTypeStr}))", 8) + yield indent(&"for value in message.{field.name}:", 8) + yield indent(&"{field.writeProc}(stream, value)", 12) + else: + yield indent(&"for value in message.{field.name}:", 4) + yield indent(&"{field.writeProc}(stream, value, {field.number})", 8) + else: + yield indent(&"if has{field.name}(message):", 4) + yield indent(&"{field.writeProc}(stream, message.{field.accessor}, {field.number})", 8) + + yield indent("writeUnknownFields(stream, message.unknownFields)", 4) + + yield "" + +iterator genReadMapKVProc(msg: Message): string = + let + key = mapKeyField(msg) + value = mapValueField(msg) + + yield &"proc read{msg.names}KV(stream: ProtobufStream, tbl: TableRef[{key.fullType}, {value.fullType}]) =" + + yield indent(&"var", 4) + yield indent(&"key: {key.fullType}", 8) + yield indent("gotKey = false", 8) + yield indent(&"value: {value.fullType}", 8) + yield indent("gotValue = false", 8) + yield indent("while not atEnd(stream):", 4) + yield indent("let", 8) + yield indent("tag = readTag(stream)", 12) + yield indent("wireType = wireType(tag)", 12) + yield indent("case fieldNumber(tag)", 8) + yield indent(&"of {key.number}:", 8) + yield indent(&"key = {key.readProc}(stream)", 12) + yield indent("gotKey = true", 12) + yield indent(&"of {value.number}:", 8) + if isMessage(value): + yield indent("let", 12) + yield indent("size = readVarint(stream)", 16) + yield indent("data = safeReadStr(stream, int(size))", 16) + yield indent("pbs = newProtobufStream(newStringStream(data))", 16) + yield indent(&"value = {value.readProc}(pbs)", 12) + else: + yield indent(&"value = {value.readProc}(stream)", 12) + yield indent("gotValue = true", 12) + yield indent("else: skipField(stream, wireType)", 8) + yield indent("if not gotKey:", 4) + yield indent(&"raise newException(Exception, \"missing key\")", 8) + yield indent("if not gotValue:", 4) + yield indent(&"raise newException(Exception, \"missing value\")", 8) + yield indent("tbl[key] = value", 4) + yield "" + +iterator genReadMessageProc(msg: Message): string = + yield &"proc read{msg.names}*(stream: ProtobufStream): {msg.names} =" + yield indent(&"result = new{msg.names}()", 4) + yield indent("while not atEnd(stream):", 4) + yield indent("let", 8) + yield indent("tag = readTag(stream)", 12) + yield indent("wireType = wireType(tag)", 12) + yield indent("case fieldNumber(tag)", 8) + yield indent("of 0:", 8) + yield indent("raise newException(InvalidFieldNumberError, \"Invalid field number: 0\")", 12) + for field in msg.fields: + let + setter = + if isRepeated(field): + &"add{field.name}" + else: + &"set{field.name}" + yield indent(&"of {field.number}:", 8) + if isRepeated(field): + if isMapEntry(field): + yield indent(&"expectWireType(wireType, {field.wiretypeStr})", 12) + yield indent("let", 12) + yield indent("size = readVarint(stream)", 16) + yield indent("data = safeReadStr(stream, int(size))", 16) + yield indent("pbs = newProtobufStream(newStringStream(data))", 16) + yield indent(&"{field.readProc}(pbs, result.{field.name})", 12) + elif isNumeric(field): + yield indent(&"expectWireType(wireType, {field.wiretypeStr}, WireType.LengthDelimited)", 12) + yield indent("if wireType == WireType.LengthDelimited:", 12) + yield indent("let", 16) + yield indent("size = readVarint(stream)", 20) + yield indent("start = uint64(getPosition(stream))", 20) + yield indent("var consumed = 0'u64", 16) + yield indent("while consumed < size:", 16) + yield indent(&"{setter}(result, {field.readProc}(stream))", 20) + yield indent("consumed = uint64(getPosition(stream)) - start", 20) + yield indent("if consumed != size:", 16) + yield indent("raise newException(Exception, \"packed field size mismatch\")", 20) + yield indent("else:", 12) + yield indent(&"{setter}(result, {field.readProc}(stream))", 16) + elif isMessage(field): + yield indent(&"expectWireType(wireType, {field.wiretypeStr})", 12) + yield indent(&"let data = readLengthDelimited(stream)", 12) + yield indent(&"{setter}(result, new{field.typeName}(data))", 12) + else: + yield indent(&"expectWireType(wireType, {field.wiretypeStr})", 12) + yield indent(&"{setter}(result, {field.readProc}(stream))", 12) + else: + yield indent(&"expectWireType(wireType, {field.wiretypeStr})", 12) + if isMessage(field): + yield indent("let data = readLengthDelimited(stream)", 12) + yield indent(&"{setter}(result, new{field.typeName}(data))", 12) + else: + yield indent(&"{setter}(result, {field.readProc}(stream))", 12) + yield indent("else: readUnknownField(stream, tag, result.unknownFields)", 8) + yield "" + +iterator genSizeOfMapKVProc(message: Message): string = + let + key = mapKeyField(message) + value = mapValueField(message) + + yield &"proc sizeOf{message.names}KV(key: {key.fullType}, value: {value.fullType}): uint64 =" + + # Key (cannot be message or other complex field) + yield indent(&"result = result + sizeOfTag({key.number}, {key.wiretypeStr})", 4) + yield indent(&"result = result + {key.sizeOfProc}(key)", 4) + + # Value + yield indent(&"result = result + sizeOfTag({value.number}, {value.wiretypeStr})", 4) + if isMessage(value): + yield indent(&"result = result + sizeOfLengthDelimited({value.sizeOfProc}(value))", 4) + else: + yield indent(&"result = result + {value.sizeOfProc}(value)", 4) + + yield "" + +iterator genSizeOfMessageProc(msg: Message): string = + yield &"proc sizeOf{msg.names}*(message: {msg.names}): uint64 =" + for field in msg.fields: + if isMapEntry(field): + yield indent(&"if has{field.name}(message):", 4) + yield indent(&"var sizeOfKV = 0'u64", 8) + yield indent(&"for key, value in message.{field.name}:", 8) + yield indent(&"sizeOfKV = sizeOfKV + {field.sizeOfProc}(key, value)", 12) + yield indent(&"result = result + sizeOfTag({field.number}, {field.wiretypeStr})", 8) + yield indent(&"result = result + sizeOfLengthDelimited(sizeOfKV)", 8) + elif isRepeated(field): + if isNumeric(field): + yield indent(&"if has{field.name}(message):", 4) + yield indent(&"result = result + sizeOfTag({field.number}, WireType.LengthDelimited)", 8) + yield indent(&"result = result + sizeOfLengthDelimited(packedFieldSize(message.{field.name}, {field.fieldTypeStr}))", 8) + else: + yield indent(&"for value in message.{field.name}:", 4) + yield indent(&"result = result + sizeOfTag({field.number}, {field.wiretypeStr})", 8) + if isMessage(field): + yield indent(&"result = result + sizeOfLengthDelimited({field.sizeOfProc}(value))", 8) + else: + yield indent(&"result = result + {field.sizeOfProc}(value)", 8) + else: + yield indent(&"if has{field.name}(message):", 4) + yield indent(&"result = result + sizeOfTag({field.number}, {field.wiretypeStr})", 8) + if isMessage(field): + yield indent(&"result = result + sizeOfLengthDelimited({field.sizeOfProc}(message.{field.accessor}))", 8) + else: + yield indent(&"result = result + {field.sizeOfProc}(message.{field.accessor})", 8) + + yield indent("for field in message.unknownFields:", 4) + yield indent("result = result + sizeOfUnknownField(field)", 8) + + yield "" + +proc shouldGenerateJsonProcs(typeName: string): bool = + const wktsHavingCustomProcs = [ + "google_protobuf_Any", + "google_protobuf_BoolValue", + "google_protobuf_BytesValue", + "google_protobuf_DoubleValue", + "google_protobuf_Duration", + "google_protobuf_FieldMask", + "google_protobuf_FloatValue", + "google_protobuf_Int32Value", + "google_protobuf_Int64Value", + "google_protobuf_ListValue", + "google_protobuf_NullValue", + "google_protobuf_StringValue", + "google_protobuf_Struct", + "google_protobuf_Timestamp", + "google_protobuf_UInt32Value", + "google_protobuf_UInt64Value", + "google_protobuf_Value", + ] + + return typeName notin wktsHavingCustomProcs + +iterator genMessageToJsonProc(msg: Message): string = + yield &"proc toJson*(message: {msg.names}): JsonNode =" + yield indent("result = newJObject()", 4) + + proc fieldToJson(field: Field, v: string): string = + case field.ftype + of google_protobuf_FieldDescriptorProto_Type.TypeMessage, + google_protobuf_FieldDescriptorProto_Type.TypeInt64, + google_protobuf_FieldDescriptorProto_Type.TypeUInt64, + google_protobuf_FieldDescriptorProto_Type.TypeSFixed64, + google_protobuf_FieldDescriptorProto_Type.TypeFixed64, + google_protobuf_FieldDescriptorProto_Type.TypeDouble, + google_protobuf_FieldDescriptorProto_Type.TypeFloat: + result = &"toJson({v})" + of google_protobuf_FieldDescriptorProto_Type.TypeEnum: + result = &"%(${v})" + else: + result = &"%{v}" + + for field in msg.fields: + yield indent(&"if has{field.name}(message):", 4) + if isMapEntry(field): + yield indent("let obj = newJObject()", 8) + yield indent(&"for key, value in message.{field.name}:", 8) + let f = mapValueField(field) + let j = fieldToJson(f, "value") + yield indent(&"obj[$key] = {j}", 12) + yield indent(&"result[\"{field.jsonName}\"] = obj", 8) + elif isRepeated(field): + yield indent(&"let arr = newJArray()", 8) + yield indent(&"for value in message.{field.name}:", 8) + let v = fieldToJson(field, "value") + yield indent(&"add(arr, {v})", 12) + yield indent(&"result[\"{field.jsonName}\"] = arr", 8) + else: + let v = fieldToJson(field, &"message.{field.name}") + yield indent(&"result[\"{field.jsonName}\"] = {v}", 8) + + yield "" + +iterator genMessageProcForwards(msg: Message): string = + # TODO: can we be more intelligent and only forward declare the minimum set + # of procs? + if not isMapEntry(msg): + yield &"proc new{msg.names}*(): {msg.names}" + yield &"proc new{msg.names}*(data: string): {msg.names}" + yield &"proc write{msg.names}*(stream: ProtobufStream, message: {msg.names})" + yield &"proc read{msg.names}*(stream: ProtobufStream): {msg.names}" + yield &"proc sizeOf{msg.names}*(message: {msg.names}): uint64" + if shouldGenerateJsonProcs($msg.names): + yield &"proc toJson*(message: {msg.names}): JsonNode" + else: + let + key = mapKeyField(msg) + value = mapValueField(msg) + + yield &"proc write{msg.names}KV(stream: ProtobufStream, key: {key.fullType}, value: {value.fullType})" + yield &"proc read{msg.names}KV(stream: ProtobufStream, tbl: TableRef[{key.fullType}, {value.fullType}])" + yield &"proc sizeOf{msg.names}KV(key: {key.fullType}, value: {value.fullType}): uint64" + +iterator genProcs(msg: Message): string = + if isMapEntry(msg): + for line in genSizeOfMapKVProc(msg): yield line + for line in genWriteMapKVProc(msg): yield line + for line in genReadMapKVProc(msg): yield line + else: + for line in genNewMessageProc(msg): yield line + + for field in msg.fields: + for line in genClearFieldProc(msg, field): yield line + for line in genHasFieldProc(msg, field): yield line + for line in genSetFieldProc(msg, field): yield line + + if isRepeated(field) and not isMapEntry(field): + for line in genAddToFieldProc(msg, field): yield line + + for line in genFieldAccessorProcs(msg, field): yield line + + for line in genSizeOfMessageProc(msg): yield line + for line in genWriteMessageProc(msg): yield line + for line in genReadMessageProc(msg): yield line + + if shouldGenerateJsonProcs($msg.names): + for line in genMessageToJsonProc(msg): yield line + + yield &"proc serialize*(message: {msg.names}): string =" + yield indent("let", 4) + yield indent("ss = newStringStream()", 8) + yield indent("pbs = newProtobufStream(ss)", 8) + yield indent(&"write{msg.names}(pbs, message)", 4) + yield indent("result = ss.data", 4) + yield "" + + yield &"proc new{msg.names}*(data: string): {msg.names} =" + yield indent("let", 4) + yield indent("ss = newStringStream(data)", 8) + yield indent("pbs = newProtobufStream(ss)", 8) + yield indent(&"result = read{msg.names}(pbs)", 4) + yield "" + +proc processFile(fdesc: google_protobuf_FileDescriptorProto, + otherFiles: TableRef[string, ProtoFile], + serviceGenerator: ServiceGenerator): ProcessedFile = + var (dir, name, _) = splitFile(fdesc.name) + var pbfilename = (dir / name) & "_pb.nim" + + log(&"processing {fdesc.name}: {pbfilename}") + + new(result) + result.name = pbfilename + result.data = "" + + let parsed = parseFile(fdesc.name, fdesc) + + for dep in fdesc.dependency: + if dep in otherFiles: + add(parsed.dependencies, otherFiles[dep]) + + var hasMaps = false + for message in parsed.messages: + let tmp = fixMapEntry(parsed, message) + if tmp: + hasMaps = true + + addLine(result.data, "# Generated by protoc_gen_nim. Do not edit!") + addLine(result.data, "") + addLine(result.data, "import base64") + addLine(result.data, "import intsets") + addLine(result.data, "import json") + if hasMaps: + addLine(result.data, "import tables") + addLine(result.data, "export tables") + addLine(result.data, "") + addLine(result.data, "import nimpb/nimpb") + addLine(result.data, "import nimpb/json as nimpb_json") + addLine(result.data, "") + + for dep in fdesc.dependency: + var (dir, depname, _) = splitFile(dep) + + if dir == "google/protobuf": + dir = "nimpb/wkt" + + var deppbname = (dir / depname) & "_pb" + addLine(result.data, &"import {deppbname}") + + if hasDependency(fdesc): + addLine(result.data, "") + + addLine(result.data, "type") + + for e in parsed.enums: + for line in genType(e): addLine(result.data, indent(line, 4)) + + for message in parsed.messages: + for line in genType(message): addLine(result.data, indent(line, 4)) + + addLine(result.data, "") + + for message in sortDependencies(parsed.messages): + for line in genMessageProcForwards(message): + addLine(result.data, line) + addLine(result.data, "") + + for message in sortDependencies(parsed.messages): + for line in genProcs(message): + addLine(result.data, line) + addLine(result.data, "") + + if serviceGenerator != nil: + for serviceDesc in fdesc.service: + let service = newService(serviceDesc, parsed) + addLine(result.data, "") + add(result.data, serviceGenerator(service)) + +proc processFileDescriptorSet*(filename: string, + outdir: string, + protos: openArray[string], + serviceGenerator: ServiceGenerator) = + let s = newProtobufStream(newFileStream(filename, fmRead)) + + let fileSet = readgoogle_protobuf_FileDescriptorSet(s) + + var otherFiles = newTable[string, ProtoFile]() + + for file in fileSet.file: + add(otherFiles, file.name, parseFile(file.name, file)) + + # Protoc does not provide full paths for files in FileDescriptorSet. So it + # can be that fileSet.file.name might match any file in protos. So we will + # try to match the bare name and the named joined with the path of the first + # file. + let basePath = parentDir(protos[0]) + + for file in fileSet.file: + if (file.name in protos) or ((basePath / file.name) in protos): + let processedFile = processFile(file, otherFiles, serviceGenerator) + + let fullPath = outdir / processedFile.name + + createDir(parentDir(fullPath)) + + writeFile(fullPath, processedFile.data) diff --git a/nimpb/compiler/nimpb_build.nim b/nimpb/compiler/nimpb_build.nim new file mode 100644 index 0000000..1abb3f3 --- /dev/null +++ b/nimpb/compiler/nimpb_build.nim @@ -0,0 +1,44 @@ +import os +import osproc +import strformat +import strutils + +import compiler + +proc usage() {.noreturn.} = + echo(&""" +{getAppFilename()} --out=OUTDIR [-IPATH [-IPATH]...] PROTOFILE... + + --out The output directory for the generated files + -I Add a path to the set of include paths +""") + quit(QuitFailure) + +var includes: seq[string] = @[] +var protos: seq[string] = @[] +var outdir: string + +if paramCount() == 0: + usage() + +for idx in 1..paramCount(): + let param = paramStr(idx) + + if param.startsWith("-I"): + add(includes, param[2..^1]) + elif param.startsWith("--out="): + outdir = param[6..^1] + elif param == "--help": + usage() + else: + add(protos, param) + +if outdir == nil: + echo("error: --out is required") + quit(QuitFailure) + +if len(protos) == 0: + echo("error: no input files") + quit(QuitFailure) + +compileProtos(protos, includes, outdir) diff --git a/src/nimpb/json.nim b/nimpb/json.nim index 28cd0f5..28cd0f5 100644 --- a/src/nimpb/json.nim +++ b/nimpb/json.nim diff --git a/src/nimpb/nimpb.nim b/nimpb/nimpb.nim index 4363c7d..4363c7d 100644 --- a/src/nimpb/nimpb.nim +++ b/nimpb/nimpb.nim diff --git a/src/nimpb/wkt/any_pb.nim b/nimpb/wkt/any_pb.nim index aa6f56c..f7613e0 100644 --- a/src/nimpb/wkt/any_pb.nim +++ b/nimpb/wkt/any_pb.nim @@ -5,7 +5,6 @@ import intsets import json import nimpb/nimpb -import nimpb/json as nimpb_json type google_protobuf_Any* = ref google_protobuf_AnyObj diff --git a/src/nimpb/wkt/api_pb.nim b/nimpb/wkt/api_pb.nim index 28f5b2b..28f5b2b 100644 --- a/src/nimpb/wkt/api_pb.nim +++ b/nimpb/wkt/api_pb.nim diff --git a/src/nimpb/wkt/duration_pb.nim b/nimpb/wkt/duration_pb.nim index d15aeee..d15aeee 100644 --- a/src/nimpb/wkt/duration_pb.nim +++ b/nimpb/wkt/duration_pb.nim diff --git a/src/nimpb/wkt/empty_pb.nim b/nimpb/wkt/empty_pb.nim index c53cb03..c53cb03 100644 --- a/src/nimpb/wkt/empty_pb.nim +++ b/nimpb/wkt/empty_pb.nim diff --git a/src/nimpb/wkt/field_mask_pb.nim b/nimpb/wkt/field_mask_pb.nim index e925416..e925416 100644 --- a/src/nimpb/wkt/field_mask_pb.nim +++ b/nimpb/wkt/field_mask_pb.nim diff --git a/src/nimpb/wkt/source_context_pb.nim b/nimpb/wkt/source_context_pb.nim index 815da98..815da98 100644 --- a/src/nimpb/wkt/source_context_pb.nim +++ b/nimpb/wkt/source_context_pb.nim diff --git a/src/nimpb/wkt/struct_pb.nim b/nimpb/wkt/struct_pb.nim index 2a38f6d..2a38f6d 100644 --- a/src/nimpb/wkt/struct_pb.nim +++ b/nimpb/wkt/struct_pb.nim diff --git a/src/nimpb/wkt/timestamp_pb.nim b/nimpb/wkt/timestamp_pb.nim index 5f00154..5f00154 100644 --- a/src/nimpb/wkt/timestamp_pb.nim +++ b/nimpb/wkt/timestamp_pb.nim diff --git a/src/nimpb/wkt/type_pb.nim b/nimpb/wkt/type_pb.nim index efb7d26..efb7d26 100644 --- a/src/nimpb/wkt/type_pb.nim +++ b/nimpb/wkt/type_pb.nim diff --git a/src/nimpb/wkt/wrappers_pb.nim b/nimpb/wkt/wrappers_pb.nim index d1b5f80..d1b5f80 100644 --- a/src/nimpb/wkt/wrappers_pb.nim +++ b/nimpb/wkt/wrappers_pb.nim diff --git a/tests/nim.cfg b/tests/nim.cfg index a119208..0f840a1 100644 --- a/tests/nim.cfg +++ b/tests/nim.cfg @@ -1 +1 @@ ---path:"../src" +--path:".." |
