blob: 4cd99e65adfce357949697bcfde18a7e5b246146 [file] [log] [blame]
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Author: kenton@google.com (Kenton Varda)
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
//
// The messages in this file describe the definitions found in .proto files.
// A valid .proto file can be translated directly to a FileDescriptorProto
// without any other information (e.g. without reading its imports).
// ===================================================================
// Options
// Each of the definitions above may have "options" attached. These are
// just annotations which may cause code to be generated slightly differently
// or may contain hints for code that manipulates protocol messages.
//
// Clients may define custom options as extensions of the *Options messages.
// These extensions may not yet be known at parsing time, so the parser cannot
// store the values in them. Instead it stores them in a field in the *Options
// message called uninterpreted_option. This field must have the same name
// across all *Options messages. We then use this field to populate the
// extensions when we build a descriptor, at which point all protos have been
// parsed and so all extensions are known.
//
// Extension numbers for custom options may be chosen as follows:
// * For options which will only be used within a single application or
// organization, or for experimental options, use field numbers 50000
// through 99999. It is up to you to ensure that you do not use the
// same number for multiple options.
// * For options which will be published and used publicly by multiple
// independent entities, e-mail protobuf-global-extension-registry@google.com
// to reserve extension numbers. Simply provide your project name (e.g.
// Objective-C plugin) and your project website (if available) -- there's no
// need to explain how you intend to use them. Usually you only need one
// extension number. You can declare multiple options with only one extension
// number by putting them in a sub-message. See the Custom Options section of
// the docs for examples:
// https://developers.google.com/protocol-buffers/docs/proto#options
// If this turns out to be popular, a web service will be set up
// to automatically assign option numbers.
// ===================================================================
// Optional source code info
package descriptor
// The protocol compiler can output a FileDescriptorSet containing the .proto
// files it parses.
#FileDescriptorSet: {
file?: [...#FileDescriptorProto] @protobuf(1)
}
// Describes a complete .proto file.
#FileDescriptorProto: {
name?: string @protobuf(1) // file name, relative to root of source tree
package?: string @protobuf(2) // e.g. "foo", "foo.bar", etc.
// Names of files imported by this file.
dependency?: [...string] @protobuf(3)
// Indexes of the public imported files in the dependency list above.
publicDependency?: [...int32] @protobuf(10,name=public_dependency)
// Indexes of the weak imported files in the dependency list.
// For Google-internal migration only. Do not use.
weakDependency?: [...int32] @protobuf(11,name=weak_dependency)
// All top-level definitions in this file.
messageType?: [...#DescriptorProto] @protobuf(4,name=message_type)
enumType?: [...#EnumDescriptorProto] @protobuf(5,name=enum_type)
service?: [...#ServiceDescriptorProto] @protobuf(6)
extension?: [...#FieldDescriptorProto] @protobuf(7)
options?: #FileOptions @protobuf(8)
// This field contains optional information about the original source code.
// You may safely remove this entire field without harming runtime
// functionality of the descriptors -- the information is needed only by
// development tools.
sourceCodeInfo?: #SourceCodeInfo @protobuf(9,name=source_code_info)
// The syntax of the proto file.
// The supported values are "proto2" and "proto3".
syntax?: string @protobuf(12)
}
// Describes a message type.
#DescriptorProto: {
name?: string @protobuf(1)
field?: [...#FieldDescriptorProto] @protobuf(2)
extension?: [...#FieldDescriptorProto] @protobuf(6)
nestedType?: [...#DescriptorProto] @protobuf(3,name=nested_type)
enumType?: [...#EnumDescriptorProto] @protobuf(4,name=enum_type)
#ExtensionRange: {
start?: int32 @protobuf(1) // Inclusive.
end?: int32 @protobuf(2) // Exclusive.
options?: #ExtensionRangeOptions @protobuf(3)
}
extensionRange?: [...#ExtensionRange] @protobuf(5,name=extension_range)
oneofDecl?: [...#OneofDescriptorProto] @protobuf(8,name=oneof_decl)
options?: #MessageOptions @protobuf(7)
// Range of reserved tag numbers. Reserved tag numbers may not be used by
// fields or extension ranges in the same message. Reserved ranges may
// not overlap.
#ReservedRange: {
start?: int32 @protobuf(1) // Inclusive.
end?: int32 @protobuf(2) // Exclusive.
}
reservedRange?: [...#ReservedRange] @protobuf(9,name=reserved_range)
// Reserved field names, which may not be used by fields in the same message.
// A given name may only be reserved once.
reservedName?: [...string] @protobuf(10,name=reserved_name)
}
#ExtensionRangeOptions: {
// The parser stores options it doesn't recognize here. See above.
uninterpretedOption?: [...#UninterpretedOption] @protobuf(999,name=uninterpreted_option)
}
// Describes a field within a message.
#FieldDescriptorProto: {
#Type:
// 0 is reserved for errors.
// Order is weird for historical reasons.
"TYPE_DOUBLE" |
"TYPE_FLOAT" |
// Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if
// negative values are likely.
"TYPE_INT64" |
"TYPE_UINT64" |
// Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if
// negative values are likely.
"TYPE_INT32" |
"TYPE_FIXED64" |
"TYPE_FIXED32" |
"TYPE_BOOL" |
"TYPE_STRING" |
// Tag-delimited aggregate.
// Group type is deprecated and not supported in proto3. However, Proto3
// implementations should still be able to parse the group wire format and
// treat group fields as unknown fields.
"TYPE_GROUP" |
"TYPE_MESSAGE" | // Length-delimited aggregate.
// New in version 2.
"TYPE_BYTES" |
"TYPE_UINT32" |
"TYPE_ENUM" |
"TYPE_SFIXED32" |
"TYPE_SFIXED64" |
"TYPE_SINT32" | // Uses ZigZag encoding.
"TYPE_SINT64" // Uses ZigZag encoding.
#Type_value: {
"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
}
#Label:
// 0 is reserved for errors
"LABEL_OPTIONAL" |
"LABEL_REQUIRED" |
"LABEL_REPEATED"
#Label_value: {
"LABEL_OPTIONAL": 1
"LABEL_REQUIRED": 2
"LABEL_REPEATED": 3
}
name?: string @protobuf(1)
number?: int32 @protobuf(3)
label?: #Label @protobuf(4)
// If type_name is set, this need not be set. If both this and type_name
// are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
type?: #Type @protobuf(5)
// For message and enum types, this is the name of the type. If the name
// starts with a '.', it is fully-qualified. Otherwise, C++-like scoping
// rules are used to find the type (i.e. first the nested types within this
// message are searched, then within the parent, on up to the root
// namespace).
typeName?: string @protobuf(6,name=type_name)
// For extensions, this is the name of the type being extended. It is
// resolved in the same manner as type_name.
extendee?: string @protobuf(2)
// For numeric types, contains the original text representation of the value.
// For booleans, "true" or "false".
// For strings, contains the default text contents (not escaped in any way).
// For bytes, contains the C escaped value. All bytes >= 128 are escaped.
// TODO(kenton): Base-64 encode?
defaultValue?: string @protobuf(7,name=default_value)
// If set, gives the index of a oneof in the containing type's oneof_decl
// list. This field is a member of that oneof.
oneofIndex?: int32 @protobuf(9,name=oneof_index)
// JSON name of this field. The value is set by protocol compiler. If the
// user has set a "json_name" option on this field, that option's value
// will be used. Otherwise, it's deduced from the field's name by converting
// it to camelCase.
jsonName?: string @protobuf(10,name=json_name)
options?: #FieldOptions @protobuf(8)
}
// Describes a oneof.
#OneofDescriptorProto: {
name?: string @protobuf(1)
options?: #OneofOptions @protobuf(2)
}
// Describes an enum type.
#EnumDescriptorProto: {
name?: string @protobuf(1)
value?: [...#EnumValueDescriptorProto] @protobuf(2)
options?: #EnumOptions @protobuf(3)
// Range of reserved numeric values. Reserved values may not be used by
// entries in the same enum. Reserved ranges may not overlap.
//
// Note that this is distinct from DescriptorProto.ReservedRange in that it
// is inclusive such that it can appropriately represent the entire int32
// domain.
#EnumReservedRange: {
start?: int32 @protobuf(1) // Inclusive.
end?: int32 @protobuf(2) // Inclusive.
}
// Range of reserved numeric values. Reserved numeric values may not be used
// by enum values in the same enum declaration. Reserved ranges may not
// overlap.
reservedRange?: [...#EnumReservedRange] @protobuf(4,name=reserved_range)
// Reserved enum value names, which may not be reused. A given name may only
// be reserved once.
reservedName?: [...string] @protobuf(5,name=reserved_name)
}
// Describes a value within an enum.
#EnumValueDescriptorProto: {
name?: string @protobuf(1)
number?: int32 @protobuf(2)
options?: #EnumValueOptions @protobuf(3)
}
// Describes a service.
#ServiceDescriptorProto: {
name?: string @protobuf(1)
method?: [...#MethodDescriptorProto] @protobuf(2)
options?: #ServiceOptions @protobuf(3)
}
// Describes a method of a service.
#MethodDescriptorProto: {
name?: string @protobuf(1)
// Input and output type names. These are resolved in the same way as
// FieldDescriptorProto.type_name, but must refer to a message type.
inputType?: string @protobuf(2,name=input_type)
outputType?: string @protobuf(3,name=output_type)
options?: #MethodOptions @protobuf(4)
// Identifies if client streams multiple client messages
clientStreaming?: bool @protobuf(5,name=client_streaming,"default=false")
// Identifies if server streams multiple server messages
serverStreaming?: bool @protobuf(6,name=server_streaming,"default=false")
}
#FileOptions: {
// Sets the Java package where classes generated from this .proto will be
// placed. By default, the proto package is used, but this is often
// inappropriate because proto packages do not normally start with backwards
// domain names.
javaPackage?: string @protobuf(1,name=java_package)
// If set, all the classes from the .proto file are wrapped in a single
// outer class with the given name. This applies to both Proto1
// (equivalent to the old "--one_java_file" option) and Proto2 (where
// a .proto always translates to a single class, but you may want to
// explicitly choose the class name).
javaOuterClassname?: string @protobuf(8,name=java_outer_classname)
// If set true, then the Java code generator will generate a separate .java
// file for each top-level message, enum, and service defined in the .proto
// file. Thus, these types will *not* be nested inside the outer class
// named by java_outer_classname. However, the outer class will still be
// generated to contain the file's getDescriptor() method as well as any
// top-level extensions defined in the file.
javaMultipleFiles?: bool @protobuf(10,name=java_multiple_files,"default=false")
// This option does nothing.
javaGenerateEqualsAndHash?: bool @protobuf(20,name=java_generate_equals_and_hash,deprecated)
// If set true, then the Java2 code generator will generate code that
// throws an exception whenever an attempt is made to assign a non-UTF-8
// byte sequence to a string field.
// Message reflection will do the same.
// However, an extension field still accepts non-UTF-8 byte sequences.
// This option has no effect on when used with the lite runtime.
javaStringCheckUtf8?: bool @protobuf(27,name=java_string_check_utf8,"default=false")
// Generated classes can be optimized for speed or code size.
#OptimizeMode: "SPEED" | // Generate complete code for parsing, serialization,
// etc.
"CODE_SIZE" |
"LITE_RUNTIME" // Generate code using MessageLite and the lite runtime.
#OptimizeMode_value: {
"SPEED": 1
"CODE_SIZE": 2 // Use ReflectionOps to implement these methods.
"LITE_RUNTIME": 3
}
optimizeFor?: #OptimizeMode @protobuf(9,name=optimize_for,"default=SPEED")
// Sets the Go package where structs generated from this .proto will be
// placed. If omitted, the Go package will be derived from the following:
// - The basename of the package import path, if provided.
// - Otherwise, the package statement in the .proto file, if present.
// - Otherwise, the basename of the .proto file, without extension.
goPackage?: string @protobuf(11,name=go_package)
// Should generic services be generated in each language? "Generic" services
// are not specific to any particular RPC system. They are generated by the
// main code generators in each language (without additional plugins).
// Generic services were the only kind of service generation supported by
// early versions of google.protobuf.
//
// Generic services are now considered deprecated in favor of using plugins
// that generate code specific to your particular RPC system. Therefore,
// these default to false. Old code which depends on generic services should
// explicitly set them to true.
ccGenericServices?: bool @protobuf(16,name=cc_generic_services,"default=false")
javaGenericServices?: bool @protobuf(17,name=java_generic_services,"default=false")
pyGenericServices?: bool @protobuf(18,name=py_generic_services,"default=false")
phpGenericServices?: bool @protobuf(42,name=php_generic_services,"default=false")
// Is this file deprecated?
// Depending on the target platform, this can emit Deprecated annotations
// for everything in the file, or it will be completely ignored; in the very
// least, this is a formalization for deprecating files.
deprecated?: bool @protobuf(23,"default=false")
// Enables the use of arenas for the proto messages in this file. This applies
// only to generated classes for C++.
ccEnableArenas?: bool @protobuf(31,name=cc_enable_arenas,"default=false")
// Sets the objective c class prefix which is prepended to all objective c
// generated classes from this .proto. There is no default.
objcClassPrefix?: string @protobuf(36,name=objc_class_prefix)
// Namespace for generated classes; defaults to the package.
csharpNamespace?: string @protobuf(37,name=csharp_namespace)
// By default Swift generators will take the proto package and CamelCase it
// replacing '.' with underscore and use that to prefix the types/symbols
// defined. When this options is provided, they will use this value instead
// to prefix the types/symbols defined.
swiftPrefix?: string @protobuf(39,name=swift_prefix)
// Sets the php class prefix which is prepended to all php generated classes
// from this .proto. Default is empty.
phpClassPrefix?: string @protobuf(40,name=php_class_prefix)
// Use this option to change the namespace of php generated classes. Default
// is empty. When this option is empty, the package name will be used for
// determining the namespace.
phpNamespace?: string @protobuf(41,name=php_namespace)
// Use this option to change the namespace of php generated metadata classes.
// Default is empty. When this option is empty, the proto file name will be
// used for determining the namespace.
phpMetadataNamespace?: string @protobuf(44,name=php_metadata_namespace)
// Use this option to change the package of ruby generated classes. Default
// is empty. When this option is not set, the package name will be used for
// determining the ruby package.
rubyPackage?: string @protobuf(45,name=ruby_package)
// The parser stores options it doesn't recognize here.
// See the documentation for the "Options" section above.
uninterpretedOption?: [...#UninterpretedOption] @protobuf(999,name=uninterpreted_option)
}
#MessageOptions: {
// Set true to use the old proto1 MessageSet wire format for extensions.
// This is provided for backwards-compatibility with the MessageSet wire
// format. You should not use this for any other reason: It's less
// efficient, has fewer features, and is more complicated.
//
// The message must be defined exactly as follows:
// message Foo {
// option message_set_wire_format = true;
// extensions 4 to max;
// }
// Note that the message cannot have any defined fields; MessageSets only
// have extensions.
//
// All extensions of your type must be singular messages; e.g. they cannot
// be int32s, enums, or repeated messages.
//
// Because this is an option, the above two restrictions are not enforced by
// the protocol compiler.
messageSetWireFormat?: bool @protobuf(1,name=message_set_wire_format,"default=false")
// Disables the generation of the standard "descriptor()" accessor, which can
// conflict with a field of the same name. This is meant to make migration
// from proto1 easier; new code should avoid fields named "descriptor".
noStandardDescriptorAccessor?: bool @protobuf(2,name=no_standard_descriptor_accessor,"default=false")
// Is this message deprecated?
// Depending on the target platform, this can emit Deprecated annotations
// for the message, or it will be completely ignored; in the very least,
// this is a formalization for deprecating messages.
deprecated?: bool @protobuf(3,"default=false")
// Whether the message is an automatically generated map entry type for the
// maps field.
//
// For maps fields:
// map<KeyType, ValueType> map_field = 1;
// The parsed descriptor looks like:
// message MapFieldEntry {
// option map_entry = true;
// optional KeyType key = 1;
// optional ValueType value = 2;
// }
// repeated MapFieldEntry map_field = 1;
//
// Implementations may choose not to generate the map_entry=true message, but
// use a native map in the target language to hold the keys and values.
// The reflection APIs in such implementations still need to work as
// if the field is a repeated message field.
//
// NOTE: Do not set the option in .proto files. Always use the maps syntax
// instead. The option should only be implicitly set by the proto compiler
// parser.
mapEntry?: bool @protobuf(7,name=map_entry)
// The parser stores options it doesn't recognize here. See above.
uninterpretedOption?: [...#UninterpretedOption] @protobuf(999,name=uninterpreted_option)
}
#FieldOptions: {
// The ctype option instructs the C++ code generator to use a different
// representation of the field than it normally would. See the specific
// options below. This option is not yet implemented in the open source
// release -- sorry, we'll try to include it in a future version!
ctype?: #CType @protobuf(1,"default=STRING")
#CType:
// Default mode.
"STRING" |
"CORD" |
"STRING_PIECE"
#CType_value: {
"STRING": 0
"CORD": 1
"STRING_PIECE": 2
}
// The packed option can be enabled for repeated primitive fields to enable
// a more efficient representation on the wire. Rather than repeatedly
// writing the tag and type for each element, the entire array is encoded as
// a single length-delimited blob. In proto3, only explicit setting it to
// false will avoid using packed encoding.
packed?: bool @protobuf(2)
// The jstype option determines the JavaScript type used for values of the
// field. The option is permitted only for 64 bit integral and fixed types
// (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING
// is represented as JavaScript string, which avoids loss of precision that
// can happen when a large value is converted to a floating point JavaScript.
// Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
// use the JavaScript "number" type. The behavior of the default option
// JS_NORMAL is implementation dependent.
//
// This option is an enum to permit additional types to be added, e.g.
// goog.math.Integer.
jstype?: #JSType @protobuf(6,"default=JS_NORMAL")
#JSType:
// Use the default type.
"JS_NORMAL" |
// Use JavaScript strings.
"JS_STRING" |
// Use JavaScript numbers.
"JS_NUMBER"
#JSType_value: {
"JS_NORMAL": 0
"JS_STRING": 1
"JS_NUMBER": 2
}
// Should this field be parsed lazily? Lazy applies only to message-type
// fields. It means that when the outer message is initially parsed, the
// inner message's contents will not be parsed but instead stored in encoded
// form. The inner message will actually be parsed when it is first accessed.
//
// This is only a hint. Implementations are free to choose whether to use
// eager or lazy parsing regardless of the value of this option. However,
// setting this option true suggests that the protocol author believes that
// using lazy parsing on this field is worth the additional bookkeeping
// overhead typically needed to implement it.
//
// This option does not affect the public interface of any generated code;
// all method signatures remain the same. Furthermore, thread-safety of the
// interface is not affected by this option; const methods remain safe to
// call from multiple threads concurrently, while non-const methods continue
// to require exclusive access.
//
//
// Note that implementations may choose not to check required fields within
// a lazy sub-message. That is, calling IsInitialized() on the outer message
// may return true even if the inner message has missing required fields.
// This is necessary because otherwise the inner message would have to be
// parsed in order to perform the check, defeating the purpose of lazy
// parsing. An implementation which chooses not to check required fields
// must be consistent about it. That is, for any particular sub-message, the
// implementation must either *always* check its required fields, or *never*
// check its required fields, regardless of whether or not the message has
// been parsed.
lazy?: bool @protobuf(5,"default=false")
// Is this field deprecated?
// Depending on the target platform, this can emit Deprecated annotations
// for accessors, or it will be completely ignored; in the very least, this
// is a formalization for deprecating fields.
deprecated?: bool @protobuf(3,"default=false")
// For Google-internal migration only. Do not use.
weak?: bool @protobuf(10,"default=false")
// The parser stores options it doesn't recognize here. See above.
uninterpretedOption?: [...#UninterpretedOption] @protobuf(999,name=uninterpreted_option)
}
#OneofOptions: {
// The parser stores options it doesn't recognize here. See above.
uninterpretedOption?: [...#UninterpretedOption] @protobuf(999,name=uninterpreted_option)
}
#EnumOptions: {
// Set this option to true to allow mapping different tag names to the same
// value.
allowAlias?: bool @protobuf(2,name=allow_alias)
// Is this enum deprecated?
// Depending on the target platform, this can emit Deprecated annotations
// for the enum, or it will be completely ignored; in the very least, this
// is a formalization for deprecating enums.
deprecated?: bool @protobuf(3,"default=false")
// The parser stores options it doesn't recognize here. See above.
uninterpretedOption?: [...#UninterpretedOption] @protobuf(999,name=uninterpreted_option)
}
#EnumValueOptions: {
// Is this enum value deprecated?
// Depending on the target platform, this can emit Deprecated annotations
// for the enum value, or it will be completely ignored; in the very least,
// this is a formalization for deprecating enum values.
deprecated?: bool @protobuf(1,"default=false")
// The parser stores options it doesn't recognize here. See above.
uninterpretedOption?: [...#UninterpretedOption] @protobuf(999,name=uninterpreted_option)
}
#ServiceOptions: {
// Note: Field numbers 1 through 32 are reserved for Google's internal RPC
// framework. We apologize for hoarding these numbers to ourselves, but
// we were already using them long before we decided to release Protocol
// Buffers.
// Is this service deprecated?
// Depending on the target platform, this can emit Deprecated annotations
// for the service, or it will be completely ignored; in the very least,
// this is a formalization for deprecating services.
deprecated?: bool @protobuf(33,"default=false")
// The parser stores options it doesn't recognize here. See above.
uninterpretedOption?: [...#UninterpretedOption] @protobuf(999,name=uninterpreted_option)
}
#MethodOptions: {
// Note: Field numbers 1 through 32 are reserved for Google's internal RPC
// framework. We apologize for hoarding these numbers to ourselves, but
// we were already using them long before we decided to release Protocol
// Buffers.
// Is this method deprecated?
// Depending on the target platform, this can emit Deprecated annotations
// for the method, or it will be completely ignored; in the very least,
// this is a formalization for deprecating methods.
deprecated?: bool @protobuf(33,"default=false")
// Is this method side-effect-free (or safe in HTTP parlance), or idempotent,
// or neither? HTTP based RPC implementation may choose GET verb for safe
// methods, and PUT verb for idempotent methods instead of the default POST.
#IdempotencyLevel: "IDEMPOTENCY_UNKNOWN" |
"NO_SIDE_EFFECTS" | // implies idempotent
"IDEMPOTENT" // idempotent, but may have side effects
#IdempotencyLevel_value: {
"IDEMPOTENCY_UNKNOWN": 0
"NO_SIDE_EFFECTS": 1
"IDEMPOTENT": 2
}
idempotencyLevel?: #IdempotencyLevel @protobuf(34,name=idempotency_level,"default=IDEMPOTENCY_UNKNOWN")
// The parser stores options it doesn't recognize here. See above.
uninterpretedOption?: [...#UninterpretedOption] @protobuf(999,name=uninterpreted_option)
}
// A message representing a option the parser does not recognize. This only
// appears in options protos created by the compiler::Parser class.
// DescriptorPool resolves these when building Descriptor objects. Therefore,
// options protos in descriptor objects (e.g. returned by Descriptor::options(),
// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
// in them.
#UninterpretedOption: {
// The name of the uninterpreted option. Each string represents a segment in
// a dot-separated name. is_extension is true iff a segment represents an
// extension (denoted with parentheses in options specs in .proto files).
// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
// "foo.(bar.baz).qux".
#NamePart: {
namePart?: string @protobuf(1,name=name_part)
isExtension?: bool @protobuf(2,name=is_extension)
}
name?: [...#NamePart] @protobuf(2)
// The value of the uninterpreted option, in whatever type the tokenizer
// identified it as during parsing. Exactly one of these should be set.
identifierValue?: string @protobuf(3,name=identifier_value)
positiveIntValue?: uint64 @protobuf(4,name=positive_int_value)
negativeIntValue?: int64 @protobuf(5,name=negative_int_value)
doubleValue?: float64 @protobuf(6,type=double,name=double_value)
stringValue?: bytes @protobuf(7,name=string_value)
aggregateValue?: string @protobuf(8,name=aggregate_value)
}
// Encapsulates information about the original source file from which a
// FileDescriptorProto was generated.
#SourceCodeInfo: {
// A Location identifies a piece of source code in a .proto file which
// corresponds to a particular definition. This information is intended
// to be useful to IDEs, code indexers, documentation generators, and similar
// tools.
//
// For example, say we have a file like:
// message Foo {
// optional string foo = 1;
// }
// Let's look at just the field definition:
// optional string foo = 1;
// ^ ^^ ^^ ^ ^^^
// a bc de f ghi
// We have the following locations:
// span path represents
// [a,i) [ 4, 0, 2, 0 ] The whole field definition.
// [a,b) [ 4, 0, 2, 0, 4 ] The label (optional).
// [c,d) [ 4, 0, 2, 0, 5 ] The type (string).
// [e,f) [ 4, 0, 2, 0, 1 ] The name (foo).
// [g,h) [ 4, 0, 2, 0, 3 ] The number (1).
//
// Notes:
// - A location may refer to a repeated field itself (i.e. not to any
// particular index within it). This is used whenever a set of elements are
// logically enclosed in a single code segment. For example, an entire
// extend block (possibly containing multiple extension definitions) will
// have an outer location whose path refers to the "extensions" repeated
// field without an index.
// - Multiple locations may have the same path. This happens when a single
// logical declaration is spread out across multiple places. The most
// obvious example is the "extend" block again -- there may be multiple
// extend blocks in the same scope, each of which will have the same path.
// - A location's span is not always a subset of its parent's span. For
// example, the "extendee" of an extension declaration appears at the
// beginning of the "extend" block and is shared by all extensions within
// the block.
// - Just because a location's span is a subset of some other location's span
// does not mean that it is a descendant. For example, a "group" defines
// both a type and a field in a single declaration. Thus, the locations
// corresponding to the type and field and their components will overlap.
// - Code which tries to interpret locations should probably be designed to
// ignore those that it doesn't understand, as more types of locations could
// be recorded in the future.
location?: [...#Location] @protobuf(1)
#Location: {
// Identifies which part of the FileDescriptorProto was defined at this
// location.
//
// Each element is a field number or an index. They form a path from
// the root FileDescriptorProto to the place where the definition. For
// example, this path:
// [ 4, 3, 2, 7, 1 ]
// refers to:
// file.message_type(3) // 4, 3
// .field(7) // 2, 7
// .name() // 1
// This is because FileDescriptorProto.message_type has field number 4:
// repeated DescriptorProto message_type = 4;
// and DescriptorProto.field has field number 2:
// repeated FieldDescriptorProto field = 2;
// and FieldDescriptorProto.name has field number 1:
// optional string name = 1;
//
// Thus, the above path gives the location of a field name. If we removed
// the last element:
// [ 4, 3, 2, 7 ]
// this path refers to the whole field declaration (from the beginning
// of the label to the terminating semicolon).
path?: [...int32] @protobuf(1,packed)
// Always has exactly three or four elements: start line, start column,
// end line (optional, otherwise assumed same as start line), end column.
// These are packed into a single field for efficiency. Note that line
// and column numbers are zero-based -- typically you will want to add
// 1 to each before displaying to a user.
span?: [...int32] @protobuf(2,packed)
// If this SourceCodeInfo represents a complete declaration, these are any
// comments appearing before and after the declaration which appear to be
// attached to the declaration.
//
// A series of line comments appearing on consecutive lines, with no other
// tokens appearing on those lines, will be treated as a single comment.
//
// leading_detached_comments will keep paragraphs of comments that appear
// before (but not connected to) the current element. Each paragraph,
// separated by empty lines, will be one comment element in the repeated
// field.
//
// Only the comment content is provided; comment markers (e.g. //) are
// stripped out. For block comments, leading whitespace and an asterisk
// will be stripped from the beginning of each line other than the first.
// Newlines are included in the output.
//
// Examples:
//
// optional int32 foo = 1; // Comment attached to foo.
// // Comment attached to bar.
// optional int32 bar = 2;
//
// optional string baz = 3;
// // Comment attached to baz.
// // Another line attached to baz.
//
// // Comment attached to qux.
// //
// // Another line attached to qux.
// optional double qux = 4;
//
// // Detached comment for corge. This is not leading or trailing comments
// // to qux or corge because there are blank lines separating it from
// // both.
//
// // Detached comment for corge paragraph 2.
//
// optional string corge = 5;
// /* Block comment attached
// * to corge. Leading asterisks
// * will be removed. */
// /* Block comment attached to
// * grault. */
// optional int32 grault = 6;
//
// // ignored detached comments.
leadingComments?: string @protobuf(3,name=leading_comments)
trailingComments?: string @protobuf(4,name=trailing_comments)
leadingDetachedComments?: [...string] @protobuf(6,name=leading_detached_comments)
}
}
// Describes the relationship between generated code and its original source
// file. A GeneratedCodeInfo message is associated with only one generated
// source file, but may contain references to different source .proto files.
#GeneratedCodeInfo: {
// An Annotation connects some span of text in generated code to an element
// of its generating .proto file.
annotation?: [...#Annotation] @protobuf(1)
#Annotation: {
// Identifies the element in the original source .proto file. This field
// is formatted the same as SourceCodeInfo.Location.path.
path?: [...int32] @protobuf(1,packed)
// Identifies the filesystem path to the original source .proto.
sourceFile?: string @protobuf(2,name=source_file)
// Identifies the starting offset in bytes in the generated code
// that relates to the identified object.
begin?: int32 @protobuf(3)
// Identifies the ending offset in bytes in the generated code that
// relates to the identified offset. The end offset should be one past
// the last relevant byte (so the length of the text = end - begin).
end?: int32 @protobuf(4)
}
}