Add vendor
This commit is contained in:
		
							
								
								
									
										16
									
								
								vendor/github.com/golang/protobuf/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/golang/protobuf/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| .DS_Store | ||||
| *.[568ao] | ||||
| *.ao | ||||
| *.so | ||||
| *.pyc | ||||
| ._* | ||||
| .nfs.* | ||||
| [568a].out | ||||
| *~ | ||||
| *.orig | ||||
| core | ||||
| _obj | ||||
| _test | ||||
| _testmain.go | ||||
| protoc-gen-go/testdata/multi/*.pb.go | ||||
| _conformance/_conformance | ||||
							
								
								
									
										3
									
								
								vendor/github.com/golang/protobuf/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/golang/protobuf/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| # This source code refers to The Go Authors for copyright purposes. | ||||
| # The master list of authors is in the main Go distribution, | ||||
| # visible at http://tip.golang.org/AUTHORS. | ||||
							
								
								
									
										3
									
								
								vendor/github.com/golang/protobuf/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/golang/protobuf/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| # This source code was written by the Go contributors. | ||||
| # The master list of contributors is in the main Go distribution, | ||||
| # visible at http://tip.golang.org/CONTRIBUTORS. | ||||
							
								
								
									
										31
									
								
								vendor/github.com/golang/protobuf/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/golang/protobuf/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| Go support for Protocol Buffers - Google's data interchange format | ||||
|  | ||||
| Copyright 2010 The Go Authors.  All rights reserved. | ||||
| https://github.com/golang/protobuf | ||||
|  | ||||
| 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. | ||||
|  | ||||
							
								
								
									
										40
									
								
								vendor/github.com/golang/protobuf/Make.protobuf
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								vendor/github.com/golang/protobuf/Make.protobuf
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| # Go support for Protocol Buffers - Google's data interchange format | ||||
| # | ||||
| # Copyright 2010 The Go Authors.  All rights reserved. | ||||
| # https://github.com/golang/protobuf | ||||
| # | ||||
| # 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. | ||||
|  | ||||
| # Includable Makefile to add a rule for generating .pb.go files from .proto files | ||||
| # (Google protocol buffer descriptions). | ||||
| # Typical use if myproto.proto is a file in package mypackage in this directory: | ||||
| # | ||||
| #	include $(GOROOT)/src/pkg/github.com/golang/protobuf/Make.protobuf | ||||
|  | ||||
| %.pb.go:	%.proto | ||||
| 	protoc --go_out=. $< | ||||
|  | ||||
							
								
								
									
										55
									
								
								vendor/github.com/golang/protobuf/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								vendor/github.com/golang/protobuf/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| # Go support for Protocol Buffers - Google's data interchange format | ||||
| # | ||||
| # Copyright 2010 The Go Authors.  All rights reserved. | ||||
| # https://github.com/golang/protobuf | ||||
| # | ||||
| # 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. | ||||
|  | ||||
|  | ||||
| all:	install | ||||
|  | ||||
| install: | ||||
| 	go install ./proto ./jsonpb ./ptypes | ||||
| 	go install ./protoc-gen-go | ||||
|  | ||||
| test: | ||||
| 	go test ./proto ./jsonpb ./ptypes | ||||
| 	make -C protoc-gen-go/testdata test | ||||
|  | ||||
| clean: | ||||
| 	go clean ./... | ||||
|  | ||||
| nuke: | ||||
| 	go clean -i ./... | ||||
|  | ||||
| regenerate: | ||||
| 	make -C protoc-gen-go/descriptor regenerate | ||||
| 	make -C protoc-gen-go/plugin regenerate | ||||
| 	make -C protoc-gen-go/testdata regenerate | ||||
| 	make -C proto/testdata regenerate | ||||
| 	make -C jsonpb/jsonpb_test_proto regenerate | ||||
| 	make -C _conformance regenerate | ||||
							
								
								
									
										241
									
								
								vendor/github.com/golang/protobuf/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								vendor/github.com/golang/protobuf/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,241 @@ | ||||
| # Go support for Protocol Buffers | ||||
|  | ||||
| Google's data interchange format. | ||||
| Copyright 2010 The Go Authors. | ||||
| https://github.com/golang/protobuf | ||||
|  | ||||
| This package and the code it generates requires at least Go 1.4. | ||||
|  | ||||
| This software implements Go bindings for protocol buffers.  For | ||||
| information about protocol buffers themselves, see | ||||
| 	https://developers.google.com/protocol-buffers/ | ||||
|  | ||||
| ## Installation ## | ||||
|  | ||||
| To use this software, you must: | ||||
| - Install the standard C++ implementation of protocol buffers from | ||||
| 	https://developers.google.com/protocol-buffers/ | ||||
| - Of course, install the Go compiler and tools from | ||||
| 	https://golang.org/ | ||||
|   See | ||||
| 	https://golang.org/doc/install | ||||
|   for details or, if you are using gccgo, follow the instructions at | ||||
| 	https://golang.org/doc/install/gccgo | ||||
| - Grab the code from the repository and install the proto package. | ||||
|   The simplest way is to run `go get -u github.com/golang/protobuf/{proto,protoc-gen-go}`. | ||||
|   The compiler plugin, protoc-gen-go, will be installed in $GOBIN, | ||||
|   defaulting to $GOPATH/bin.  It must be in your $PATH for the protocol | ||||
|   compiler, protoc, to find it. | ||||
|  | ||||
| This software has two parts: a 'protocol compiler plugin' that | ||||
| generates Go source files that, once compiled, can access and manage | ||||
| protocol buffers; and a library that implements run-time support for | ||||
| encoding (marshaling), decoding (unmarshaling), and accessing protocol | ||||
| buffers. | ||||
|  | ||||
| There is support for gRPC in Go using protocol buffers. | ||||
| See the note at the bottom of this file for details. | ||||
|  | ||||
| There are no insertion points in the plugin. | ||||
|  | ||||
|  | ||||
| ## Using protocol buffers with Go ## | ||||
|  | ||||
| Once the software is installed, there are two steps to using it. | ||||
| First you must compile the protocol buffer definitions and then import | ||||
| them, with the support library, into your program. | ||||
|  | ||||
| To compile the protocol buffer definition, run protoc with the --go_out | ||||
| parameter set to the directory you want to output the Go code to. | ||||
|  | ||||
| 	protoc --go_out=. *.proto | ||||
|  | ||||
| The generated files will be suffixed .pb.go.  See the Test code below | ||||
| for an example using such a file. | ||||
|  | ||||
|  | ||||
| The package comment for the proto library contains text describing | ||||
| the interface provided in Go for protocol buffers. Here is an edited | ||||
| version. | ||||
|  | ||||
| ========== | ||||
|  | ||||
| The proto package converts data structures to and from the | ||||
| wire format of protocol buffers.  It works in concert with the | ||||
| Go source code generated for .proto files by the protocol compiler. | ||||
|  | ||||
| A summary of the properties of the protocol buffer interface | ||||
| for a protocol buffer variable v: | ||||
|  | ||||
|   - Names are turned from camel_case to CamelCase for export. | ||||
|   - There are no methods on v to set fields; just treat | ||||
|   	them as structure fields. | ||||
|   - There are getters that return a field's value if set, | ||||
| 	and return the field's default value if unset. | ||||
| 	The getters work even if the receiver is a nil message. | ||||
|   - The zero value for a struct is its correct initialization state. | ||||
| 	All desired fields must be set before marshaling. | ||||
|   - A Reset() method will restore a protobuf struct to its zero state. | ||||
|   - Non-repeated fields are pointers to the values; nil means unset. | ||||
| 	That is, optional or required field int32 f becomes F *int32. | ||||
|   - Repeated fields are slices. | ||||
|   - Helper functions are available to aid the setting of fields. | ||||
| 	Helpers for getting values are superseded by the | ||||
| 	GetFoo methods and their use is deprecated. | ||||
| 		msg.Foo = proto.String("hello") // set field | ||||
|   - Constants are defined to hold the default values of all fields that | ||||
| 	have them.  They have the form Default_StructName_FieldName. | ||||
| 	Because the getter methods handle defaulted values, | ||||
| 	direct use of these constants should be rare. | ||||
|   - Enums are given type names and maps from names to values. | ||||
| 	Enum values are prefixed with the enum's type name. Enum types have | ||||
| 	a String method, and a Enum method to assist in message construction. | ||||
|   - Nested groups and enums have type names prefixed with the name of | ||||
|   	the surrounding message type. | ||||
|   - Extensions are given descriptor names that start with E_, | ||||
| 	followed by an underscore-delimited list of the nested messages | ||||
| 	that contain it (if any) followed by the CamelCased name of the | ||||
| 	extension field itself.  HasExtension, ClearExtension, GetExtension | ||||
| 	and SetExtension are functions for manipulating extensions. | ||||
|   - Oneof field sets are given a single field in their message, | ||||
| 	with distinguished wrapper types for each possible field value. | ||||
|   - Marshal and Unmarshal are functions to encode and decode the wire format. | ||||
|  | ||||
| When the .proto file specifies `syntax="proto3"`, there are some differences: | ||||
|  | ||||
|   - Non-repeated fields of non-message type are values instead of pointers. | ||||
|   - Getters are only generated for message and oneof fields. | ||||
|   - Enum types do not get an Enum method. | ||||
|  | ||||
| Consider file test.proto, containing | ||||
|  | ||||
| ```proto | ||||
| 	package example; | ||||
| 	 | ||||
| 	enum FOO { X = 17; }; | ||||
| 	 | ||||
| 	message Test { | ||||
| 	  required string label = 1; | ||||
| 	  optional int32 type = 2 [default=77]; | ||||
| 	  repeated int64 reps = 3; | ||||
| 	  optional group OptionalGroup = 4 { | ||||
| 	    required string RequiredField = 5; | ||||
| 	  } | ||||
| 	} | ||||
| ``` | ||||
|  | ||||
| To create and play with a Test object from the example package, | ||||
|  | ||||
| ```go | ||||
| 	package main | ||||
|  | ||||
| 	import ( | ||||
| 		"log" | ||||
|  | ||||
| 		"github.com/golang/protobuf/proto" | ||||
| 		"path/to/example" | ||||
| 	) | ||||
|  | ||||
| 	func main() { | ||||
| 		test := &example.Test { | ||||
| 			Label: proto.String("hello"), | ||||
| 			Type:  proto.Int32(17), | ||||
| 			Reps:  []int64{1, 2, 3}, | ||||
| 			Optionalgroup: &example.Test_OptionalGroup { | ||||
| 				RequiredField: proto.String("good bye"), | ||||
| 			}, | ||||
| 		} | ||||
| 		data, err := proto.Marshal(test) | ||||
| 		if err != nil { | ||||
| 			log.Fatal("marshaling error: ", err) | ||||
| 		} | ||||
| 		newTest := &example.Test{} | ||||
| 		err = proto.Unmarshal(data, newTest) | ||||
| 		if err != nil { | ||||
| 			log.Fatal("unmarshaling error: ", err) | ||||
| 		} | ||||
| 		// Now test and newTest contain the same data. | ||||
| 		if test.GetLabel() != newTest.GetLabel() { | ||||
| 			log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) | ||||
| 		} | ||||
| 		// etc. | ||||
| 	} | ||||
| ``` | ||||
|  | ||||
| ## Parameters ## | ||||
|  | ||||
| To pass extra parameters to the plugin, use a comma-separated | ||||
| parameter list separated from the output directory by a colon: | ||||
|  | ||||
|  | ||||
| 	protoc --go_out=plugins=grpc,import_path=mypackage:. *.proto | ||||
|  | ||||
|  | ||||
| - `import_prefix=xxx` - a prefix that is added onto the beginning of | ||||
|   all imports. Useful for things like generating protos in a | ||||
|   subdirectory, or regenerating vendored protobufs in-place. | ||||
| - `import_path=foo/bar` - used as the package if no input files | ||||
|   declare `go_package`. If it contains slashes, everything up to the | ||||
|   rightmost slash is ignored. | ||||
| - `plugins=plugin1+plugin2` - specifies the list of sub-plugins to | ||||
|   load. The only plugin in this repo is `grpc`. | ||||
| - `Mfoo/bar.proto=quux/shme` - declares that foo/bar.proto is | ||||
|   associated with Go package quux/shme.  This is subject to the | ||||
|   import_prefix parameter. | ||||
|  | ||||
| ## gRPC Support ## | ||||
|  | ||||
| If a proto file specifies RPC services, protoc-gen-go can be instructed to | ||||
| generate code compatible with gRPC (http://www.grpc.io/). To do this, pass | ||||
| the `plugins` parameter to protoc-gen-go; the usual way is to insert it into | ||||
| the --go_out argument to protoc: | ||||
|  | ||||
| 	protoc --go_out=plugins=grpc:. *.proto | ||||
|  | ||||
| ## Compatibility ## | ||||
|  | ||||
| The library and the generated code are expected to be stable over time. | ||||
| However, we reserve the right to make breaking changes without notice for the | ||||
| following reasons: | ||||
|  | ||||
| - Security. A security issue in the specification or implementation may come to | ||||
|   light whose resolution requires breaking compatibility. We reserve the right | ||||
|   to address such security issues. | ||||
| - Unspecified behavior.  There are some aspects of the Protocol Buffers | ||||
|   specification that are undefined.  Programs that depend on such unspecified | ||||
|   behavior may break in future releases. | ||||
| - Specification errors or changes. If it becomes necessary to address an | ||||
|   inconsistency, incompleteness, or change in the Protocol Buffers | ||||
|   specification, resolving the issue could affect the meaning or legality of | ||||
|   existing programs.  We reserve the right to address such issues, including | ||||
|   updating the implementations. | ||||
| - Bugs.  If the library has a bug that violates the specification, a program | ||||
|   that depends on the buggy behavior may break if the bug is fixed.  We reserve | ||||
|   the right to fix such bugs. | ||||
| - Adding methods or fields to generated structs.  These may conflict with field | ||||
|   names that already exist in a schema, causing applications to break.  When the | ||||
|   code generator encounters a field in the schema that would collide with a | ||||
|   generated field or method name, the code generator will append an underscore | ||||
|   to the generated field or method name. | ||||
| - Adding, removing, or changing methods or fields in generated structs that | ||||
|   start with `XXX`.  These parts of the generated code are exported out of | ||||
|   necessity, but should not be considered part of the public API. | ||||
| - Adding, removing, or changing unexported symbols in generated code. | ||||
|  | ||||
| Any breaking changes outside of these will be announced 6 months in advance to | ||||
| protobuf@googlegroups.com. | ||||
|  | ||||
| You should, whenever possible, use generated code created by the `protoc-gen-go` | ||||
| tool built at the same commit as the `proto` package.  The `proto` package | ||||
| declares package-level constants in the form `ProtoPackageIsVersionX`. | ||||
| Application code and generated code may depend on one of these constants to | ||||
| ensure that compilation will fail if the available version of the proto library | ||||
| is too old.  Whenever we make a change to the generated code that requires newer | ||||
| library support, in the same commit we will increment the version number of the | ||||
| generated code and declare a new package-level constant whose name incorporates | ||||
| the latest version number.  Removing a compatibility constant is considered a | ||||
| breaking change and would be subject to the announcement policy stated above. | ||||
|  | ||||
| The `protoc-gen-go/generator` package exposes a plugin interface, | ||||
| which is used by the gRPC code generation. This interface is not | ||||
| supported and is subject to incompatible changes without notice. | ||||
							
								
								
									
										33
									
								
								vendor/github.com/golang/protobuf/_conformance/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/golang/protobuf/_conformance/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| # Go support for Protocol Buffers - Google's data interchange format | ||||
| # | ||||
| # Copyright 2016 The Go Authors.  All rights reserved. | ||||
| # https://github.com/golang/protobuf | ||||
| # | ||||
| # 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. | ||||
|  | ||||
| regenerate: | ||||
| 	protoc --go_out=Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any,Mgoogle/protobuf/duration.proto=github.com/golang/protobuf/ptypes/duration,Mgoogle/protobuf/struct.proto=github.com/golang/protobuf/ptypes/struct,Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp,Mgoogle/protobuf/wrappers.proto=github.com/golang/protobuf/ptypes/wrappers,Mgoogle/protobuf/field_mask.proto=google.golang.org/genproto/protobuf:. conformance_proto/conformance.proto | ||||
							
								
								
									
										161
									
								
								vendor/github.com/golang/protobuf/_conformance/conformance.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								vendor/github.com/golang/protobuf/_conformance/conformance.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,161 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2016 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| // conformance implements the conformance test subprocess protocol as | ||||
| // documented in conformance.proto. | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"os" | ||||
|  | ||||
| 	pb "github.com/golang/protobuf/_conformance/conformance_proto" | ||||
| 	"github.com/golang/protobuf/jsonpb" | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
| 	var sizeBuf [4]byte | ||||
| 	inbuf := make([]byte, 0, 4096) | ||||
| 	outbuf := proto.NewBuffer(nil) | ||||
| 	for { | ||||
| 		if _, err := io.ReadFull(os.Stdin, sizeBuf[:]); err == io.EOF { | ||||
| 			break | ||||
| 		} else if err != nil { | ||||
| 			fmt.Fprintln(os.Stderr, "go conformance: read request:", err) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		size := binary.LittleEndian.Uint32(sizeBuf[:]) | ||||
| 		if int(size) > cap(inbuf) { | ||||
| 			inbuf = make([]byte, size) | ||||
| 		} | ||||
| 		inbuf = inbuf[:size] | ||||
| 		if _, err := io.ReadFull(os.Stdin, inbuf); err != nil { | ||||
| 			fmt.Fprintln(os.Stderr, "go conformance: read request:", err) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
|  | ||||
| 		req := new(pb.ConformanceRequest) | ||||
| 		if err := proto.Unmarshal(inbuf, req); err != nil { | ||||
| 			fmt.Fprintln(os.Stderr, "go conformance: parse request:", err) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		res := handle(req) | ||||
|  | ||||
| 		if err := outbuf.Marshal(res); err != nil { | ||||
| 			fmt.Fprintln(os.Stderr, "go conformance: marshal response:", err) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		binary.LittleEndian.PutUint32(sizeBuf[:], uint32(len(outbuf.Bytes()))) | ||||
| 		if _, err := os.Stdout.Write(sizeBuf[:]); err != nil { | ||||
| 			fmt.Fprintln(os.Stderr, "go conformance: write response:", err) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		if _, err := os.Stdout.Write(outbuf.Bytes()); err != nil { | ||||
| 			fmt.Fprintln(os.Stderr, "go conformance: write response:", err) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		outbuf.Reset() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var jsonMarshaler = jsonpb.Marshaler{ | ||||
| 	OrigName: true, | ||||
| } | ||||
|  | ||||
| func handle(req *pb.ConformanceRequest) *pb.ConformanceResponse { | ||||
| 	var err error | ||||
| 	var msg pb.TestAllTypes | ||||
| 	switch p := req.Payload.(type) { | ||||
| 	case *pb.ConformanceRequest_ProtobufPayload: | ||||
| 		err = proto.Unmarshal(p.ProtobufPayload, &msg) | ||||
| 	case *pb.ConformanceRequest_JsonPayload: | ||||
| 		err = jsonpb.UnmarshalString(p.JsonPayload, &msg) | ||||
| 		if err != nil && err.Error() == "unmarshaling Any not supported yet" { | ||||
| 			return &pb.ConformanceResponse{ | ||||
| 				Result: &pb.ConformanceResponse_Skipped{ | ||||
| 					Skipped: err.Error(), | ||||
| 				}, | ||||
| 			} | ||||
| 		} | ||||
| 	default: | ||||
| 		return &pb.ConformanceResponse{ | ||||
| 			Result: &pb.ConformanceResponse_RuntimeError{ | ||||
| 				RuntimeError: "unknown request payload type", | ||||
| 			}, | ||||
| 		} | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		return &pb.ConformanceResponse{ | ||||
| 			Result: &pb.ConformanceResponse_ParseError{ | ||||
| 				ParseError: err.Error(), | ||||
| 			}, | ||||
| 		} | ||||
| 	} | ||||
| 	switch req.RequestedOutputFormat { | ||||
| 	case pb.WireFormat_PROTOBUF: | ||||
| 		p, err := proto.Marshal(&msg) | ||||
| 		if err != nil { | ||||
| 			return &pb.ConformanceResponse{ | ||||
| 				Result: &pb.ConformanceResponse_SerializeError{ | ||||
| 					SerializeError: err.Error(), | ||||
| 				}, | ||||
| 			} | ||||
| 		} | ||||
| 		return &pb.ConformanceResponse{ | ||||
| 			Result: &pb.ConformanceResponse_ProtobufPayload{ | ||||
| 				ProtobufPayload: p, | ||||
| 			}, | ||||
| 		} | ||||
| 	case pb.WireFormat_JSON: | ||||
| 		p, err := jsonMarshaler.MarshalToString(&msg) | ||||
| 		if err != nil { | ||||
| 			return &pb.ConformanceResponse{ | ||||
| 				Result: &pb.ConformanceResponse_SerializeError{ | ||||
| 					SerializeError: err.Error(), | ||||
| 				}, | ||||
| 			} | ||||
| 		} | ||||
| 		return &pb.ConformanceResponse{ | ||||
| 			Result: &pb.ConformanceResponse_JsonPayload{ | ||||
| 				JsonPayload: p, | ||||
| 			}, | ||||
| 		} | ||||
| 	default: | ||||
| 		return &pb.ConformanceResponse{ | ||||
| 			Result: &pb.ConformanceResponse_RuntimeError{ | ||||
| 				RuntimeError: "unknown output format", | ||||
| 			}, | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										1472
									
								
								vendor/github.com/golang/protobuf/_conformance/conformance_proto/conformance.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1472
									
								
								vendor/github.com/golang/protobuf/_conformance/conformance_proto/conformance.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										285
									
								
								vendor/github.com/golang/protobuf/_conformance/conformance_proto/conformance.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										285
									
								
								vendor/github.com/golang/protobuf/_conformance/conformance_proto/conformance.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,285 @@ | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto3"; | ||||
| package conformance; | ||||
| option java_package = "com.google.protobuf.conformance"; | ||||
|  | ||||
| import "google/protobuf/any.proto"; | ||||
| import "google/protobuf/duration.proto"; | ||||
| import "google/protobuf/field_mask.proto"; | ||||
| import "google/protobuf/struct.proto"; | ||||
| import "google/protobuf/timestamp.proto"; | ||||
| import "google/protobuf/wrappers.proto"; | ||||
|  | ||||
| // This defines the conformance testing protocol.  This protocol exists between | ||||
| // the conformance test suite itself and the code being tested.  For each test, | ||||
| // the suite will send a ConformanceRequest message and expect a | ||||
| // ConformanceResponse message. | ||||
| // | ||||
| // You can either run the tests in two different ways: | ||||
| // | ||||
| //   1. in-process (using the interface in conformance_test.h). | ||||
| // | ||||
| //   2. as a sub-process communicating over a pipe.  Information about how to | ||||
| //      do this is in conformance_test_runner.cc. | ||||
| // | ||||
| // Pros/cons of the two approaches: | ||||
| // | ||||
| //   - running as a sub-process is much simpler for languages other than C/C++. | ||||
| // | ||||
| //   - running as a sub-process may be more tricky in unusual environments like | ||||
| //     iOS apps, where fork/stdin/stdout are not available. | ||||
|  | ||||
| enum WireFormat { | ||||
|   UNSPECIFIED = 0; | ||||
|   PROTOBUF = 1; | ||||
|   JSON = 2; | ||||
| } | ||||
|  | ||||
| // Represents a single test case's input.  The testee should: | ||||
| // | ||||
| //   1. parse this proto (which should always succeed) | ||||
| //   2. parse the protobuf or JSON payload in "payload" (which may fail) | ||||
| //   3. if the parse succeeded, serialize the message in the requested format. | ||||
| message ConformanceRequest { | ||||
|   // The payload (whether protobuf of JSON) is always for a TestAllTypes proto | ||||
|   // (see below). | ||||
|   oneof payload { | ||||
|     bytes protobuf_payload = 1; | ||||
|     string json_payload = 2; | ||||
|   } | ||||
|  | ||||
|   // Which format should the testee serialize its message to? | ||||
|   WireFormat requested_output_format = 3; | ||||
| } | ||||
|  | ||||
| // Represents a single test case's output. | ||||
| message ConformanceResponse { | ||||
|   oneof result { | ||||
|     // This string should be set to indicate parsing failed.  The string can | ||||
|     // provide more information about the parse error if it is available. | ||||
|     // | ||||
|     // Setting this string does not necessarily mean the testee failed the | ||||
|     // test.  Some of the test cases are intentionally invalid input. | ||||
|     string parse_error = 1; | ||||
|  | ||||
|     // If the input was successfully parsed but errors occurred when | ||||
|     // serializing it to the requested output format, set the error message in | ||||
|     // this field. | ||||
|     string serialize_error = 6; | ||||
|  | ||||
|     // This should be set if some other error occurred.  This will always | ||||
|     // indicate that the test failed.  The string can provide more information | ||||
|     // about the failure. | ||||
|     string runtime_error = 2; | ||||
|  | ||||
|     // If the input was successfully parsed and the requested output was | ||||
|     // protobuf, serialize it to protobuf and set it in this field. | ||||
|     bytes protobuf_payload = 3; | ||||
|  | ||||
|     // If the input was successfully parsed and the requested output was JSON, | ||||
|     // serialize to JSON and set it in this field. | ||||
|     string json_payload = 4; | ||||
|  | ||||
|     // For when the testee skipped the test, likely because a certain feature | ||||
|     // wasn't supported, like JSON input/output. | ||||
|     string skipped = 5; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // This proto includes every type of field in both singular and repeated | ||||
| // forms. | ||||
| message TestAllTypes { | ||||
|   message NestedMessage { | ||||
|     int32 a = 1; | ||||
|     TestAllTypes corecursive = 2; | ||||
|   } | ||||
|  | ||||
|   enum NestedEnum { | ||||
|     FOO = 0; | ||||
|     BAR = 1; | ||||
|     BAZ = 2; | ||||
|     NEG = -1;  // Intentionally negative. | ||||
|   } | ||||
|  | ||||
|   // Singular | ||||
|   int32 optional_int32    =  1; | ||||
|   int64 optional_int64    =  2; | ||||
|   uint32 optional_uint32   =  3; | ||||
|   uint64 optional_uint64   =  4; | ||||
|   sint32 optional_sint32   =  5; | ||||
|   sint64 optional_sint64   =  6; | ||||
|   fixed32 optional_fixed32  =  7; | ||||
|   fixed64 optional_fixed64  =  8; | ||||
|   sfixed32 optional_sfixed32 =  9; | ||||
|   sfixed64 optional_sfixed64 = 10; | ||||
|   float optional_float    = 11; | ||||
|   double optional_double   = 12; | ||||
|   bool optional_bool     = 13; | ||||
|   string optional_string   = 14; | ||||
|   bytes optional_bytes    = 15; | ||||
|  | ||||
|   NestedMessage                        optional_nested_message  = 18; | ||||
|   ForeignMessage                       optional_foreign_message = 19; | ||||
|  | ||||
|   NestedEnum                           optional_nested_enum     = 21; | ||||
|   ForeignEnum                          optional_foreign_enum    = 22; | ||||
|  | ||||
|   string optional_string_piece = 24 [ctype=STRING_PIECE]; | ||||
|   string optional_cord = 25 [ctype=CORD]; | ||||
|  | ||||
|   TestAllTypes recursive_message = 27; | ||||
|  | ||||
|   // Repeated | ||||
|   repeated    int32 repeated_int32    = 31; | ||||
|   repeated    int64 repeated_int64    = 32; | ||||
|   repeated   uint32 repeated_uint32   = 33; | ||||
|   repeated   uint64 repeated_uint64   = 34; | ||||
|   repeated   sint32 repeated_sint32   = 35; | ||||
|   repeated   sint64 repeated_sint64   = 36; | ||||
|   repeated  fixed32 repeated_fixed32  = 37; | ||||
|   repeated  fixed64 repeated_fixed64  = 38; | ||||
|   repeated sfixed32 repeated_sfixed32 = 39; | ||||
|   repeated sfixed64 repeated_sfixed64 = 40; | ||||
|   repeated    float repeated_float    = 41; | ||||
|   repeated   double repeated_double   = 42; | ||||
|   repeated     bool repeated_bool     = 43; | ||||
|   repeated   string repeated_string   = 44; | ||||
|   repeated    bytes repeated_bytes    = 45; | ||||
|  | ||||
|   repeated NestedMessage                        repeated_nested_message  = 48; | ||||
|   repeated ForeignMessage                       repeated_foreign_message = 49; | ||||
|  | ||||
|   repeated NestedEnum                           repeated_nested_enum     = 51; | ||||
|   repeated ForeignEnum                          repeated_foreign_enum    = 52; | ||||
|  | ||||
|   repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; | ||||
|   repeated string repeated_cord = 55 [ctype=CORD]; | ||||
|  | ||||
|   // Map | ||||
|   map <   int32, int32>    map_int32_int32 = 56; | ||||
|   map <   int64, int64>    map_int64_int64 = 57; | ||||
|   map <  uint32, uint32>   map_uint32_uint32 = 58; | ||||
|   map <  uint64, uint64>   map_uint64_uint64 = 59; | ||||
|   map <  sint32, sint32>   map_sint32_sint32 = 60; | ||||
|   map <  sint64, sint64>   map_sint64_sint64 = 61; | ||||
|   map < fixed32, fixed32>  map_fixed32_fixed32 = 62; | ||||
|   map < fixed64, fixed64>  map_fixed64_fixed64 = 63; | ||||
|   map <sfixed32, sfixed32> map_sfixed32_sfixed32 = 64; | ||||
|   map <sfixed64, sfixed64> map_sfixed64_sfixed64 = 65; | ||||
|   map <   int32, float>    map_int32_float = 66; | ||||
|   map <   int32, double>   map_int32_double = 67; | ||||
|   map <    bool, bool>     map_bool_bool = 68; | ||||
|   map <  string, string>   map_string_string = 69; | ||||
|   map <  string, bytes>    map_string_bytes = 70; | ||||
|   map <  string, NestedMessage>  map_string_nested_message = 71; | ||||
|   map <  string, ForeignMessage> map_string_foreign_message = 72; | ||||
|   map <  string, NestedEnum>     map_string_nested_enum = 73; | ||||
|   map <  string, ForeignEnum>    map_string_foreign_enum = 74; | ||||
|  | ||||
|   oneof oneof_field { | ||||
|     uint32 oneof_uint32 = 111; | ||||
|     NestedMessage oneof_nested_message = 112; | ||||
|     string oneof_string = 113; | ||||
|     bytes oneof_bytes = 114; | ||||
|     bool oneof_bool = 115; | ||||
|     uint64 oneof_uint64 = 116; | ||||
|     float oneof_float = 117; | ||||
|     double oneof_double = 118; | ||||
|     NestedEnum oneof_enum = 119; | ||||
|   } | ||||
|  | ||||
|   // Well-known types | ||||
|   google.protobuf.BoolValue optional_bool_wrapper = 201; | ||||
|   google.protobuf.Int32Value optional_int32_wrapper = 202; | ||||
|   google.protobuf.Int64Value optional_int64_wrapper = 203; | ||||
|   google.protobuf.UInt32Value optional_uint32_wrapper = 204; | ||||
|   google.protobuf.UInt64Value optional_uint64_wrapper = 205; | ||||
|   google.protobuf.FloatValue optional_float_wrapper = 206; | ||||
|   google.protobuf.DoubleValue optional_double_wrapper = 207; | ||||
|   google.protobuf.StringValue optional_string_wrapper = 208; | ||||
|   google.protobuf.BytesValue optional_bytes_wrapper = 209; | ||||
|  | ||||
|   repeated google.protobuf.BoolValue repeated_bool_wrapper = 211; | ||||
|   repeated google.protobuf.Int32Value repeated_int32_wrapper = 212; | ||||
|   repeated google.protobuf.Int64Value repeated_int64_wrapper = 213; | ||||
|   repeated google.protobuf.UInt32Value repeated_uint32_wrapper = 214; | ||||
|   repeated google.protobuf.UInt64Value repeated_uint64_wrapper = 215; | ||||
|   repeated google.protobuf.FloatValue repeated_float_wrapper = 216; | ||||
|   repeated google.protobuf.DoubleValue repeated_double_wrapper = 217; | ||||
|   repeated google.protobuf.StringValue repeated_string_wrapper = 218; | ||||
|   repeated google.protobuf.BytesValue repeated_bytes_wrapper = 219; | ||||
|  | ||||
|   google.protobuf.Duration optional_duration = 301; | ||||
|   google.protobuf.Timestamp optional_timestamp = 302; | ||||
|   google.protobuf.FieldMask optional_field_mask = 303; | ||||
|   google.protobuf.Struct optional_struct = 304; | ||||
|   google.protobuf.Any optional_any = 305; | ||||
|   google.protobuf.Value optional_value = 306; | ||||
|  | ||||
|   repeated google.protobuf.Duration repeated_duration = 311; | ||||
|   repeated google.protobuf.Timestamp repeated_timestamp = 312; | ||||
|   repeated google.protobuf.FieldMask repeated_fieldmask = 313; | ||||
|   repeated google.protobuf.Struct repeated_struct = 324; | ||||
|   repeated google.protobuf.Any repeated_any = 315; | ||||
|   repeated google.protobuf.Value repeated_value = 316; | ||||
|  | ||||
|   // Test field-name-to-JSON-name convention. | ||||
|   // (protobuf says names can be any valid C/C++ identifier.) | ||||
|   int32 fieldname1 = 401; | ||||
|   int32 field_name2 = 402; | ||||
|   int32 _field_name3 = 403; | ||||
|   int32 field__name4_ = 404; | ||||
|   int32 field0name5 = 405; | ||||
|   int32 field_0_name6 = 406; | ||||
|   int32 fieldName7 = 407; | ||||
|   int32 FieldName8 = 408; | ||||
|   int32 field_Name9 = 409; | ||||
|   int32 Field_Name10 = 410; | ||||
|   int32 FIELD_NAME11 = 411; | ||||
|   int32 FIELD_name12 = 412; | ||||
|   int32 __field_name13 = 413; | ||||
|   int32 __Field_name14 = 414; | ||||
|   int32 field__name15 = 415; | ||||
|   int32 field__Name16 = 416; | ||||
|   int32 field_name17__ = 417; | ||||
|   int32 Field_name18__ = 418; | ||||
| } | ||||
|  | ||||
| message ForeignMessage { | ||||
|   int32 c = 1; | ||||
| } | ||||
|  | ||||
| enum ForeignEnum { | ||||
|   FOREIGN_FOO = 0; | ||||
|   FOREIGN_BAR = 1; | ||||
|   FOREIGN_BAZ = 2; | ||||
| } | ||||
							
								
								
									
										829
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										829
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,829 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2015 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| /* | ||||
| Package jsonpb provides marshaling and unmarshaling between protocol buffers and JSON. | ||||
| It follows the specification at https://developers.google.com/protocol-buffers/docs/proto3#json. | ||||
|  | ||||
| This package produces a different output than the standard "encoding/json" package, | ||||
| which does not operate correctly on protocol buffers. | ||||
| */ | ||||
| package jsonpb | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| ) | ||||
|  | ||||
| // Marshaler is a configurable object for converting between | ||||
| // protocol buffer objects and a JSON representation for them. | ||||
| type Marshaler struct { | ||||
| 	// Whether to render enum values as integers, as opposed to string values. | ||||
| 	EnumsAsInts bool | ||||
|  | ||||
| 	// Whether to render fields with zero values. | ||||
| 	EmitDefaults bool | ||||
|  | ||||
| 	// A string to indent each level by. The presence of this field will | ||||
| 	// also cause a space to appear between the field separator and | ||||
| 	// value, and for newlines to be appear between fields and array | ||||
| 	// elements. | ||||
| 	Indent string | ||||
|  | ||||
| 	// Whether to use the original (.proto) name for fields. | ||||
| 	OrigName bool | ||||
| } | ||||
|  | ||||
| // Marshal marshals a protocol buffer into JSON. | ||||
| func (m *Marshaler) Marshal(out io.Writer, pb proto.Message) error { | ||||
| 	writer := &errWriter{writer: out} | ||||
| 	return m.marshalObject(writer, pb, "", "") | ||||
| } | ||||
|  | ||||
| // MarshalToString converts a protocol buffer object to JSON string. | ||||
| func (m *Marshaler) MarshalToString(pb proto.Message) (string, error) { | ||||
| 	var buf bytes.Buffer | ||||
| 	if err := m.Marshal(&buf, pb); err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	return buf.String(), nil | ||||
| } | ||||
|  | ||||
| type int32Slice []int32 | ||||
|  | ||||
| // For sorting extensions ids to ensure stable output. | ||||
| func (s int32Slice) Len() int           { return len(s) } | ||||
| func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } | ||||
| func (s int32Slice) Swap(i, j int)      { s[i], s[j] = s[j], s[i] } | ||||
|  | ||||
| type wkt interface { | ||||
| 	XXX_WellKnownType() string | ||||
| } | ||||
|  | ||||
| // marshalObject writes a struct to the Writer. | ||||
| func (m *Marshaler) marshalObject(out *errWriter, v proto.Message, indent, typeURL string) error { | ||||
| 	s := reflect.ValueOf(v).Elem() | ||||
|  | ||||
| 	// Handle well-known types. | ||||
| 	if wkt, ok := v.(wkt); ok { | ||||
| 		switch wkt.XXX_WellKnownType() { | ||||
| 		case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value", | ||||
| 			"Int32Value", "UInt32Value", "BoolValue", "StringValue", "BytesValue": | ||||
| 			// "Wrappers use the same representation in JSON | ||||
| 			//  as the wrapped primitive type, ..." | ||||
| 			sprop := proto.GetProperties(s.Type()) | ||||
| 			return m.marshalValue(out, sprop.Prop[0], s.Field(0), indent) | ||||
| 		case "Any": | ||||
| 			// Any is a bit more involved. | ||||
| 			return m.marshalAny(out, v, indent) | ||||
| 		case "Duration": | ||||
| 			// "Generated output always contains 3, 6, or 9 fractional digits, | ||||
| 			//  depending on required precision." | ||||
| 			s, ns := s.Field(0).Int(), s.Field(1).Int() | ||||
| 			d := time.Duration(s)*time.Second + time.Duration(ns)*time.Nanosecond | ||||
| 			x := fmt.Sprintf("%.9f", d.Seconds()) | ||||
| 			x = strings.TrimSuffix(x, "000") | ||||
| 			x = strings.TrimSuffix(x, "000") | ||||
| 			out.write(`"`) | ||||
| 			out.write(x) | ||||
| 			out.write(`s"`) | ||||
| 			return out.err | ||||
| 		case "Struct": | ||||
| 			// Let marshalValue handle the `fields` map. | ||||
| 			// TODO: pass the correct Properties if needed. | ||||
| 			return m.marshalValue(out, &proto.Properties{}, s.Field(0), indent) | ||||
| 		case "Timestamp": | ||||
| 			// "RFC 3339, where generated output will always be Z-normalized | ||||
| 			//  and uses 3, 6 or 9 fractional digits." | ||||
| 			s, ns := s.Field(0).Int(), s.Field(1).Int() | ||||
| 			t := time.Unix(s, ns).UTC() | ||||
| 			// time.RFC3339Nano isn't exactly right (we need to get 3/6/9 fractional digits). | ||||
| 			x := t.Format("2006-01-02T15:04:05.000000000") | ||||
| 			x = strings.TrimSuffix(x, "000") | ||||
| 			x = strings.TrimSuffix(x, "000") | ||||
| 			out.write(`"`) | ||||
| 			out.write(x) | ||||
| 			out.write(`Z"`) | ||||
| 			return out.err | ||||
| 		case "Value": | ||||
| 			// Value has a single oneof. | ||||
| 			kind := s.Field(0) | ||||
| 			if kind.IsNil() { | ||||
| 				// "absence of any variant indicates an error" | ||||
| 				return errors.New("nil Value") | ||||
| 			} | ||||
| 			// oneof -> *T -> T -> T.F | ||||
| 			x := kind.Elem().Elem().Field(0) | ||||
| 			// TODO: pass the correct Properties if needed. | ||||
| 			return m.marshalValue(out, &proto.Properties{}, x, indent) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	out.write("{") | ||||
| 	if m.Indent != "" { | ||||
| 		out.write("\n") | ||||
| 	} | ||||
|  | ||||
| 	firstField := true | ||||
|  | ||||
| 	if typeURL != "" { | ||||
| 		if err := m.marshalTypeURL(out, indent, typeURL); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		firstField = false | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < s.NumField(); i++ { | ||||
| 		value := s.Field(i) | ||||
| 		valueField := s.Type().Field(i) | ||||
| 		if strings.HasPrefix(valueField.Name, "XXX_") { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// IsNil will panic on most value kinds. | ||||
| 		switch value.Kind() { | ||||
| 		case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: | ||||
| 			if value.IsNil() { | ||||
| 				continue | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if !m.EmitDefaults { | ||||
| 			switch value.Kind() { | ||||
| 			case reflect.Bool: | ||||
| 				if !value.Bool() { | ||||
| 					continue | ||||
| 				} | ||||
| 			case reflect.Int32, reflect.Int64: | ||||
| 				if value.Int() == 0 { | ||||
| 					continue | ||||
| 				} | ||||
| 			case reflect.Uint32, reflect.Uint64: | ||||
| 				if value.Uint() == 0 { | ||||
| 					continue | ||||
| 				} | ||||
| 			case reflect.Float32, reflect.Float64: | ||||
| 				if value.Float() == 0 { | ||||
| 					continue | ||||
| 				} | ||||
| 			case reflect.String: | ||||
| 				if value.Len() == 0 { | ||||
| 					continue | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Oneof fields need special handling. | ||||
| 		if valueField.Tag.Get("protobuf_oneof") != "" { | ||||
| 			// value is an interface containing &T{real_value}. | ||||
| 			sv := value.Elem().Elem() // interface -> *T -> T | ||||
| 			value = sv.Field(0) | ||||
| 			valueField = sv.Type().Field(0) | ||||
| 		} | ||||
| 		prop := jsonProperties(valueField, m.OrigName) | ||||
| 		if !firstField { | ||||
| 			m.writeSep(out) | ||||
| 		} | ||||
| 		if err := m.marshalField(out, prop, value, indent); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		firstField = false | ||||
| 	} | ||||
|  | ||||
| 	// Handle proto2 extensions. | ||||
| 	if ep, ok := v.(proto.Message); ok { | ||||
| 		extensions := proto.RegisteredExtensions(v) | ||||
| 		// Sort extensions for stable output. | ||||
| 		ids := make([]int32, 0, len(extensions)) | ||||
| 		for id, desc := range extensions { | ||||
| 			if !proto.HasExtension(ep, desc) { | ||||
| 				continue | ||||
| 			} | ||||
| 			ids = append(ids, id) | ||||
| 		} | ||||
| 		sort.Sort(int32Slice(ids)) | ||||
| 		for _, id := range ids { | ||||
| 			desc := extensions[id] | ||||
| 			if desc == nil { | ||||
| 				// unknown extension | ||||
| 				continue | ||||
| 			} | ||||
| 			ext, extErr := proto.GetExtension(ep, desc) | ||||
| 			if extErr != nil { | ||||
| 				return extErr | ||||
| 			} | ||||
| 			value := reflect.ValueOf(ext) | ||||
| 			var prop proto.Properties | ||||
| 			prop.Parse(desc.Tag) | ||||
| 			prop.JSONName = fmt.Sprintf("[%s]", desc.Name) | ||||
| 			if !firstField { | ||||
| 				m.writeSep(out) | ||||
| 			} | ||||
| 			if err := m.marshalField(out, &prop, value, indent); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			firstField = false | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	if m.Indent != "" { | ||||
| 		out.write("\n") | ||||
| 		out.write(indent) | ||||
| 	} | ||||
| 	out.write("}") | ||||
| 	return out.err | ||||
| } | ||||
|  | ||||
| func (m *Marshaler) writeSep(out *errWriter) { | ||||
| 	if m.Indent != "" { | ||||
| 		out.write(",\n") | ||||
| 	} else { | ||||
| 		out.write(",") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (m *Marshaler) marshalAny(out *errWriter, any proto.Message, indent string) error { | ||||
| 	// "If the Any contains a value that has a special JSON mapping, | ||||
| 	//  it will be converted as follows: {"@type": xxx, "value": yyy}. | ||||
| 	//  Otherwise, the value will be converted into a JSON object, | ||||
| 	//  and the "@type" field will be inserted to indicate the actual data type." | ||||
| 	v := reflect.ValueOf(any).Elem() | ||||
| 	turl := v.Field(0).String() | ||||
| 	val := v.Field(1).Bytes() | ||||
|  | ||||
| 	// Only the part of type_url after the last slash is relevant. | ||||
| 	mname := turl | ||||
| 	if slash := strings.LastIndex(mname, "/"); slash >= 0 { | ||||
| 		mname = mname[slash+1:] | ||||
| 	} | ||||
| 	mt := proto.MessageType(mname) | ||||
| 	if mt == nil { | ||||
| 		return fmt.Errorf("unknown message type %q", mname) | ||||
| 	} | ||||
| 	msg := reflect.New(mt.Elem()).Interface().(proto.Message) | ||||
| 	if err := proto.Unmarshal(val, msg); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := msg.(wkt); ok { | ||||
| 		out.write("{") | ||||
| 		if m.Indent != "" { | ||||
| 			out.write("\n") | ||||
| 		} | ||||
| 		if err := m.marshalTypeURL(out, indent, turl); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		m.writeSep(out) | ||||
| 		if m.Indent != "" { | ||||
| 			out.write(indent) | ||||
| 			out.write(m.Indent) | ||||
| 			out.write(`"value": `) | ||||
| 		} else { | ||||
| 			out.write(`"value":`) | ||||
| 		} | ||||
| 		if err := m.marshalObject(out, msg, indent+m.Indent, ""); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if m.Indent != "" { | ||||
| 			out.write("\n") | ||||
| 			out.write(indent) | ||||
| 		} | ||||
| 		out.write("}") | ||||
| 		return out.err | ||||
| 	} | ||||
|  | ||||
| 	return m.marshalObject(out, msg, indent, turl) | ||||
| } | ||||
|  | ||||
| func (m *Marshaler) marshalTypeURL(out *errWriter, indent, typeURL string) error { | ||||
| 	if m.Indent != "" { | ||||
| 		out.write(indent) | ||||
| 		out.write(m.Indent) | ||||
| 	} | ||||
| 	out.write(`"@type":`) | ||||
| 	if m.Indent != "" { | ||||
| 		out.write(" ") | ||||
| 	} | ||||
| 	b, err := json.Marshal(typeURL) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	out.write(string(b)) | ||||
| 	return out.err | ||||
| } | ||||
|  | ||||
| // marshalField writes field description and value to the Writer. | ||||
| func (m *Marshaler) marshalField(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error { | ||||
| 	if m.Indent != "" { | ||||
| 		out.write(indent) | ||||
| 		out.write(m.Indent) | ||||
| 	} | ||||
| 	out.write(`"`) | ||||
| 	out.write(prop.JSONName) | ||||
| 	out.write(`":`) | ||||
| 	if m.Indent != "" { | ||||
| 		out.write(" ") | ||||
| 	} | ||||
| 	if err := m.marshalValue(out, prop, v, indent); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // marshalValue writes the value to the Writer. | ||||
| func (m *Marshaler) marshalValue(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error { | ||||
|  | ||||
| 	var err error | ||||
| 	v = reflect.Indirect(v) | ||||
|  | ||||
| 	// Handle repeated elements. | ||||
| 	if v.Kind() == reflect.Slice && v.Type().Elem().Kind() != reflect.Uint8 { | ||||
| 		out.write("[") | ||||
| 		comma := "" | ||||
| 		for i := 0; i < v.Len(); i++ { | ||||
| 			sliceVal := v.Index(i) | ||||
| 			out.write(comma) | ||||
| 			if m.Indent != "" { | ||||
| 				out.write("\n") | ||||
| 				out.write(indent) | ||||
| 				out.write(m.Indent) | ||||
| 				out.write(m.Indent) | ||||
| 			} | ||||
| 			if err := m.marshalValue(out, prop, sliceVal, indent+m.Indent); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			comma = "," | ||||
| 		} | ||||
| 		if m.Indent != "" { | ||||
| 			out.write("\n") | ||||
| 			out.write(indent) | ||||
| 			out.write(m.Indent) | ||||
| 		} | ||||
| 		out.write("]") | ||||
| 		return out.err | ||||
| 	} | ||||
|  | ||||
| 	// Handle well-known types. | ||||
| 	// Most are handled up in marshalObject (because 99% are messages). | ||||
| 	type wkt interface { | ||||
| 		XXX_WellKnownType() string | ||||
| 	} | ||||
| 	if wkt, ok := v.Interface().(wkt); ok { | ||||
| 		switch wkt.XXX_WellKnownType() { | ||||
| 		case "NullValue": | ||||
| 			out.write("null") | ||||
| 			return out.err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Handle enumerations. | ||||
| 	if !m.EnumsAsInts && prop.Enum != "" { | ||||
| 		// Unknown enum values will are stringified by the proto library as their | ||||
| 		// value. Such values should _not_ be quoted or they will be interpreted | ||||
| 		// as an enum string instead of their value. | ||||
| 		enumStr := v.Interface().(fmt.Stringer).String() | ||||
| 		var valStr string | ||||
| 		if v.Kind() == reflect.Ptr { | ||||
| 			valStr = strconv.Itoa(int(v.Elem().Int())) | ||||
| 		} else { | ||||
| 			valStr = strconv.Itoa(int(v.Int())) | ||||
| 		} | ||||
| 		isKnownEnum := enumStr != valStr | ||||
| 		if isKnownEnum { | ||||
| 			out.write(`"`) | ||||
| 		} | ||||
| 		out.write(enumStr) | ||||
| 		if isKnownEnum { | ||||
| 			out.write(`"`) | ||||
| 		} | ||||
| 		return out.err | ||||
| 	} | ||||
|  | ||||
| 	// Handle nested messages. | ||||
| 	if v.Kind() == reflect.Struct { | ||||
| 		return m.marshalObject(out, v.Addr().Interface().(proto.Message), indent+m.Indent, "") | ||||
| 	} | ||||
|  | ||||
| 	// Handle maps. | ||||
| 	// Since Go randomizes map iteration, we sort keys for stable output. | ||||
| 	if v.Kind() == reflect.Map { | ||||
| 		out.write(`{`) | ||||
| 		keys := v.MapKeys() | ||||
| 		sort.Sort(mapKeys(keys)) | ||||
| 		for i, k := range keys { | ||||
| 			if i > 0 { | ||||
| 				out.write(`,`) | ||||
| 			} | ||||
| 			if m.Indent != "" { | ||||
| 				out.write("\n") | ||||
| 				out.write(indent) | ||||
| 				out.write(m.Indent) | ||||
| 				out.write(m.Indent) | ||||
| 			} | ||||
|  | ||||
| 			b, err := json.Marshal(k.Interface()) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			s := string(b) | ||||
|  | ||||
| 			// If the JSON is not a string value, encode it again to make it one. | ||||
| 			if !strings.HasPrefix(s, `"`) { | ||||
| 				b, err := json.Marshal(s) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				s = string(b) | ||||
| 			} | ||||
|  | ||||
| 			out.write(s) | ||||
| 			out.write(`:`) | ||||
| 			if m.Indent != "" { | ||||
| 				out.write(` `) | ||||
| 			} | ||||
|  | ||||
| 			if err := m.marshalValue(out, prop, v.MapIndex(k), indent+m.Indent); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		if m.Indent != "" { | ||||
| 			out.write("\n") | ||||
| 			out.write(indent) | ||||
| 			out.write(m.Indent) | ||||
| 		} | ||||
| 		out.write(`}`) | ||||
| 		return out.err | ||||
| 	} | ||||
|  | ||||
| 	// Default handling defers to the encoding/json library. | ||||
| 	b, err := json.Marshal(v.Interface()) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	needToQuote := string(b[0]) != `"` && (v.Kind() == reflect.Int64 || v.Kind() == reflect.Uint64) | ||||
| 	if needToQuote { | ||||
| 		out.write(`"`) | ||||
| 	} | ||||
| 	out.write(string(b)) | ||||
| 	if needToQuote { | ||||
| 		out.write(`"`) | ||||
| 	} | ||||
| 	return out.err | ||||
| } | ||||
|  | ||||
| // Unmarshaler is a configurable object for converting from a JSON | ||||
| // representation to a protocol buffer object. | ||||
| type Unmarshaler struct { | ||||
| 	// Whether to allow messages to contain unknown fields, as opposed to | ||||
| 	// failing to unmarshal. | ||||
| 	AllowUnknownFields bool | ||||
| } | ||||
|  | ||||
| // UnmarshalNext unmarshals the next protocol buffer from a JSON object stream. | ||||
| // This function is lenient and will decode any options permutations of the | ||||
| // related Marshaler. | ||||
| func (u *Unmarshaler) UnmarshalNext(dec *json.Decoder, pb proto.Message) error { | ||||
| 	inputValue := json.RawMessage{} | ||||
| 	if err := dec.Decode(&inputValue); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return u.unmarshalValue(reflect.ValueOf(pb).Elem(), inputValue, nil) | ||||
| } | ||||
|  | ||||
| // Unmarshal unmarshals a JSON object stream into a protocol | ||||
| // buffer. This function is lenient and will decode any options | ||||
| // permutations of the related Marshaler. | ||||
| func (u *Unmarshaler) Unmarshal(r io.Reader, pb proto.Message) error { | ||||
| 	dec := json.NewDecoder(r) | ||||
| 	return u.UnmarshalNext(dec, pb) | ||||
| } | ||||
|  | ||||
| // UnmarshalNext unmarshals the next protocol buffer from a JSON object stream. | ||||
| // This function is lenient and will decode any options permutations of the | ||||
| // related Marshaler. | ||||
| func UnmarshalNext(dec *json.Decoder, pb proto.Message) error { | ||||
| 	return new(Unmarshaler).UnmarshalNext(dec, pb) | ||||
| } | ||||
|  | ||||
| // Unmarshal unmarshals a JSON object stream into a protocol | ||||
| // buffer. This function is lenient and will decode any options | ||||
| // permutations of the related Marshaler. | ||||
| func Unmarshal(r io.Reader, pb proto.Message) error { | ||||
| 	return new(Unmarshaler).Unmarshal(r, pb) | ||||
| } | ||||
|  | ||||
| // UnmarshalString will populate the fields of a protocol buffer based | ||||
| // on a JSON string. This function is lenient and will decode any options | ||||
| // permutations of the related Marshaler. | ||||
| func UnmarshalString(str string, pb proto.Message) error { | ||||
| 	return new(Unmarshaler).Unmarshal(strings.NewReader(str), pb) | ||||
| } | ||||
|  | ||||
| // unmarshalValue converts/copies a value into the target. | ||||
| // prop may be nil. | ||||
| func (u *Unmarshaler) unmarshalValue(target reflect.Value, inputValue json.RawMessage, prop *proto.Properties) error { | ||||
| 	targetType := target.Type() | ||||
|  | ||||
| 	// Allocate memory for pointer fields. | ||||
| 	if targetType.Kind() == reflect.Ptr { | ||||
| 		target.Set(reflect.New(targetType.Elem())) | ||||
| 		return u.unmarshalValue(target.Elem(), inputValue, prop) | ||||
| 	} | ||||
|  | ||||
| 	// Handle well-known types. | ||||
| 	type wkt interface { | ||||
| 		XXX_WellKnownType() string | ||||
| 	} | ||||
| 	if wkt, ok := target.Addr().Interface().(wkt); ok { | ||||
| 		switch wkt.XXX_WellKnownType() { | ||||
| 		case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value", | ||||
| 			"Int32Value", "UInt32Value", "BoolValue", "StringValue", "BytesValue": | ||||
| 			// "Wrappers use the same representation in JSON | ||||
| 			//  as the wrapped primitive type, except that null is allowed." | ||||
| 			// encoding/json will turn JSON `null` into Go `nil`, | ||||
| 			// so we don't have to do any extra work. | ||||
| 			return u.unmarshalValue(target.Field(0), inputValue, prop) | ||||
| 		case "Any": | ||||
| 			return fmt.Errorf("unmarshaling Any not supported yet") | ||||
| 		case "Duration": | ||||
| 			unq, err := strconv.Unquote(string(inputValue)) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			d, err := time.ParseDuration(unq) | ||||
| 			if err != nil { | ||||
| 				return fmt.Errorf("bad Duration: %v", err) | ||||
| 			} | ||||
| 			ns := d.Nanoseconds() | ||||
| 			s := ns / 1e9 | ||||
| 			ns %= 1e9 | ||||
| 			target.Field(0).SetInt(s) | ||||
| 			target.Field(1).SetInt(ns) | ||||
| 			return nil | ||||
| 		case "Timestamp": | ||||
| 			unq, err := strconv.Unquote(string(inputValue)) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			t, err := time.Parse(time.RFC3339Nano, unq) | ||||
| 			if err != nil { | ||||
| 				return fmt.Errorf("bad Timestamp: %v", err) | ||||
| 			} | ||||
| 			target.Field(0).SetInt(int64(t.Unix())) | ||||
| 			target.Field(1).SetInt(int64(t.Nanosecond())) | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Handle enums, which have an underlying type of int32, | ||||
| 	// and may appear as strings. | ||||
| 	// The case of an enum appearing as a number is handled | ||||
| 	// at the bottom of this function. | ||||
| 	if inputValue[0] == '"' && prop != nil && prop.Enum != "" { | ||||
| 		vmap := proto.EnumValueMap(prop.Enum) | ||||
| 		// Don't need to do unquoting; valid enum names | ||||
| 		// are from a limited character set. | ||||
| 		s := inputValue[1 : len(inputValue)-1] | ||||
| 		n, ok := vmap[string(s)] | ||||
| 		if !ok { | ||||
| 			return fmt.Errorf("unknown value %q for enum %s", s, prop.Enum) | ||||
| 		} | ||||
| 		if target.Kind() == reflect.Ptr { // proto2 | ||||
| 			target.Set(reflect.New(targetType.Elem())) | ||||
| 			target = target.Elem() | ||||
| 		} | ||||
| 		target.SetInt(int64(n)) | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// Handle nested messages. | ||||
| 	if targetType.Kind() == reflect.Struct { | ||||
| 		var jsonFields map[string]json.RawMessage | ||||
| 		if err := json.Unmarshal(inputValue, &jsonFields); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		consumeField := func(prop *proto.Properties) (json.RawMessage, bool) { | ||||
| 			// Be liberal in what names we accept; both orig_name and camelName are okay. | ||||
| 			fieldNames := acceptedJSONFieldNames(prop) | ||||
|  | ||||
| 			vOrig, okOrig := jsonFields[fieldNames.orig] | ||||
| 			vCamel, okCamel := jsonFields[fieldNames.camel] | ||||
| 			if !okOrig && !okCamel { | ||||
| 				return nil, false | ||||
| 			} | ||||
| 			// If, for some reason, both are present in the data, favour the camelName. | ||||
| 			var raw json.RawMessage | ||||
| 			if okOrig { | ||||
| 				raw = vOrig | ||||
| 				delete(jsonFields, fieldNames.orig) | ||||
| 			} | ||||
| 			if okCamel { | ||||
| 				raw = vCamel | ||||
| 				delete(jsonFields, fieldNames.camel) | ||||
| 			} | ||||
| 			return raw, true | ||||
| 		} | ||||
|  | ||||
| 		sprops := proto.GetProperties(targetType) | ||||
| 		for i := 0; i < target.NumField(); i++ { | ||||
| 			ft := target.Type().Field(i) | ||||
| 			if strings.HasPrefix(ft.Name, "XXX_") { | ||||
| 				continue | ||||
| 			} | ||||
|  | ||||
| 			valueForField, ok := consumeField(sprops.Prop[i]) | ||||
| 			if !ok { | ||||
| 				continue | ||||
| 			} | ||||
|  | ||||
| 			if err := u.unmarshalValue(target.Field(i), valueForField, sprops.Prop[i]); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		// Check for any oneof fields. | ||||
| 		if len(jsonFields) > 0 { | ||||
| 			for _, oop := range sprops.OneofTypes { | ||||
| 				raw, ok := consumeField(oop.Prop) | ||||
| 				if !ok { | ||||
| 					continue | ||||
| 				} | ||||
| 				nv := reflect.New(oop.Type.Elem()) | ||||
| 				target.Field(oop.Field).Set(nv) | ||||
| 				if err := u.unmarshalValue(nv.Elem().Field(0), raw, oop.Prop); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		if !u.AllowUnknownFields && len(jsonFields) > 0 { | ||||
| 			// Pick any field to be the scapegoat. | ||||
| 			var f string | ||||
| 			for fname := range jsonFields { | ||||
| 				f = fname | ||||
| 				break | ||||
| 			} | ||||
| 			return fmt.Errorf("unknown field %q in %v", f, targetType) | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// Handle arrays (which aren't encoded bytes) | ||||
| 	if targetType.Kind() == reflect.Slice && targetType.Elem().Kind() != reflect.Uint8 { | ||||
| 		var slc []json.RawMessage | ||||
| 		if err := json.Unmarshal(inputValue, &slc); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		len := len(slc) | ||||
| 		target.Set(reflect.MakeSlice(targetType, len, len)) | ||||
| 		for i := 0; i < len; i++ { | ||||
| 			if err := u.unmarshalValue(target.Index(i), slc[i], prop); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// Handle maps (whose keys are always strings) | ||||
| 	if targetType.Kind() == reflect.Map { | ||||
| 		var mp map[string]json.RawMessage | ||||
| 		if err := json.Unmarshal(inputValue, &mp); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		target.Set(reflect.MakeMap(targetType)) | ||||
| 		var keyprop, valprop *proto.Properties | ||||
| 		if prop != nil { | ||||
| 			// These could still be nil if the protobuf metadata is broken somehow. | ||||
| 			// TODO: This won't work because the fields are unexported. | ||||
| 			// We should probably just reparse them. | ||||
| 			//keyprop, valprop = prop.mkeyprop, prop.mvalprop | ||||
| 		} | ||||
| 		for ks, raw := range mp { | ||||
| 			// Unmarshal map key. The core json library already decoded the key into a | ||||
| 			// string, so we handle that specially. Other types were quoted post-serialization. | ||||
| 			var k reflect.Value | ||||
| 			if targetType.Key().Kind() == reflect.String { | ||||
| 				k = reflect.ValueOf(ks) | ||||
| 			} else { | ||||
| 				k = reflect.New(targetType.Key()).Elem() | ||||
| 				if err := u.unmarshalValue(k, json.RawMessage(ks), keyprop); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// Unmarshal map value. | ||||
| 			v := reflect.New(targetType.Elem()).Elem() | ||||
| 			if err := u.unmarshalValue(v, raw, valprop); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			target.SetMapIndex(k, v) | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// 64-bit integers can be encoded as strings. In this case we drop | ||||
| 	// the quotes and proceed as normal. | ||||
| 	isNum := targetType.Kind() == reflect.Int64 || targetType.Kind() == reflect.Uint64 | ||||
| 	if isNum && strings.HasPrefix(string(inputValue), `"`) { | ||||
| 		inputValue = inputValue[1 : len(inputValue)-1] | ||||
| 	} | ||||
|  | ||||
| 	// Use the encoding/json for parsing other value types. | ||||
| 	return json.Unmarshal(inputValue, target.Addr().Interface()) | ||||
| } | ||||
|  | ||||
| // jsonProperties returns parsed proto.Properties for the field and corrects JSONName attribute. | ||||
| func jsonProperties(f reflect.StructField, origName bool) *proto.Properties { | ||||
| 	var prop proto.Properties | ||||
| 	prop.Init(f.Type, f.Name, f.Tag.Get("protobuf"), &f) | ||||
| 	if origName || prop.JSONName == "" { | ||||
| 		prop.JSONName = prop.OrigName | ||||
| 	} | ||||
| 	return &prop | ||||
| } | ||||
|  | ||||
| type fieldNames struct { | ||||
| 	orig, camel string | ||||
| } | ||||
|  | ||||
| func acceptedJSONFieldNames(prop *proto.Properties) fieldNames { | ||||
| 	opts := fieldNames{orig: prop.OrigName, camel: prop.OrigName} | ||||
| 	if prop.JSONName != "" { | ||||
| 		opts.camel = prop.JSONName | ||||
| 	} | ||||
| 	return opts | ||||
| } | ||||
|  | ||||
| // Writer wrapper inspired by https://blog.golang.org/errors-are-values | ||||
| type errWriter struct { | ||||
| 	writer io.Writer | ||||
| 	err    error | ||||
| } | ||||
|  | ||||
| func (w *errWriter) write(str string) { | ||||
| 	if w.err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	_, w.err = w.writer.Write([]byte(str)) | ||||
| } | ||||
|  | ||||
| // Map fields may have key types of non-float scalars, strings and enums. | ||||
| // The easiest way to sort them in some deterministic order is to use fmt. | ||||
| // If this turns out to be inefficient we can always consider other options, | ||||
| // such as doing a Schwartzian transform. | ||||
| // | ||||
| // Numeric keys are sorted in numeric order per | ||||
| // https://developers.google.com/protocol-buffers/docs/proto#maps. | ||||
| type mapKeys []reflect.Value | ||||
|  | ||||
| func (s mapKeys) Len() int      { return len(s) } | ||||
| func (s mapKeys) Swap(i, j int) { s[i], s[j] = s[j], s[i] } | ||||
| func (s mapKeys) Less(i, j int) bool { | ||||
| 	if k := s[i].Kind(); k == s[j].Kind() { | ||||
| 		switch k { | ||||
| 		case reflect.Int32, reflect.Int64: | ||||
| 			return s[i].Int() < s[j].Int() | ||||
| 		case reflect.Uint32, reflect.Uint64: | ||||
| 			return s[i].Uint() < s[j].Uint() | ||||
| 		} | ||||
| 	} | ||||
| 	return fmt.Sprint(s[i].Interface()) < fmt.Sprint(s[j].Interface()) | ||||
| } | ||||
							
								
								
									
										561
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										561
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,561 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2015 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package jsonpb | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"io" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
|  | ||||
| 	pb "github.com/golang/protobuf/jsonpb/jsonpb_test_proto" | ||||
| 	proto3pb "github.com/golang/protobuf/proto/proto3_proto" | ||||
| 	anypb "github.com/golang/protobuf/ptypes/any" | ||||
| 	durpb "github.com/golang/protobuf/ptypes/duration" | ||||
| 	stpb "github.com/golang/protobuf/ptypes/struct" | ||||
| 	tspb "github.com/golang/protobuf/ptypes/timestamp" | ||||
| 	wpb "github.com/golang/protobuf/ptypes/wrappers" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	marshaler = Marshaler{} | ||||
|  | ||||
| 	marshalerAllOptions = Marshaler{ | ||||
| 		Indent: "  ", | ||||
| 	} | ||||
|  | ||||
| 	simpleObject = &pb.Simple{ | ||||
| 		OInt32:  proto.Int32(-32), | ||||
| 		OInt64:  proto.Int64(-6400000000), | ||||
| 		OUint32: proto.Uint32(32), | ||||
| 		OUint64: proto.Uint64(6400000000), | ||||
| 		OSint32: proto.Int32(-13), | ||||
| 		OSint64: proto.Int64(-2600000000), | ||||
| 		OFloat:  proto.Float32(3.14), | ||||
| 		ODouble: proto.Float64(6.02214179e23), | ||||
| 		OBool:   proto.Bool(true), | ||||
| 		OString: proto.String("hello \"there\""), | ||||
| 		OBytes:  []byte("beep boop"), | ||||
| 	} | ||||
|  | ||||
| 	simpleObjectJSON = `{` + | ||||
| 		`"oBool":true,` + | ||||
| 		`"oInt32":-32,` + | ||||
| 		`"oInt64":"-6400000000",` + | ||||
| 		`"oUint32":32,` + | ||||
| 		`"oUint64":"6400000000",` + | ||||
| 		`"oSint32":-13,` + | ||||
| 		`"oSint64":"-2600000000",` + | ||||
| 		`"oFloat":3.14,` + | ||||
| 		`"oDouble":6.02214179e+23,` + | ||||
| 		`"oString":"hello \"there\"",` + | ||||
| 		`"oBytes":"YmVlcCBib29w"` + | ||||
| 		`}` | ||||
|  | ||||
| 	simpleObjectPrettyJSON = `{ | ||||
|   "oBool": true, | ||||
|   "oInt32": -32, | ||||
|   "oInt64": "-6400000000", | ||||
|   "oUint32": 32, | ||||
|   "oUint64": "6400000000", | ||||
|   "oSint32": -13, | ||||
|   "oSint64": "-2600000000", | ||||
|   "oFloat": 3.14, | ||||
|   "oDouble": 6.02214179e+23, | ||||
|   "oString": "hello \"there\"", | ||||
|   "oBytes": "YmVlcCBib29w" | ||||
| }` | ||||
|  | ||||
| 	repeatsObject = &pb.Repeats{ | ||||
| 		RBool:   []bool{true, false, true}, | ||||
| 		RInt32:  []int32{-3, -4, -5}, | ||||
| 		RInt64:  []int64{-123456789, -987654321}, | ||||
| 		RUint32: []uint32{1, 2, 3}, | ||||
| 		RUint64: []uint64{6789012345, 3456789012}, | ||||
| 		RSint32: []int32{-1, -2, -3}, | ||||
| 		RSint64: []int64{-6789012345, -3456789012}, | ||||
| 		RFloat:  []float32{3.14, 6.28}, | ||||
| 		RDouble: []float64{299792458 * 1e20, 6.62606957e-34}, | ||||
| 		RString: []string{"happy", "days"}, | ||||
| 		RBytes:  [][]byte{[]byte("skittles"), []byte("m&m's")}, | ||||
| 	} | ||||
|  | ||||
| 	repeatsObjectJSON = `{` + | ||||
| 		`"rBool":[true,false,true],` + | ||||
| 		`"rInt32":[-3,-4,-5],` + | ||||
| 		`"rInt64":["-123456789","-987654321"],` + | ||||
| 		`"rUint32":[1,2,3],` + | ||||
| 		`"rUint64":["6789012345","3456789012"],` + | ||||
| 		`"rSint32":[-1,-2,-3],` + | ||||
| 		`"rSint64":["-6789012345","-3456789012"],` + | ||||
| 		`"rFloat":[3.14,6.28],` + | ||||
| 		`"rDouble":[2.99792458e+28,6.62606957e-34],` + | ||||
| 		`"rString":["happy","days"],` + | ||||
| 		`"rBytes":["c2tpdHRsZXM=","bSZtJ3M="]` + | ||||
| 		`}` | ||||
|  | ||||
| 	repeatsObjectPrettyJSON = `{ | ||||
|   "rBool": [ | ||||
|     true, | ||||
|     false, | ||||
|     true | ||||
|   ], | ||||
|   "rInt32": [ | ||||
|     -3, | ||||
|     -4, | ||||
|     -5 | ||||
|   ], | ||||
|   "rInt64": [ | ||||
|     "-123456789", | ||||
|     "-987654321" | ||||
|   ], | ||||
|   "rUint32": [ | ||||
|     1, | ||||
|     2, | ||||
|     3 | ||||
|   ], | ||||
|   "rUint64": [ | ||||
|     "6789012345", | ||||
|     "3456789012" | ||||
|   ], | ||||
|   "rSint32": [ | ||||
|     -1, | ||||
|     -2, | ||||
|     -3 | ||||
|   ], | ||||
|   "rSint64": [ | ||||
|     "-6789012345", | ||||
|     "-3456789012" | ||||
|   ], | ||||
|   "rFloat": [ | ||||
|     3.14, | ||||
|     6.28 | ||||
|   ], | ||||
|   "rDouble": [ | ||||
|     2.99792458e+28, | ||||
|     6.62606957e-34 | ||||
|   ], | ||||
|   "rString": [ | ||||
|     "happy", | ||||
|     "days" | ||||
|   ], | ||||
|   "rBytes": [ | ||||
|     "c2tpdHRsZXM=", | ||||
|     "bSZtJ3M=" | ||||
|   ] | ||||
| }` | ||||
|  | ||||
| 	innerSimple   = &pb.Simple{OInt32: proto.Int32(-32)} | ||||
| 	innerSimple2  = &pb.Simple{OInt64: proto.Int64(25)} | ||||
| 	innerRepeats  = &pb.Repeats{RString: []string{"roses", "red"}} | ||||
| 	innerRepeats2 = &pb.Repeats{RString: []string{"violets", "blue"}} | ||||
| 	complexObject = &pb.Widget{ | ||||
| 		Color:    pb.Widget_GREEN.Enum(), | ||||
| 		RColor:   []pb.Widget_Color{pb.Widget_RED, pb.Widget_GREEN, pb.Widget_BLUE}, | ||||
| 		Simple:   innerSimple, | ||||
| 		RSimple:  []*pb.Simple{innerSimple, innerSimple2}, | ||||
| 		Repeats:  innerRepeats, | ||||
| 		RRepeats: []*pb.Repeats{innerRepeats, innerRepeats2}, | ||||
| 	} | ||||
|  | ||||
| 	complexObjectJSON = `{"color":"GREEN",` + | ||||
| 		`"rColor":["RED","GREEN","BLUE"],` + | ||||
| 		`"simple":{"oInt32":-32},` + | ||||
| 		`"rSimple":[{"oInt32":-32},{"oInt64":"25"}],` + | ||||
| 		`"repeats":{"rString":["roses","red"]},` + | ||||
| 		`"rRepeats":[{"rString":["roses","red"]},{"rString":["violets","blue"]}]` + | ||||
| 		`}` | ||||
|  | ||||
| 	complexObjectPrettyJSON = `{ | ||||
|   "color": "GREEN", | ||||
|   "rColor": [ | ||||
|     "RED", | ||||
|     "GREEN", | ||||
|     "BLUE" | ||||
|   ], | ||||
|   "simple": { | ||||
|     "oInt32": -32 | ||||
|   }, | ||||
|   "rSimple": [ | ||||
|     { | ||||
|       "oInt32": -32 | ||||
|     }, | ||||
|     { | ||||
|       "oInt64": "25" | ||||
|     } | ||||
|   ], | ||||
|   "repeats": { | ||||
|     "rString": [ | ||||
|       "roses", | ||||
|       "red" | ||||
|     ] | ||||
|   }, | ||||
|   "rRepeats": [ | ||||
|     { | ||||
|       "rString": [ | ||||
|         "roses", | ||||
|         "red" | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       "rString": [ | ||||
|         "violets", | ||||
|         "blue" | ||||
|       ] | ||||
|     } | ||||
|   ] | ||||
| }` | ||||
|  | ||||
| 	colorPrettyJSON = `{ | ||||
|  "color": 2 | ||||
| }` | ||||
|  | ||||
| 	colorListPrettyJSON = `{ | ||||
|   "color": 1000, | ||||
|   "rColor": [ | ||||
|     "RED" | ||||
|   ] | ||||
| }` | ||||
|  | ||||
| 	nummyPrettyJSON = `{ | ||||
|   "nummy": { | ||||
|     "1": 2, | ||||
|     "3": 4 | ||||
|   } | ||||
| }` | ||||
|  | ||||
| 	objjyPrettyJSON = `{ | ||||
|   "objjy": { | ||||
|     "1": { | ||||
|       "dub": 1 | ||||
|     } | ||||
|   } | ||||
| }` | ||||
| 	realNumber     = &pb.Real{Value: proto.Float64(3.14159265359)} | ||||
| 	realNumberName = "Pi" | ||||
| 	complexNumber  = &pb.Complex{Imaginary: proto.Float64(0.5772156649)} | ||||
| 	realNumberJSON = `{` + | ||||
| 		`"value":3.14159265359,` + | ||||
| 		`"[jsonpb.Complex.real_extension]":{"imaginary":0.5772156649},` + | ||||
| 		`"[jsonpb.name]":"Pi"` + | ||||
| 		`}` | ||||
|  | ||||
| 	anySimple = &pb.KnownTypes{ | ||||
| 		An: &anypb.Any{ | ||||
| 			TypeUrl: "something.example.com/jsonpb.Simple", | ||||
| 			Value: []byte{ | ||||
| 				// &pb.Simple{OBool:true} | ||||
| 				1 << 3, 1, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	anySimpleJSON       = `{"an":{"@type":"something.example.com/jsonpb.Simple","oBool":true}}` | ||||
| 	anySimplePrettyJSON = `{ | ||||
|   "an": { | ||||
|     "@type": "something.example.com/jsonpb.Simple", | ||||
|     "oBool": true | ||||
|   } | ||||
| }` | ||||
|  | ||||
| 	anyWellKnown = &pb.KnownTypes{ | ||||
| 		An: &anypb.Any{ | ||||
| 			TypeUrl: "type.googleapis.com/google.protobuf.Duration", | ||||
| 			Value: []byte{ | ||||
| 				// &durpb.Duration{Seconds: 1, Nanos: 212000000 } | ||||
| 				1 << 3, 1, // seconds | ||||
| 				2 << 3, 0x80, 0xba, 0x8b, 0x65, // nanos | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	anyWellKnownJSON       = `{"an":{"@type":"type.googleapis.com/google.protobuf.Duration","value":"1.212s"}}` | ||||
| 	anyWellKnownPrettyJSON = `{ | ||||
|   "an": { | ||||
|     "@type": "type.googleapis.com/google.protobuf.Duration", | ||||
|     "value": "1.212s" | ||||
|   } | ||||
| }` | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	if err := proto.SetExtension(realNumber, pb.E_Name, &realNumberName); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	if err := proto.SetExtension(realNumber, pb.E_Complex_RealExtension, complexNumber); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var marshalingTests = []struct { | ||||
| 	desc      string | ||||
| 	marshaler Marshaler | ||||
| 	pb        proto.Message | ||||
| 	json      string | ||||
| }{ | ||||
| 	{"simple flat object", marshaler, simpleObject, simpleObjectJSON}, | ||||
| 	{"simple pretty object", marshalerAllOptions, simpleObject, simpleObjectPrettyJSON}, | ||||
| 	{"repeated fields flat object", marshaler, repeatsObject, repeatsObjectJSON}, | ||||
| 	{"repeated fields pretty object", marshalerAllOptions, repeatsObject, repeatsObjectPrettyJSON}, | ||||
| 	{"nested message/enum flat object", marshaler, complexObject, complexObjectJSON}, | ||||
| 	{"nested message/enum pretty object", marshalerAllOptions, complexObject, complexObjectPrettyJSON}, | ||||
| 	{"enum-string flat object", Marshaler{}, | ||||
| 		&pb.Widget{Color: pb.Widget_BLUE.Enum()}, `{"color":"BLUE"}`}, | ||||
| 	{"enum-value pretty object", Marshaler{EnumsAsInts: true, Indent: " "}, | ||||
| 		&pb.Widget{Color: pb.Widget_BLUE.Enum()}, colorPrettyJSON}, | ||||
| 	{"unknown enum value object", marshalerAllOptions, | ||||
| 		&pb.Widget{Color: pb.Widget_Color(1000).Enum(), RColor: []pb.Widget_Color{pb.Widget_RED}}, colorListPrettyJSON}, | ||||
| 	{"repeated proto3 enum", Marshaler{}, | ||||
| 		&proto3pb.Message{RFunny: []proto3pb.Message_Humour{ | ||||
| 			proto3pb.Message_PUNS, | ||||
| 			proto3pb.Message_SLAPSTICK, | ||||
| 		}}, | ||||
| 		`{"rFunny":["PUNS","SLAPSTICK"]}`}, | ||||
| 	{"repeated proto3 enum as int", Marshaler{EnumsAsInts: true}, | ||||
| 		&proto3pb.Message{RFunny: []proto3pb.Message_Humour{ | ||||
| 			proto3pb.Message_PUNS, | ||||
| 			proto3pb.Message_SLAPSTICK, | ||||
| 		}}, | ||||
| 		`{"rFunny":[1,2]}`}, | ||||
| 	{"empty value", marshaler, &pb.Simple3{}, `{}`}, | ||||
| 	{"empty value emitted", Marshaler{EmitDefaults: true}, &pb.Simple3{}, `{"dub":0}`}, | ||||
| 	{"map<int64, int32>", marshaler, &pb.Mappy{Nummy: map[int64]int32{1: 2, 3: 4}}, `{"nummy":{"1":2,"3":4}}`}, | ||||
| 	{"map<int64, int32>", marshalerAllOptions, &pb.Mappy{Nummy: map[int64]int32{1: 2, 3: 4}}, nummyPrettyJSON}, | ||||
| 	{"map<string, string>", marshaler, | ||||
| 		&pb.Mappy{Strry: map[string]string{`"one"`: "two", "three": "four"}}, | ||||
| 		`{"strry":{"\"one\"":"two","three":"four"}}`}, | ||||
| 	{"map<int32, Object>", marshaler, | ||||
| 		&pb.Mappy{Objjy: map[int32]*pb.Simple3{1: &pb.Simple3{Dub: 1}}}, `{"objjy":{"1":{"dub":1}}}`}, | ||||
| 	{"map<int32, Object>", marshalerAllOptions, | ||||
| 		&pb.Mappy{Objjy: map[int32]*pb.Simple3{1: &pb.Simple3{Dub: 1}}}, objjyPrettyJSON}, | ||||
| 	{"map<int64, string>", marshaler, &pb.Mappy{Buggy: map[int64]string{1234: "yup"}}, | ||||
| 		`{"buggy":{"1234":"yup"}}`}, | ||||
| 	{"map<bool, bool>", marshaler, &pb.Mappy{Booly: map[bool]bool{false: true}}, `{"booly":{"false":true}}`}, | ||||
| 	// TODO: This is broken. | ||||
| 	//{"map<string, enum>", marshaler, &pb.Mappy{Enumy: map[string]pb.Numeral{"XIV": pb.Numeral_ROMAN}}, `{"enumy":{"XIV":"ROMAN"}`}, | ||||
| 	{"map<string, enum as int>", Marshaler{EnumsAsInts: true}, &pb.Mappy{Enumy: map[string]pb.Numeral{"XIV": pb.Numeral_ROMAN}}, `{"enumy":{"XIV":2}}`}, | ||||
| 	{"map<int32, bool>", marshaler, &pb.Mappy{S32Booly: map[int32]bool{1: true, 3: false, 10: true, 12: false}}, `{"s32booly":{"1":true,"3":false,"10":true,"12":false}}`}, | ||||
| 	{"map<int64, bool>", marshaler, &pb.Mappy{S64Booly: map[int64]bool{1: true, 3: false, 10: true, 12: false}}, `{"s64booly":{"1":true,"3":false,"10":true,"12":false}}`}, | ||||
| 	{"map<uint32, bool>", marshaler, &pb.Mappy{U32Booly: map[uint32]bool{1: true, 3: false, 10: true, 12: false}}, `{"u32booly":{"1":true,"3":false,"10":true,"12":false}}`}, | ||||
| 	{"map<uint64, bool>", marshaler, &pb.Mappy{U64Booly: map[uint64]bool{1: true, 3: false, 10: true, 12: false}}, `{"u64booly":{"1":true,"3":false,"10":true,"12":false}}`}, | ||||
| 	{"proto2 map<int64, string>", marshaler, &pb.Maps{MInt64Str: map[int64]string{213: "cat"}}, | ||||
| 		`{"mInt64Str":{"213":"cat"}}`}, | ||||
| 	{"proto2 map<bool, Object>", marshaler, | ||||
| 		&pb.Maps{MBoolSimple: map[bool]*pb.Simple{true: &pb.Simple{OInt32: proto.Int32(1)}}}, | ||||
| 		`{"mBoolSimple":{"true":{"oInt32":1}}}`}, | ||||
| 	{"oneof, not set", marshaler, &pb.MsgWithOneof{}, `{}`}, | ||||
| 	{"oneof, set", marshaler, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_Title{"Grand Poobah"}}, `{"title":"Grand Poobah"}`}, | ||||
| 	{"force orig_name", Marshaler{OrigName: true}, &pb.Simple{OInt32: proto.Int32(4)}, | ||||
| 		`{"o_int32":4}`}, | ||||
| 	{"proto2 extension", marshaler, realNumber, realNumberJSON}, | ||||
| 	{"Any with message", marshaler, anySimple, anySimpleJSON}, | ||||
| 	{"Any with message and indent", marshalerAllOptions, anySimple, anySimplePrettyJSON}, | ||||
| 	{"Any with WKT", marshaler, anyWellKnown, anyWellKnownJSON}, | ||||
| 	{"Any with WKT and indent", marshalerAllOptions, anyWellKnown, anyWellKnownPrettyJSON}, | ||||
| 	{"Duration", marshaler, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: 3}}, `{"dur":"3.000s"}`}, | ||||
| 	{"Struct", marshaler, &pb.KnownTypes{St: &stpb.Struct{ | ||||
| 		Fields: map[string]*stpb.Value{ | ||||
| 			"one": &stpb.Value{Kind: &stpb.Value_StringValue{"loneliest number"}}, | ||||
| 			"two": &stpb.Value{Kind: &stpb.Value_NullValue{stpb.NullValue_NULL_VALUE}}, | ||||
| 		}, | ||||
| 	}}, `{"st":{"one":"loneliest number","two":null}}`}, | ||||
| 	{"Timestamp", marshaler, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: 14e8, Nanos: 21e6}}, `{"ts":"2014-05-13T16:53:20.021Z"}`}, | ||||
|  | ||||
| 	{"DoubleValue", marshaler, &pb.KnownTypes{Dbl: &wpb.DoubleValue{Value: 1.2}}, `{"dbl":1.2}`}, | ||||
| 	{"FloatValue", marshaler, &pb.KnownTypes{Flt: &wpb.FloatValue{Value: 1.2}}, `{"flt":1.2}`}, | ||||
| 	{"Int64Value", marshaler, &pb.KnownTypes{I64: &wpb.Int64Value{Value: -3}}, `{"i64":"-3"}`}, | ||||
| 	{"UInt64Value", marshaler, &pb.KnownTypes{U64: &wpb.UInt64Value{Value: 3}}, `{"u64":"3"}`}, | ||||
| 	{"Int32Value", marshaler, &pb.KnownTypes{I32: &wpb.Int32Value{Value: -4}}, `{"i32":-4}`}, | ||||
| 	{"UInt32Value", marshaler, &pb.KnownTypes{U32: &wpb.UInt32Value{Value: 4}}, `{"u32":4}`}, | ||||
| 	{"BoolValue", marshaler, &pb.KnownTypes{Bool: &wpb.BoolValue{Value: true}}, `{"bool":true}`}, | ||||
| 	{"StringValue", marshaler, &pb.KnownTypes{Str: &wpb.StringValue{Value: "plush"}}, `{"str":"plush"}`}, | ||||
| 	{"BytesValue", marshaler, &pb.KnownTypes{Bytes: &wpb.BytesValue{Value: []byte("wow")}}, `{"bytes":"d293"}`}, | ||||
| } | ||||
|  | ||||
| func TestMarshaling(t *testing.T) { | ||||
| 	for _, tt := range marshalingTests { | ||||
| 		json, err := tt.marshaler.MarshalToString(tt.pb) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("%s: marshaling error: %v", tt.desc, err) | ||||
| 		} else if tt.json != json { | ||||
| 			t.Errorf("%s: got [%v] want [%v]", tt.desc, json, tt.json) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var unmarshalingTests = []struct { | ||||
| 	desc        string | ||||
| 	unmarshaler Unmarshaler | ||||
| 	json        string | ||||
| 	pb          proto.Message | ||||
| }{ | ||||
| 	{"simple flat object", Unmarshaler{}, simpleObjectJSON, simpleObject}, | ||||
| 	{"simple pretty object", Unmarshaler{}, simpleObjectPrettyJSON, simpleObject}, | ||||
| 	{"repeated fields flat object", Unmarshaler{}, repeatsObjectJSON, repeatsObject}, | ||||
| 	{"repeated fields pretty object", Unmarshaler{}, repeatsObjectPrettyJSON, repeatsObject}, | ||||
| 	{"nested message/enum flat object", Unmarshaler{}, complexObjectJSON, complexObject}, | ||||
| 	{"nested message/enum pretty object", Unmarshaler{}, complexObjectPrettyJSON, complexObject}, | ||||
| 	{"enum-string object", Unmarshaler{}, `{"color":"BLUE"}`, &pb.Widget{Color: pb.Widget_BLUE.Enum()}}, | ||||
| 	{"enum-value object", Unmarshaler{}, "{\n \"color\": 2\n}", &pb.Widget{Color: pb.Widget_BLUE.Enum()}}, | ||||
| 	{"unknown field with allowed option", Unmarshaler{AllowUnknownFields: true}, `{"unknown": "foo"}`, new(pb.Simple)}, | ||||
| 	{"proto3 enum string", Unmarshaler{}, `{"hilarity":"PUNS"}`, &proto3pb.Message{Hilarity: proto3pb.Message_PUNS}}, | ||||
| 	{"proto3 enum value", Unmarshaler{}, `{"hilarity":1}`, &proto3pb.Message{Hilarity: proto3pb.Message_PUNS}}, | ||||
| 	{"unknown enum value object", | ||||
| 		Unmarshaler{}, | ||||
| 		"{\n  \"color\": 1000,\n  \"r_color\": [\n    \"RED\"\n  ]\n}", | ||||
| 		&pb.Widget{Color: pb.Widget_Color(1000).Enum(), RColor: []pb.Widget_Color{pb.Widget_RED}}}, | ||||
| 	{"repeated proto3 enum", Unmarshaler{}, `{"rFunny":["PUNS","SLAPSTICK"]}`, | ||||
| 		&proto3pb.Message{RFunny: []proto3pb.Message_Humour{ | ||||
| 			proto3pb.Message_PUNS, | ||||
| 			proto3pb.Message_SLAPSTICK, | ||||
| 		}}}, | ||||
| 	{"repeated proto3 enum as int", Unmarshaler{}, `{"rFunny":[1,2]}`, | ||||
| 		&proto3pb.Message{RFunny: []proto3pb.Message_Humour{ | ||||
| 			proto3pb.Message_PUNS, | ||||
| 			proto3pb.Message_SLAPSTICK, | ||||
| 		}}}, | ||||
| 	{"repeated proto3 enum as mix of strings and ints", Unmarshaler{}, `{"rFunny":["PUNS",2]}`, | ||||
| 		&proto3pb.Message{RFunny: []proto3pb.Message_Humour{ | ||||
| 			proto3pb.Message_PUNS, | ||||
| 			proto3pb.Message_SLAPSTICK, | ||||
| 		}}}, | ||||
| 	{"unquoted int64 object", Unmarshaler{}, `{"oInt64":-314}`, &pb.Simple{OInt64: proto.Int64(-314)}}, | ||||
| 	{"unquoted uint64 object", Unmarshaler{}, `{"oUint64":123}`, &pb.Simple{OUint64: proto.Uint64(123)}}, | ||||
| 	{"map<int64, int32>", Unmarshaler{}, `{"nummy":{"1":2,"3":4}}`, &pb.Mappy{Nummy: map[int64]int32{1: 2, 3: 4}}}, | ||||
| 	{"map<string, string>", Unmarshaler{}, `{"strry":{"\"one\"":"two","three":"four"}}`, &pb.Mappy{Strry: map[string]string{`"one"`: "two", "three": "four"}}}, | ||||
| 	{"map<int32, Object>", Unmarshaler{}, `{"objjy":{"1":{"dub":1}}}`, &pb.Mappy{Objjy: map[int32]*pb.Simple3{1: &pb.Simple3{Dub: 1}}}}, | ||||
| 	// TODO: This is broken. | ||||
| 	//{"map<string, enum>", Unmarshaler{}, `{"enumy":{"XIV":"ROMAN"}`, &pb.Mappy{Enumy: map[string]pb.Numeral{"XIV": pb.Numeral_ROMAN}}}, | ||||
| 	{"map<string, enum as int>", Unmarshaler{}, `{"enumy":{"XIV":2}}`, &pb.Mappy{Enumy: map[string]pb.Numeral{"XIV": pb.Numeral_ROMAN}}}, | ||||
| 	{"oneof", Unmarshaler{}, `{"salary":31000}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_Salary{31000}}}, | ||||
| 	{"oneof spec name", Unmarshaler{}, `{"Country":"Australia"}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_Country{"Australia"}}}, | ||||
| 	{"oneof orig_name", Unmarshaler{}, `{"Country":"Australia"}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_Country{"Australia"}}}, | ||||
| 	{"oneof spec name2", Unmarshaler{}, `{"homeAddress":"Australia"}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_HomeAddress{"Australia"}}}, | ||||
| 	{"oneof orig_name2", Unmarshaler{}, `{"home_address":"Australia"}`, &pb.MsgWithOneof{Union: &pb.MsgWithOneof_HomeAddress{"Australia"}}}, | ||||
| 	{"orig_name input", Unmarshaler{}, `{"o_bool":true}`, &pb.Simple{OBool: proto.Bool(true)}}, | ||||
| 	{"camelName input", Unmarshaler{}, `{"oBool":true}`, &pb.Simple{OBool: proto.Bool(true)}}, | ||||
|  | ||||
| 	{"Duration", Unmarshaler{}, `{"dur":"3.000s"}`, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: 3}}}, | ||||
| 	{"Timestamp", Unmarshaler{}, `{"ts":"2014-05-13T16:53:20.021Z"}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: 14e8, Nanos: 21e6}}}, | ||||
| 	{"PreEpochTimestamp", Unmarshaler{}, `{"ts":"1969-12-31T23:59:58.999999995Z"}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: -2, Nanos: 999999995}}}, | ||||
| 	{"ZeroTimeTimestamp", Unmarshaler{}, `{"ts":"0001-01-01T00:00:00Z"}`, &pb.KnownTypes{Ts: &tspb.Timestamp{Seconds: -62135596800, Nanos: 0}}}, | ||||
|  | ||||
| 	{"DoubleValue", Unmarshaler{}, `{"dbl":1.2}`, &pb.KnownTypes{Dbl: &wpb.DoubleValue{Value: 1.2}}}, | ||||
| 	{"FloatValue", Unmarshaler{}, `{"flt":1.2}`, &pb.KnownTypes{Flt: &wpb.FloatValue{Value: 1.2}}}, | ||||
| 	{"Int64Value", Unmarshaler{}, `{"i64":"-3"}`, &pb.KnownTypes{I64: &wpb.Int64Value{Value: -3}}}, | ||||
| 	{"UInt64Value", Unmarshaler{}, `{"u64":"3"}`, &pb.KnownTypes{U64: &wpb.UInt64Value{Value: 3}}}, | ||||
| 	{"Int32Value", Unmarshaler{}, `{"i32":-4}`, &pb.KnownTypes{I32: &wpb.Int32Value{Value: -4}}}, | ||||
| 	{"UInt32Value", Unmarshaler{}, `{"u32":4}`, &pb.KnownTypes{U32: &wpb.UInt32Value{Value: 4}}}, | ||||
| 	{"BoolValue", Unmarshaler{}, `{"bool":true}`, &pb.KnownTypes{Bool: &wpb.BoolValue{Value: true}}}, | ||||
| 	{"StringValue", Unmarshaler{}, `{"str":"plush"}`, &pb.KnownTypes{Str: &wpb.StringValue{Value: "plush"}}}, | ||||
| 	{"BytesValue", Unmarshaler{}, `{"bytes":"d293"}`, &pb.KnownTypes{Bytes: &wpb.BytesValue{Value: []byte("wow")}}}, | ||||
| 	// `null` is also a permissible value. Let's just test one. | ||||
| 	{"null DoubleValue", Unmarshaler{}, `{"dbl":null}`, &pb.KnownTypes{Dbl: &wpb.DoubleValue{}}}, | ||||
| } | ||||
|  | ||||
| func TestUnmarshaling(t *testing.T) { | ||||
| 	for _, tt := range unmarshalingTests { | ||||
| 		// Make a new instance of the type of our expected object. | ||||
| 		p := reflect.New(reflect.TypeOf(tt.pb).Elem()).Interface().(proto.Message) | ||||
|  | ||||
| 		err := tt.unmarshaler.Unmarshal(strings.NewReader(tt.json), p) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("%s: %v", tt.desc, err) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// For easier diffs, compare text strings of the protos. | ||||
| 		exp := proto.MarshalTextString(tt.pb) | ||||
| 		act := proto.MarshalTextString(p) | ||||
| 		if string(exp) != string(act) { | ||||
| 			t.Errorf("%s: got [%s] want [%s]", tt.desc, act, exp) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestUnmarshalNext(t *testing.T) { | ||||
| 	// We only need to check against a few, not all of them. | ||||
| 	tests := unmarshalingTests[:5] | ||||
|  | ||||
| 	// Create a buffer with many concatenated JSON objects. | ||||
| 	var b bytes.Buffer | ||||
| 	for _, tt := range tests { | ||||
| 		b.WriteString(tt.json) | ||||
| 	} | ||||
|  | ||||
| 	dec := json.NewDecoder(&b) | ||||
| 	for _, tt := range tests { | ||||
| 		// Make a new instance of the type of our expected object. | ||||
| 		p := reflect.New(reflect.TypeOf(tt.pb).Elem()).Interface().(proto.Message) | ||||
|  | ||||
| 		err := tt.unmarshaler.UnmarshalNext(dec, p) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("%s: %v", tt.desc, err) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// For easier diffs, compare text strings of the protos. | ||||
| 		exp := proto.MarshalTextString(tt.pb) | ||||
| 		act := proto.MarshalTextString(p) | ||||
| 		if string(exp) != string(act) { | ||||
| 			t.Errorf("%s: got [%s] want [%s]", tt.desc, act, exp) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	p := &pb.Simple{} | ||||
| 	err := new(Unmarshaler).UnmarshalNext(dec, p) | ||||
| 	if err != io.EOF { | ||||
| 		t.Errorf("eof: got %v, expected io.EOF", err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var unmarshalingShouldError = []struct { | ||||
| 	desc string | ||||
| 	in   string | ||||
| 	pb   proto.Message | ||||
| }{ | ||||
| 	{"a value", "666", new(pb.Simple)}, | ||||
| 	{"gibberish", "{adskja123;l23=-=", new(pb.Simple)}, | ||||
| 	{"unknown field", `{"unknown": "foo"}`, new(pb.Simple)}, | ||||
| 	{"unknown enum name", `{"hilarity":"DAVE"}`, new(proto3pb.Message)}, | ||||
| } | ||||
|  | ||||
| func TestUnmarshalingBadInput(t *testing.T) { | ||||
| 	for _, tt := range unmarshalingShouldError { | ||||
| 		err := UnmarshalString(tt.in, tt.pb) | ||||
| 		if err == nil { | ||||
| 			t.Errorf("an error was expected when parsing %q instead of an object", tt.desc) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										33
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| # Go support for Protocol Buffers - Google's data interchange format | ||||
| # | ||||
| # Copyright 2015 The Go Authors.  All rights reserved. | ||||
| # https://github.com/golang/protobuf | ||||
| # | ||||
| # 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. | ||||
|  | ||||
| regenerate: | ||||
| 	protoc --go_out=Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any,Mgoogle/protobuf/duration.proto=github.com/golang/protobuf/ptypes/duration,Mgoogle/protobuf/struct.proto=github.com/golang/protobuf/ptypes/struct,Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp,Mgoogle/protobuf/wrappers.proto=github.com/golang/protobuf/ptypes/wrappers:. *.proto | ||||
							
								
								
									
										200
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,200 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: more_test_objects.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| /* | ||||
| Package jsonpb is a generated protocol buffer package. | ||||
|  | ||||
| It is generated from these files: | ||||
| 	more_test_objects.proto | ||||
| 	test_objects.proto | ||||
|  | ||||
| It has these top-level messages: | ||||
| 	Simple3 | ||||
| 	Mappy | ||||
| 	Simple | ||||
| 	Repeats | ||||
| 	Widget | ||||
| 	Maps | ||||
| 	MsgWithOneof | ||||
| 	Real | ||||
| 	Complex | ||||
| 	KnownTypes | ||||
| */ | ||||
| package jsonpb | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import fmt "fmt" | ||||
| import math "math" | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = fmt.Errorf | ||||
| var _ = math.Inf | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the proto package it is being compiled against. | ||||
| // A compilation error at this line likely means your copy of the | ||||
| // proto package needs to be updated. | ||||
| const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package | ||||
|  | ||||
| type Numeral int32 | ||||
|  | ||||
| const ( | ||||
| 	Numeral_UNKNOWN Numeral = 0 | ||||
| 	Numeral_ARABIC  Numeral = 1 | ||||
| 	Numeral_ROMAN   Numeral = 2 | ||||
| ) | ||||
|  | ||||
| var Numeral_name = map[int32]string{ | ||||
| 	0: "UNKNOWN", | ||||
| 	1: "ARABIC", | ||||
| 	2: "ROMAN", | ||||
| } | ||||
| var Numeral_value = map[string]int32{ | ||||
| 	"UNKNOWN": 0, | ||||
| 	"ARABIC":  1, | ||||
| 	"ROMAN":   2, | ||||
| } | ||||
|  | ||||
| func (x Numeral) String() string { | ||||
| 	return proto.EnumName(Numeral_name, int32(x)) | ||||
| } | ||||
| func (Numeral) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } | ||||
|  | ||||
| type Simple3 struct { | ||||
| 	Dub float64 `protobuf:"fixed64,1,opt,name=dub" json:"dub,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *Simple3) Reset()                    { *m = Simple3{} } | ||||
| func (m *Simple3) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Simple3) ProtoMessage()               {} | ||||
| func (*Simple3) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } | ||||
|  | ||||
| type Mappy struct { | ||||
| 	Nummy    map[int64]int32    `protobuf:"bytes,1,rep,name=nummy" json:"nummy,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` | ||||
| 	Strry    map[string]string  `protobuf:"bytes,2,rep,name=strry" json:"strry,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` | ||||
| 	Objjy    map[int32]*Simple3 `protobuf:"bytes,3,rep,name=objjy" json:"objjy,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` | ||||
| 	Buggy    map[int64]string   `protobuf:"bytes,4,rep,name=buggy" json:"buggy,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` | ||||
| 	Booly    map[bool]bool      `protobuf:"bytes,5,rep,name=booly" json:"booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` | ||||
| 	Enumy    map[string]Numeral `protobuf:"bytes,6,rep,name=enumy" json:"enumy,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value,enum=jsonpb.Numeral"` | ||||
| 	S32Booly map[int32]bool     `protobuf:"bytes,7,rep,name=s32booly" json:"s32booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` | ||||
| 	S64Booly map[int64]bool     `protobuf:"bytes,8,rep,name=s64booly" json:"s64booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` | ||||
| 	U32Booly map[uint32]bool    `protobuf:"bytes,9,rep,name=u32booly" json:"u32booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` | ||||
| 	U64Booly map[uint64]bool    `protobuf:"bytes,10,rep,name=u64booly" json:"u64booly,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"` | ||||
| } | ||||
|  | ||||
| func (m *Mappy) Reset()                    { *m = Mappy{} } | ||||
| func (m *Mappy) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Mappy) ProtoMessage()               {} | ||||
| func (*Mappy) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } | ||||
|  | ||||
| func (m *Mappy) GetNummy() map[int64]int32 { | ||||
| 	if m != nil { | ||||
| 		return m.Nummy | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Mappy) GetStrry() map[string]string { | ||||
| 	if m != nil { | ||||
| 		return m.Strry | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Mappy) GetObjjy() map[int32]*Simple3 { | ||||
| 	if m != nil { | ||||
| 		return m.Objjy | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Mappy) GetBuggy() map[int64]string { | ||||
| 	if m != nil { | ||||
| 		return m.Buggy | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Mappy) GetBooly() map[bool]bool { | ||||
| 	if m != nil { | ||||
| 		return m.Booly | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Mappy) GetEnumy() map[string]Numeral { | ||||
| 	if m != nil { | ||||
| 		return m.Enumy | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Mappy) GetS32Booly() map[int32]bool { | ||||
| 	if m != nil { | ||||
| 		return m.S32Booly | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Mappy) GetS64Booly() map[int64]bool { | ||||
| 	if m != nil { | ||||
| 		return m.S64Booly | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Mappy) GetU32Booly() map[uint32]bool { | ||||
| 	if m != nil { | ||||
| 		return m.U32Booly | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Mappy) GetU64Booly() map[uint64]bool { | ||||
| 	if m != nil { | ||||
| 		return m.U64Booly | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterType((*Simple3)(nil), "jsonpb.Simple3") | ||||
| 	proto.RegisterType((*Mappy)(nil), "jsonpb.Mappy") | ||||
| 	proto.RegisterEnum("jsonpb.Numeral", Numeral_name, Numeral_value) | ||||
| } | ||||
|  | ||||
| func init() { proto.RegisterFile("more_test_objects.proto", fileDescriptor0) } | ||||
|  | ||||
| var fileDescriptor0 = []byte{ | ||||
| 	// 444 bytes of a gzipped FileDescriptorProto | ||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x94, 0xc1, 0x6b, 0xdb, 0x30, | ||||
| 	0x14, 0x87, 0xe7, 0xa4, 0x4e, 0xec, 0x17, 0xba, 0x19, 0x31, 0x98, 0x58, 0x2f, 0xa1, 0x30, 0x08, | ||||
| 	0x83, 0xf9, 0x90, 0x8c, 0xad, 0x6c, 0xa7, 0x74, 0xf4, 0x50, 0x46, 0x1d, 0x70, 0x09, 0x3b, 0x96, | ||||
| 	0x78, 0x13, 0x65, 0x9e, 0x6d, 0x19, 0xdb, 0x1a, 0xe8, 0x8f, 0x1f, 0x8c, 0x27, 0xcb, 0xb5, 0x6c, | ||||
| 	0x14, 0xd2, 0x9b, 0xcc, 0xef, 0xfb, 0xf2, 0x9e, 0xf4, 0x1e, 0x81, 0x37, 0x39, 0xaf, 0xd8, 0x43, | ||||
| 	0xc3, 0xea, 0xe6, 0x81, 0x27, 0x29, 0xfb, 0xd9, 0xd4, 0x61, 0x59, 0xf1, 0x86, 0x93, 0x59, 0x5a, | ||||
| 	0xf3, 0xa2, 0x4c, 0x2e, 0x2f, 0x60, 0x7e, 0xff, 0x3b, 0x2f, 0x33, 0xb6, 0x21, 0x01, 0x4c, 0x7f, | ||||
| 	0x89, 0x84, 0x3a, 0x4b, 0x67, 0xe5, 0xc4, 0x78, 0xbc, 0xfc, 0xe7, 0x81, 0x7b, 0x77, 0x28, 0x4b, | ||||
| 	0x49, 0x42, 0x70, 0x0b, 0x91, 0xe7, 0x92, 0x3a, 0xcb, 0xe9, 0x6a, 0xb1, 0xa6, 0x61, 0xab, 0x87, | ||||
| 	0x2a, 0x0d, 0x23, 0x8c, 0x6e, 0x8a, 0xa6, 0x92, 0x71, 0x8b, 0x21, 0x5f, 0x37, 0x55, 0x25, 0xe9, | ||||
| 	0xc4, 0xc6, 0xdf, 0x63, 0xa4, 0x79, 0x85, 0x21, 0xcf, 0x93, 0x34, 0x95, 0x74, 0x6a, 0xe3, 0x77, | ||||
| 	0x18, 0x69, 0x5e, 0x61, 0xc8, 0x27, 0xe2, 0xf1, 0x51, 0xd2, 0x33, 0x1b, 0x7f, 0x8d, 0x91, 0xe6, | ||||
| 	0x15, 0xa6, 0x78, 0xce, 0x33, 0x49, 0x5d, 0x2b, 0x8f, 0x51, 0xc7, 0xe3, 0x19, 0x79, 0x56, 0x88, | ||||
| 	0x5c, 0xd2, 0x99, 0x8d, 0xbf, 0xc1, 0x48, 0xf3, 0x0a, 0x23, 0x9f, 0xc1, 0xab, 0x37, 0xeb, 0xb6, | ||||
| 	0xc4, 0x5c, 0x29, 0x17, 0xa3, 0x2b, 0xeb, 0xb4, 0xb5, 0x9e, 0x60, 0x25, 0x7e, 0xfa, 0xd8, 0x8a, | ||||
| 	0x9e, 0x55, 0xd4, 0x69, 0x27, 0xea, 0x4f, 0x14, 0x45, 0x57, 0xd1, 0xb7, 0x89, 0xfb, 0x61, 0x45, | ||||
| 	0x61, 0x54, 0x14, 0x5d, 0x45, 0xb0, 0x8a, 0xc3, 0x8a, 0x1d, 0xfc, 0xf6, 0x0a, 0xa0, 0x1f, 0x34, | ||||
| 	0x6e, 0xcb, 0x1f, 0x26, 0xd5, 0xb6, 0x4c, 0x63, 0x3c, 0x92, 0xd7, 0xe0, 0xfe, 0x3d, 0x64, 0x82, | ||||
| 	0xd1, 0xc9, 0xd2, 0x59, 0xb9, 0x71, 0xfb, 0xf1, 0x65, 0x72, 0xe5, 0xa0, 0xd9, 0x8f, 0xdc, 0x34, | ||||
| 	0x7d, 0x8b, 0xe9, 0x9b, 0xe6, 0x2d, 0x40, 0x3f, 0x7c, 0xd3, 0x74, 0x5b, 0xf3, 0x9d, 0x69, 0x2e, | ||||
| 	0xd6, 0xaf, 0xba, 0x9b, 0xe8, 0x9d, 0x1e, 0x35, 0xd1, 0xef, 0xc5, 0xa9, 0xf6, 0xfd, 0xb1, 0xf9, | ||||
| 	0xf4, 0x20, 0xa6, 0xe9, 0x59, 0x4c, 0x6f, 0xd4, 0x7e, 0xbf, 0x2b, 0x96, 0x8b, 0x0f, 0xda, 0x7f, | ||||
| 	0xd9, 0xb7, 0x1f, 0x89, 0x9c, 0x55, 0x87, 0xcc, 0xfc, 0xa9, 0xaf, 0x70, 0x3e, 0xd8, 0x21, 0xcb, | ||||
| 	0x63, 0x1c, 0xef, 0x03, 0x65, 0x73, 0xaa, 0xa7, 0xae, 0x3f, 0x96, 0xf7, 0xc7, 0x2a, 0x9f, 0x3f, | ||||
| 	0x47, 0x3e, 0x56, 0xf9, 0xec, 0x84, 0xfc, 0xfe, 0x03, 0xcc, 0xf5, 0x4b, 0x90, 0x05, 0xcc, 0xf7, | ||||
| 	0xd1, 0xf7, 0x68, 0xf7, 0x23, 0x0a, 0x5e, 0x10, 0x80, 0xd9, 0x36, 0xde, 0x5e, 0xdf, 0x7e, 0x0b, | ||||
| 	0x1c, 0xe2, 0x83, 0x1b, 0xef, 0xee, 0xb6, 0x51, 0x30, 0x49, 0x66, 0xea, 0xaf, 0x6d, 0xf3, 0x3f, | ||||
| 	0x00, 0x00, 0xff, 0xff, 0xa2, 0x4b, 0xe1, 0x77, 0xf5, 0x04, 0x00, 0x00, | ||||
| } | ||||
							
								
								
									
										57
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/more_test_objects.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2015 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto3"; | ||||
|  | ||||
| package jsonpb; | ||||
|  | ||||
| message Simple3 { | ||||
|   double dub = 1; | ||||
| } | ||||
|  | ||||
| enum Numeral { | ||||
|   UNKNOWN = 0; | ||||
|   ARABIC = 1; | ||||
|   ROMAN = 2; | ||||
| } | ||||
|  | ||||
| message Mappy { | ||||
|   map<int64, int32> nummy = 1; | ||||
|   map<string, string> strry = 2; | ||||
|   map<int32, Simple3> objjy = 3; | ||||
|   map<int64, string> buggy = 4; | ||||
|   map<bool, bool> booly = 5; | ||||
|   map<string, Numeral> enumy = 6; | ||||
|   map<int32, bool> s32booly = 7; | ||||
|   map<int64, bool> s64booly = 8; | ||||
|   map<uint32, bool> u32booly = 9; | ||||
|   map<uint64, bool> u64booly = 10; | ||||
| } | ||||
							
								
								
									
										769
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										769
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,769 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: test_objects.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| package jsonpb | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import fmt "fmt" | ||||
| import math "math" | ||||
| import google_protobuf "github.com/golang/protobuf/ptypes/any" | ||||
| import google_protobuf1 "github.com/golang/protobuf/ptypes/duration" | ||||
| import google_protobuf2 "github.com/golang/protobuf/ptypes/struct" | ||||
| import google_protobuf3 "github.com/golang/protobuf/ptypes/timestamp" | ||||
| import google_protobuf4 "github.com/golang/protobuf/ptypes/wrappers" | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = fmt.Errorf | ||||
| var _ = math.Inf | ||||
|  | ||||
| type Widget_Color int32 | ||||
|  | ||||
| const ( | ||||
| 	Widget_RED   Widget_Color = 0 | ||||
| 	Widget_GREEN Widget_Color = 1 | ||||
| 	Widget_BLUE  Widget_Color = 2 | ||||
| ) | ||||
|  | ||||
| var Widget_Color_name = map[int32]string{ | ||||
| 	0: "RED", | ||||
| 	1: "GREEN", | ||||
| 	2: "BLUE", | ||||
| } | ||||
| var Widget_Color_value = map[string]int32{ | ||||
| 	"RED":   0, | ||||
| 	"GREEN": 1, | ||||
| 	"BLUE":  2, | ||||
| } | ||||
|  | ||||
| func (x Widget_Color) Enum() *Widget_Color { | ||||
| 	p := new(Widget_Color) | ||||
| 	*p = x | ||||
| 	return p | ||||
| } | ||||
| func (x Widget_Color) String() string { | ||||
| 	return proto.EnumName(Widget_Color_name, int32(x)) | ||||
| } | ||||
| func (x *Widget_Color) UnmarshalJSON(data []byte) error { | ||||
| 	value, err := proto.UnmarshalJSONEnum(Widget_Color_value, data, "Widget_Color") | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*x = Widget_Color(value) | ||||
| 	return nil | ||||
| } | ||||
| func (Widget_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptor1, []int{2, 0} } | ||||
|  | ||||
| // Test message for holding primitive types. | ||||
| type Simple struct { | ||||
| 	OBool            *bool    `protobuf:"varint,1,opt,name=o_bool,json=oBool" json:"o_bool,omitempty"` | ||||
| 	OInt32           *int32   `protobuf:"varint,2,opt,name=o_int32,json=oInt32" json:"o_int32,omitempty"` | ||||
| 	OInt64           *int64   `protobuf:"varint,3,opt,name=o_int64,json=oInt64" json:"o_int64,omitempty"` | ||||
| 	OUint32          *uint32  `protobuf:"varint,4,opt,name=o_uint32,json=oUint32" json:"o_uint32,omitempty"` | ||||
| 	OUint64          *uint64  `protobuf:"varint,5,opt,name=o_uint64,json=oUint64" json:"o_uint64,omitempty"` | ||||
| 	OSint32          *int32   `protobuf:"zigzag32,6,opt,name=o_sint32,json=oSint32" json:"o_sint32,omitempty"` | ||||
| 	OSint64          *int64   `protobuf:"zigzag64,7,opt,name=o_sint64,json=oSint64" json:"o_sint64,omitempty"` | ||||
| 	OFloat           *float32 `protobuf:"fixed32,8,opt,name=o_float,json=oFloat" json:"o_float,omitempty"` | ||||
| 	ODouble          *float64 `protobuf:"fixed64,9,opt,name=o_double,json=oDouble" json:"o_double,omitempty"` | ||||
| 	OString          *string  `protobuf:"bytes,10,opt,name=o_string,json=oString" json:"o_string,omitempty"` | ||||
| 	OBytes           []byte   `protobuf:"bytes,11,opt,name=o_bytes,json=oBytes" json:"o_bytes,omitempty"` | ||||
| 	XXX_unrecognized []byte   `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Simple) Reset()                    { *m = Simple{} } | ||||
| func (m *Simple) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Simple) ProtoMessage()               {} | ||||
| func (*Simple) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{0} } | ||||
|  | ||||
| func (m *Simple) GetOBool() bool { | ||||
| 	if m != nil && m.OBool != nil { | ||||
| 		return *m.OBool | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (m *Simple) GetOInt32() int32 { | ||||
| 	if m != nil && m.OInt32 != nil { | ||||
| 		return *m.OInt32 | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Simple) GetOInt64() int64 { | ||||
| 	if m != nil && m.OInt64 != nil { | ||||
| 		return *m.OInt64 | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Simple) GetOUint32() uint32 { | ||||
| 	if m != nil && m.OUint32 != nil { | ||||
| 		return *m.OUint32 | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Simple) GetOUint64() uint64 { | ||||
| 	if m != nil && m.OUint64 != nil { | ||||
| 		return *m.OUint64 | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Simple) GetOSint32() int32 { | ||||
| 	if m != nil && m.OSint32 != nil { | ||||
| 		return *m.OSint32 | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Simple) GetOSint64() int64 { | ||||
| 	if m != nil && m.OSint64 != nil { | ||||
| 		return *m.OSint64 | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Simple) GetOFloat() float32 { | ||||
| 	if m != nil && m.OFloat != nil { | ||||
| 		return *m.OFloat | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Simple) GetODouble() float64 { | ||||
| 	if m != nil && m.ODouble != nil { | ||||
| 		return *m.ODouble | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Simple) GetOString() string { | ||||
| 	if m != nil && m.OString != nil { | ||||
| 		return *m.OString | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *Simple) GetOBytes() []byte { | ||||
| 	if m != nil { | ||||
| 		return m.OBytes | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Test message for holding repeated primitives. | ||||
| type Repeats struct { | ||||
| 	RBool            []bool    `protobuf:"varint,1,rep,name=r_bool,json=rBool" json:"r_bool,omitempty"` | ||||
| 	RInt32           []int32   `protobuf:"varint,2,rep,name=r_int32,json=rInt32" json:"r_int32,omitempty"` | ||||
| 	RInt64           []int64   `protobuf:"varint,3,rep,name=r_int64,json=rInt64" json:"r_int64,omitempty"` | ||||
| 	RUint32          []uint32  `protobuf:"varint,4,rep,name=r_uint32,json=rUint32" json:"r_uint32,omitempty"` | ||||
| 	RUint64          []uint64  `protobuf:"varint,5,rep,name=r_uint64,json=rUint64" json:"r_uint64,omitempty"` | ||||
| 	RSint32          []int32   `protobuf:"zigzag32,6,rep,name=r_sint32,json=rSint32" json:"r_sint32,omitempty"` | ||||
| 	RSint64          []int64   `protobuf:"zigzag64,7,rep,name=r_sint64,json=rSint64" json:"r_sint64,omitempty"` | ||||
| 	RFloat           []float32 `protobuf:"fixed32,8,rep,name=r_float,json=rFloat" json:"r_float,omitempty"` | ||||
| 	RDouble          []float64 `protobuf:"fixed64,9,rep,name=r_double,json=rDouble" json:"r_double,omitempty"` | ||||
| 	RString          []string  `protobuf:"bytes,10,rep,name=r_string,json=rString" json:"r_string,omitempty"` | ||||
| 	RBytes           [][]byte  `protobuf:"bytes,11,rep,name=r_bytes,json=rBytes" json:"r_bytes,omitempty"` | ||||
| 	XXX_unrecognized []byte    `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Repeats) Reset()                    { *m = Repeats{} } | ||||
| func (m *Repeats) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Repeats) ProtoMessage()               {} | ||||
| func (*Repeats) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{1} } | ||||
|  | ||||
| func (m *Repeats) GetRBool() []bool { | ||||
| 	if m != nil { | ||||
| 		return m.RBool | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Repeats) GetRInt32() []int32 { | ||||
| 	if m != nil { | ||||
| 		return m.RInt32 | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Repeats) GetRInt64() []int64 { | ||||
| 	if m != nil { | ||||
| 		return m.RInt64 | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Repeats) GetRUint32() []uint32 { | ||||
| 	if m != nil { | ||||
| 		return m.RUint32 | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Repeats) GetRUint64() []uint64 { | ||||
| 	if m != nil { | ||||
| 		return m.RUint64 | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Repeats) GetRSint32() []int32 { | ||||
| 	if m != nil { | ||||
| 		return m.RSint32 | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Repeats) GetRSint64() []int64 { | ||||
| 	if m != nil { | ||||
| 		return m.RSint64 | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Repeats) GetRFloat() []float32 { | ||||
| 	if m != nil { | ||||
| 		return m.RFloat | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Repeats) GetRDouble() []float64 { | ||||
| 	if m != nil { | ||||
| 		return m.RDouble | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Repeats) GetRString() []string { | ||||
| 	if m != nil { | ||||
| 		return m.RString | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Repeats) GetRBytes() [][]byte { | ||||
| 	if m != nil { | ||||
| 		return m.RBytes | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Test message for holding enums and nested messages. | ||||
| type Widget struct { | ||||
| 	Color            *Widget_Color  `protobuf:"varint,1,opt,name=color,enum=jsonpb.Widget_Color" json:"color,omitempty"` | ||||
| 	RColor           []Widget_Color `protobuf:"varint,2,rep,name=r_color,json=rColor,enum=jsonpb.Widget_Color" json:"r_color,omitempty"` | ||||
| 	Simple           *Simple        `protobuf:"bytes,10,opt,name=simple" json:"simple,omitempty"` | ||||
| 	RSimple          []*Simple      `protobuf:"bytes,11,rep,name=r_simple,json=rSimple" json:"r_simple,omitempty"` | ||||
| 	Repeats          *Repeats       `protobuf:"bytes,20,opt,name=repeats" json:"repeats,omitempty"` | ||||
| 	RRepeats         []*Repeats     `protobuf:"bytes,21,rep,name=r_repeats,json=rRepeats" json:"r_repeats,omitempty"` | ||||
| 	XXX_unrecognized []byte         `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Widget) Reset()                    { *m = Widget{} } | ||||
| func (m *Widget) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Widget) ProtoMessage()               {} | ||||
| func (*Widget) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{2} } | ||||
|  | ||||
| func (m *Widget) GetColor() Widget_Color { | ||||
| 	if m != nil && m.Color != nil { | ||||
| 		return *m.Color | ||||
| 	} | ||||
| 	return Widget_RED | ||||
| } | ||||
|  | ||||
| func (m *Widget) GetRColor() []Widget_Color { | ||||
| 	if m != nil { | ||||
| 		return m.RColor | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Widget) GetSimple() *Simple { | ||||
| 	if m != nil { | ||||
| 		return m.Simple | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Widget) GetRSimple() []*Simple { | ||||
| 	if m != nil { | ||||
| 		return m.RSimple | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Widget) GetRepeats() *Repeats { | ||||
| 	if m != nil { | ||||
| 		return m.Repeats | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Widget) GetRRepeats() []*Repeats { | ||||
| 	if m != nil { | ||||
| 		return m.RRepeats | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type Maps struct { | ||||
| 	MInt64Str        map[int64]string `protobuf:"bytes,1,rep,name=m_int64_str,json=mInt64Str" json:"m_int64_str,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` | ||||
| 	MBoolSimple      map[bool]*Simple `protobuf:"bytes,2,rep,name=m_bool_simple,json=mBoolSimple" json:"m_bool_simple,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` | ||||
| 	XXX_unrecognized []byte           `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Maps) Reset()                    { *m = Maps{} } | ||||
| func (m *Maps) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Maps) ProtoMessage()               {} | ||||
| func (*Maps) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{3} } | ||||
|  | ||||
| func (m *Maps) GetMInt64Str() map[int64]string { | ||||
| 	if m != nil { | ||||
| 		return m.MInt64Str | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Maps) GetMBoolSimple() map[bool]*Simple { | ||||
| 	if m != nil { | ||||
| 		return m.MBoolSimple | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type MsgWithOneof struct { | ||||
| 	// Types that are valid to be assigned to Union: | ||||
| 	//	*MsgWithOneof_Title | ||||
| 	//	*MsgWithOneof_Salary | ||||
| 	//	*MsgWithOneof_Country | ||||
| 	//	*MsgWithOneof_HomeAddress | ||||
| 	Union            isMsgWithOneof_Union `protobuf_oneof:"union"` | ||||
| 	XXX_unrecognized []byte               `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *MsgWithOneof) Reset()                    { *m = MsgWithOneof{} } | ||||
| func (m *MsgWithOneof) String() string            { return proto.CompactTextString(m) } | ||||
| func (*MsgWithOneof) ProtoMessage()               {} | ||||
| func (*MsgWithOneof) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{4} } | ||||
|  | ||||
| type isMsgWithOneof_Union interface { | ||||
| 	isMsgWithOneof_Union() | ||||
| } | ||||
|  | ||||
| type MsgWithOneof_Title struct { | ||||
| 	Title string `protobuf:"bytes,1,opt,name=title,oneof"` | ||||
| } | ||||
| type MsgWithOneof_Salary struct { | ||||
| 	Salary int64 `protobuf:"varint,2,opt,name=salary,oneof"` | ||||
| } | ||||
| type MsgWithOneof_Country struct { | ||||
| 	Country string `protobuf:"bytes,3,opt,name=Country,json=country,oneof"` | ||||
| } | ||||
| type MsgWithOneof_HomeAddress struct { | ||||
| 	HomeAddress string `protobuf:"bytes,4,opt,name=home_address,json=homeAddress,oneof"` | ||||
| } | ||||
|  | ||||
| func (*MsgWithOneof_Title) isMsgWithOneof_Union()       {} | ||||
| func (*MsgWithOneof_Salary) isMsgWithOneof_Union()      {} | ||||
| func (*MsgWithOneof_Country) isMsgWithOneof_Union()     {} | ||||
| func (*MsgWithOneof_HomeAddress) isMsgWithOneof_Union() {} | ||||
|  | ||||
| func (m *MsgWithOneof) GetUnion() isMsgWithOneof_Union { | ||||
| 	if m != nil { | ||||
| 		return m.Union | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *MsgWithOneof) GetTitle() string { | ||||
| 	if x, ok := m.GetUnion().(*MsgWithOneof_Title); ok { | ||||
| 		return x.Title | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *MsgWithOneof) GetSalary() int64 { | ||||
| 	if x, ok := m.GetUnion().(*MsgWithOneof_Salary); ok { | ||||
| 		return x.Salary | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *MsgWithOneof) GetCountry() string { | ||||
| 	if x, ok := m.GetUnion().(*MsgWithOneof_Country); ok { | ||||
| 		return x.Country | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *MsgWithOneof) GetHomeAddress() string { | ||||
| 	if x, ok := m.GetUnion().(*MsgWithOneof_HomeAddress); ok { | ||||
| 		return x.HomeAddress | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| // XXX_OneofFuncs is for the internal use of the proto package. | ||||
| func (*MsgWithOneof) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { | ||||
| 	return _MsgWithOneof_OneofMarshaler, _MsgWithOneof_OneofUnmarshaler, _MsgWithOneof_OneofSizer, []interface{}{ | ||||
| 		(*MsgWithOneof_Title)(nil), | ||||
| 		(*MsgWithOneof_Salary)(nil), | ||||
| 		(*MsgWithOneof_Country)(nil), | ||||
| 		(*MsgWithOneof_HomeAddress)(nil), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func _MsgWithOneof_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { | ||||
| 	m := msg.(*MsgWithOneof) | ||||
| 	// union | ||||
| 	switch x := m.Union.(type) { | ||||
| 	case *MsgWithOneof_Title: | ||||
| 		b.EncodeVarint(1<<3 | proto.WireBytes) | ||||
| 		b.EncodeStringBytes(x.Title) | ||||
| 	case *MsgWithOneof_Salary: | ||||
| 		b.EncodeVarint(2<<3 | proto.WireVarint) | ||||
| 		b.EncodeVarint(uint64(x.Salary)) | ||||
| 	case *MsgWithOneof_Country: | ||||
| 		b.EncodeVarint(3<<3 | proto.WireBytes) | ||||
| 		b.EncodeStringBytes(x.Country) | ||||
| 	case *MsgWithOneof_HomeAddress: | ||||
| 		b.EncodeVarint(4<<3 | proto.WireBytes) | ||||
| 		b.EncodeStringBytes(x.HomeAddress) | ||||
| 	case nil: | ||||
| 	default: | ||||
| 		return fmt.Errorf("MsgWithOneof.Union has unexpected type %T", x) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func _MsgWithOneof_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { | ||||
| 	m := msg.(*MsgWithOneof) | ||||
| 	switch tag { | ||||
| 	case 1: // union.title | ||||
| 		if wire != proto.WireBytes { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeStringBytes() | ||||
| 		m.Union = &MsgWithOneof_Title{x} | ||||
| 		return true, err | ||||
| 	case 2: // union.salary | ||||
| 		if wire != proto.WireVarint { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeVarint() | ||||
| 		m.Union = &MsgWithOneof_Salary{int64(x)} | ||||
| 		return true, err | ||||
| 	case 3: // union.Country | ||||
| 		if wire != proto.WireBytes { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeStringBytes() | ||||
| 		m.Union = &MsgWithOneof_Country{x} | ||||
| 		return true, err | ||||
| 	case 4: // union.home_address | ||||
| 		if wire != proto.WireBytes { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeStringBytes() | ||||
| 		m.Union = &MsgWithOneof_HomeAddress{x} | ||||
| 		return true, err | ||||
| 	default: | ||||
| 		return false, nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func _MsgWithOneof_OneofSizer(msg proto.Message) (n int) { | ||||
| 	m := msg.(*MsgWithOneof) | ||||
| 	// union | ||||
| 	switch x := m.Union.(type) { | ||||
| 	case *MsgWithOneof_Title: | ||||
| 		n += proto.SizeVarint(1<<3 | proto.WireBytes) | ||||
| 		n += proto.SizeVarint(uint64(len(x.Title))) | ||||
| 		n += len(x.Title) | ||||
| 	case *MsgWithOneof_Salary: | ||||
| 		n += proto.SizeVarint(2<<3 | proto.WireVarint) | ||||
| 		n += proto.SizeVarint(uint64(x.Salary)) | ||||
| 	case *MsgWithOneof_Country: | ||||
| 		n += proto.SizeVarint(3<<3 | proto.WireBytes) | ||||
| 		n += proto.SizeVarint(uint64(len(x.Country))) | ||||
| 		n += len(x.Country) | ||||
| 	case *MsgWithOneof_HomeAddress: | ||||
| 		n += proto.SizeVarint(4<<3 | proto.WireBytes) | ||||
| 		n += proto.SizeVarint(uint64(len(x.HomeAddress))) | ||||
| 		n += len(x.HomeAddress) | ||||
| 	case nil: | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| type Real struct { | ||||
| 	Value                        *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` | ||||
| 	proto.XXX_InternalExtensions `json:"-"` | ||||
| 	XXX_unrecognized             []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Real) Reset()                    { *m = Real{} } | ||||
| func (m *Real) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Real) ProtoMessage()               {} | ||||
| func (*Real) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{5} } | ||||
|  | ||||
| var extRange_Real = []proto.ExtensionRange{ | ||||
| 	{100, 536870911}, | ||||
| } | ||||
|  | ||||
| func (*Real) ExtensionRangeArray() []proto.ExtensionRange { | ||||
| 	return extRange_Real | ||||
| } | ||||
|  | ||||
| func (m *Real) GetValue() float64 { | ||||
| 	if m != nil && m.Value != nil { | ||||
| 		return *m.Value | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| type Complex struct { | ||||
| 	Imaginary                    *float64 `protobuf:"fixed64,1,opt,name=imaginary" json:"imaginary,omitempty"` | ||||
| 	proto.XXX_InternalExtensions `json:"-"` | ||||
| 	XXX_unrecognized             []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Complex) Reset()                    { *m = Complex{} } | ||||
| func (m *Complex) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Complex) ProtoMessage()               {} | ||||
| func (*Complex) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{6} } | ||||
|  | ||||
| var extRange_Complex = []proto.ExtensionRange{ | ||||
| 	{100, 536870911}, | ||||
| } | ||||
|  | ||||
| func (*Complex) ExtensionRangeArray() []proto.ExtensionRange { | ||||
| 	return extRange_Complex | ||||
| } | ||||
|  | ||||
| func (m *Complex) GetImaginary() float64 { | ||||
| 	if m != nil && m.Imaginary != nil { | ||||
| 		return *m.Imaginary | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| var E_Complex_RealExtension = &proto.ExtensionDesc{ | ||||
| 	ExtendedType:  (*Real)(nil), | ||||
| 	ExtensionType: (*Complex)(nil), | ||||
| 	Field:         123, | ||||
| 	Name:          "jsonpb.Complex.real_extension", | ||||
| 	Tag:           "bytes,123,opt,name=real_extension,json=realExtension", | ||||
| } | ||||
|  | ||||
| type KnownTypes struct { | ||||
| 	An               *google_protobuf.Any          `protobuf:"bytes,14,opt,name=an" json:"an,omitempty"` | ||||
| 	Dur              *google_protobuf1.Duration    `protobuf:"bytes,1,opt,name=dur" json:"dur,omitempty"` | ||||
| 	St               *google_protobuf2.Struct      `protobuf:"bytes,12,opt,name=st" json:"st,omitempty"` | ||||
| 	Ts               *google_protobuf3.Timestamp   `protobuf:"bytes,2,opt,name=ts" json:"ts,omitempty"` | ||||
| 	Dbl              *google_protobuf4.DoubleValue `protobuf:"bytes,3,opt,name=dbl" json:"dbl,omitempty"` | ||||
| 	Flt              *google_protobuf4.FloatValue  `protobuf:"bytes,4,opt,name=flt" json:"flt,omitempty"` | ||||
| 	I64              *google_protobuf4.Int64Value  `protobuf:"bytes,5,opt,name=i64" json:"i64,omitempty"` | ||||
| 	U64              *google_protobuf4.UInt64Value `protobuf:"bytes,6,opt,name=u64" json:"u64,omitempty"` | ||||
| 	I32              *google_protobuf4.Int32Value  `protobuf:"bytes,7,opt,name=i32" json:"i32,omitempty"` | ||||
| 	U32              *google_protobuf4.UInt32Value `protobuf:"bytes,8,opt,name=u32" json:"u32,omitempty"` | ||||
| 	Bool             *google_protobuf4.BoolValue   `protobuf:"bytes,9,opt,name=bool" json:"bool,omitempty"` | ||||
| 	Str              *google_protobuf4.StringValue `protobuf:"bytes,10,opt,name=str" json:"str,omitempty"` | ||||
| 	Bytes            *google_protobuf4.BytesValue  `protobuf:"bytes,11,opt,name=bytes" json:"bytes,omitempty"` | ||||
| 	XXX_unrecognized []byte                        `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *KnownTypes) Reset()                    { *m = KnownTypes{} } | ||||
| func (m *KnownTypes) String() string            { return proto.CompactTextString(m) } | ||||
| func (*KnownTypes) ProtoMessage()               {} | ||||
| func (*KnownTypes) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{7} } | ||||
|  | ||||
| func (m *KnownTypes) GetAn() *google_protobuf.Any { | ||||
| 	if m != nil { | ||||
| 		return m.An | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *KnownTypes) GetDur() *google_protobuf1.Duration { | ||||
| 	if m != nil { | ||||
| 		return m.Dur | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *KnownTypes) GetSt() *google_protobuf2.Struct { | ||||
| 	if m != nil { | ||||
| 		return m.St | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *KnownTypes) GetTs() *google_protobuf3.Timestamp { | ||||
| 	if m != nil { | ||||
| 		return m.Ts | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *KnownTypes) GetDbl() *google_protobuf4.DoubleValue { | ||||
| 	if m != nil { | ||||
| 		return m.Dbl | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *KnownTypes) GetFlt() *google_protobuf4.FloatValue { | ||||
| 	if m != nil { | ||||
| 		return m.Flt | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *KnownTypes) GetI64() *google_protobuf4.Int64Value { | ||||
| 	if m != nil { | ||||
| 		return m.I64 | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *KnownTypes) GetU64() *google_protobuf4.UInt64Value { | ||||
| 	if m != nil { | ||||
| 		return m.U64 | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *KnownTypes) GetI32() *google_protobuf4.Int32Value { | ||||
| 	if m != nil { | ||||
| 		return m.I32 | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *KnownTypes) GetU32() *google_protobuf4.UInt32Value { | ||||
| 	if m != nil { | ||||
| 		return m.U32 | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *KnownTypes) GetBool() *google_protobuf4.BoolValue { | ||||
| 	if m != nil { | ||||
| 		return m.Bool | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *KnownTypes) GetStr() *google_protobuf4.StringValue { | ||||
| 	if m != nil { | ||||
| 		return m.Str | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *KnownTypes) GetBytes() *google_protobuf4.BytesValue { | ||||
| 	if m != nil { | ||||
| 		return m.Bytes | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| var E_Name = &proto.ExtensionDesc{ | ||||
| 	ExtendedType:  (*Real)(nil), | ||||
| 	ExtensionType: (*string)(nil), | ||||
| 	Field:         124, | ||||
| 	Name:          "jsonpb.name", | ||||
| 	Tag:           "bytes,124,opt,name=name", | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterType((*Simple)(nil), "jsonpb.Simple") | ||||
| 	proto.RegisterType((*Repeats)(nil), "jsonpb.Repeats") | ||||
| 	proto.RegisterType((*Widget)(nil), "jsonpb.Widget") | ||||
| 	proto.RegisterType((*Maps)(nil), "jsonpb.Maps") | ||||
| 	proto.RegisterType((*MsgWithOneof)(nil), "jsonpb.MsgWithOneof") | ||||
| 	proto.RegisterType((*Real)(nil), "jsonpb.Real") | ||||
| 	proto.RegisterType((*Complex)(nil), "jsonpb.Complex") | ||||
| 	proto.RegisterType((*KnownTypes)(nil), "jsonpb.KnownTypes") | ||||
| 	proto.RegisterEnum("jsonpb.Widget_Color", Widget_Color_name, Widget_Color_value) | ||||
| 	proto.RegisterExtension(E_Complex_RealExtension) | ||||
| 	proto.RegisterExtension(E_Name) | ||||
| } | ||||
|  | ||||
| func init() { proto.RegisterFile("test_objects.proto", fileDescriptor1) } | ||||
|  | ||||
| var fileDescriptor1 = []byte{ | ||||
| 	// 1055 bytes of a gzipped FileDescriptorProto | ||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x95, 0x51, 0x73, 0xdb, 0x44, | ||||
| 	0x10, 0xc7, 0x23, 0xc9, 0x96, 0xec, 0x73, 0x12, 0xcc, 0x4d, 0x4a, 0x15, 0x13, 0x40, 0x63, 0x4a, | ||||
| 	0x11, 0x85, 0xba, 0x83, 0xe2, 0xf1, 0x30, 0x85, 0x97, 0xa4, 0x31, 0x94, 0x81, 0x94, 0x99, 0x4b, | ||||
| 	0x43, 0x1f, 0x3d, 0x72, 0x7c, 0x71, 0x55, 0x64, 0x9d, 0xe7, 0xee, 0x44, 0xea, 0x81, 0x87, 0x3c, | ||||
| 	0xf3, 0xcc, 0x57, 0x80, 0x8f, 0xc0, 0x27, 0xe2, 0x83, 0x74, 0x76, 0x4f, 0xb2, 0x12, 0x3b, 0x7e, | ||||
| 	0x8a, 0xf7, 0xf6, 0xbf, 0xff, 0x9c, 0x7e, 0xb7, 0x77, 0x4b, 0xa8, 0xe6, 0x4a, 0x8f, 0xc4, 0xf8, | ||||
| 	0x0d, 0xbf, 0xd0, 0xaa, 0x37, 0x97, 0x42, 0x0b, 0xea, 0xbe, 0x51, 0x22, 0x9b, 0x8f, 0x3b, 0xfb, | ||||
| 	0x53, 0x21, 0xa6, 0x29, 0x7f, 0x82, 0xab, 0xe3, 0xfc, 0xf2, 0x49, 0x9c, 0x2d, 0x8c, 0xa4, 0xf3, | ||||
| 	0xf1, 0x6a, 0x6a, 0x92, 0xcb, 0x58, 0x27, 0x22, 0x2b, 0xf2, 0x07, 0xab, 0x79, 0xa5, 0x65, 0x7e, | ||||
| 	0xa1, 0x8b, 0xec, 0x27, 0xab, 0x59, 0x9d, 0xcc, 0xb8, 0xd2, 0xf1, 0x6c, 0xbe, 0xc9, 0xfe, 0x4a, | ||||
| 	0xc6, 0xf3, 0x39, 0x97, 0xc5, 0x0e, 0xbb, 0xff, 0xd8, 0xc4, 0x3d, 0x4b, 0x66, 0xf3, 0x94, 0xd3, | ||||
| 	0x7b, 0xc4, 0x15, 0xa3, 0xb1, 0x10, 0xa9, 0x6f, 0x05, 0x56, 0xd8, 0x60, 0x75, 0x71, 0x2c, 0x44, | ||||
| 	0x4a, 0xef, 0x13, 0x4f, 0x8c, 0x92, 0x4c, 0x1f, 0x46, 0xbe, 0x1d, 0x58, 0x61, 0x9d, 0xb9, 0xe2, | ||||
| 	0x47, 0x88, 0x96, 0x89, 0x41, 0xdf, 0x77, 0x02, 0x2b, 0x74, 0x4c, 0x62, 0xd0, 0xa7, 0xfb, 0xa4, | ||||
| 	0x21, 0x46, 0xb9, 0x29, 0xa9, 0x05, 0x56, 0xb8, 0xc3, 0x3c, 0x71, 0x8e, 0x61, 0x95, 0x1a, 0xf4, | ||||
| 	0xfd, 0x7a, 0x60, 0x85, 0xb5, 0x22, 0x55, 0x56, 0x29, 0x53, 0xe5, 0x06, 0x56, 0xf8, 0x3e, 0xf3, | ||||
| 	0xc4, 0xd9, 0x8d, 0x2a, 0x65, 0xaa, 0xbc, 0xc0, 0x0a, 0x69, 0x91, 0x1a, 0xf4, 0xcd, 0x26, 0x2e, | ||||
| 	0x53, 0x11, 0x6b, 0xbf, 0x11, 0x58, 0xa1, 0xcd, 0x5c, 0xf1, 0x3d, 0x44, 0xa6, 0x66, 0x22, 0xf2, | ||||
| 	0x71, 0xca, 0xfd, 0x66, 0x60, 0x85, 0x16, 0xf3, 0xc4, 0x09, 0x86, 0x85, 0x9d, 0x96, 0x49, 0x36, | ||||
| 	0xf5, 0x49, 0x60, 0x85, 0x4d, 0xb0, 0xc3, 0xd0, 0xd8, 0x8d, 0x17, 0x9a, 0x2b, 0xbf, 0x15, 0x58, | ||||
| 	0xe1, 0x36, 0x73, 0xc5, 0x31, 0x44, 0xdd, 0x7f, 0x6d, 0xe2, 0x31, 0x3e, 0xe7, 0xb1, 0x56, 0x00, | ||||
| 	0x4a, 0x96, 0xa0, 0x1c, 0x00, 0x25, 0x4b, 0x50, 0x72, 0x09, 0xca, 0x01, 0x50, 0x72, 0x09, 0x4a, | ||||
| 	0x2e, 0x41, 0x39, 0x00, 0x4a, 0x2e, 0x41, 0xc9, 0x0a, 0x94, 0x03, 0xa0, 0x64, 0x05, 0x4a, 0x56, | ||||
| 	0xa0, 0x1c, 0x00, 0x25, 0x2b, 0x50, 0xb2, 0x02, 0xe5, 0x00, 0x28, 0x79, 0x76, 0xa3, 0x6a, 0x09, | ||||
| 	0xca, 0x01, 0x50, 0xb2, 0x02, 0x25, 0x97, 0xa0, 0x1c, 0x00, 0x25, 0x97, 0xa0, 0x64, 0x05, 0xca, | ||||
| 	0x01, 0x50, 0xb2, 0x02, 0x25, 0x2b, 0x50, 0x0e, 0x80, 0x92, 0x15, 0x28, 0xb9, 0x04, 0xe5, 0x00, | ||||
| 	0x28, 0x69, 0x40, 0xfd, 0x67, 0x13, 0xf7, 0x55, 0x32, 0x99, 0x72, 0x4d, 0x1f, 0x91, 0xfa, 0x85, | ||||
| 	0x48, 0x85, 0xc4, 0x7e, 0xda, 0x8d, 0xf6, 0x7a, 0xe6, 0x36, 0xf4, 0x4c, 0xba, 0xf7, 0x0c, 0x72, | ||||
| 	0xcc, 0x48, 0xe8, 0x63, 0xf0, 0x33, 0x6a, 0x80, 0xb7, 0x49, 0xed, 0x4a, 0xfc, 0x4b, 0x1f, 0x12, | ||||
| 	0x57, 0x61, 0xd7, 0xe2, 0x01, 0xb6, 0xa2, 0xdd, 0x52, 0x6d, 0x7a, 0x99, 0x15, 0x59, 0xfa, 0x85, | ||||
| 	0x01, 0x82, 0x4a, 0xd8, 0xe7, 0xba, 0x12, 0x00, 0x15, 0x52, 0x4f, 0x9a, 0x03, 0xf6, 0xf7, 0xd0, | ||||
| 	0xf3, 0xbd, 0x52, 0x59, 0x9c, 0x3b, 0x2b, 0xf3, 0xf4, 0x2b, 0xd2, 0x94, 0xa3, 0x52, 0x7c, 0x0f, | ||||
| 	0x6d, 0xd7, 0xc4, 0x0d, 0x59, 0xfc, 0xea, 0x7e, 0x46, 0xea, 0x66, 0xd3, 0x1e, 0x71, 0xd8, 0xf0, | ||||
| 	0xa4, 0xbd, 0x45, 0x9b, 0xa4, 0xfe, 0x03, 0x1b, 0x0e, 0x5f, 0xb4, 0x2d, 0xda, 0x20, 0xb5, 0xe3, | ||||
| 	0x9f, 0xcf, 0x87, 0x6d, 0xbb, 0xfb, 0xb7, 0x4d, 0x6a, 0xa7, 0xf1, 0x5c, 0xd1, 0x6f, 0x49, 0x6b, | ||||
| 	0x66, 0xda, 0x05, 0xd8, 0x63, 0x8f, 0xb5, 0xa2, 0x0f, 0x4b, 0x7f, 0x90, 0xf4, 0x4e, 0xb1, 0x7f, | ||||
| 	0xce, 0xb4, 0x1c, 0x66, 0x5a, 0x2e, 0x58, 0x73, 0x56, 0xc6, 0xf4, 0x88, 0xec, 0xcc, 0xb0, 0x37, | ||||
| 	0xcb, 0xaf, 0xb6, 0xb1, 0xfc, 0xa3, 0xdb, 0xe5, 0xd0, 0xaf, 0xe6, 0xb3, 0x8d, 0x41, 0x6b, 0x56, | ||||
| 	0xad, 0x74, 0xbe, 0x23, 0xbb, 0xb7, 0xfd, 0x69, 0x9b, 0x38, 0xbf, 0xf1, 0x05, 0x1e, 0xa3, 0xc3, | ||||
| 	0xe0, 0x27, 0xdd, 0x23, 0xf5, 0xdf, 0xe3, 0x34, 0xe7, 0xf8, 0x24, 0x34, 0x99, 0x09, 0x9e, 0xda, | ||||
| 	0xdf, 0x58, 0x9d, 0x17, 0xa4, 0xbd, 0x6a, 0x7f, 0xb3, 0xbe, 0x61, 0xea, 0x1f, 0xdc, 0xac, 0x5f, | ||||
| 	0x3f, 0x94, 0xca, 0xaf, 0xfb, 0x97, 0x45, 0xb6, 0x4f, 0xd5, 0xf4, 0x55, 0xa2, 0x5f, 0xff, 0x92, | ||||
| 	0x71, 0x71, 0x49, 0x3f, 0x20, 0x75, 0x9d, 0xe8, 0x94, 0xa3, 0x5d, 0xf3, 0xf9, 0x16, 0x33, 0x21, | ||||
| 	0xf5, 0x89, 0xab, 0xe2, 0x34, 0x96, 0x0b, 0xf4, 0x74, 0x9e, 0x6f, 0xb1, 0x22, 0xa6, 0x1d, 0xe2, | ||||
| 	0x3d, 0x13, 0x39, 0xec, 0x04, 0x1f, 0x2a, 0xa8, 0xf1, 0x2e, 0xcc, 0x02, 0xfd, 0x94, 0x6c, 0xbf, | ||||
| 	0x16, 0x33, 0x3e, 0x8a, 0x27, 0x13, 0xc9, 0x95, 0xc2, 0xf7, 0x0a, 0x04, 0x2d, 0x58, 0x3d, 0x32, | ||||
| 	0x8b, 0xc7, 0x1e, 0xa9, 0xe7, 0x59, 0x22, 0xb2, 0xee, 0x43, 0x52, 0x63, 0x3c, 0x4e, 0xab, 0xcf, | ||||
| 	0xb7, 0xf0, 0x65, 0x31, 0xc1, 0xa3, 0x46, 0x63, 0xd2, 0xbe, 0xbe, 0xbe, 0xbe, 0xb6, 0xbb, 0x57, | ||||
| 	0xf0, 0x1f, 0xe1, 0x4b, 0xde, 0xd2, 0x03, 0xd2, 0x4c, 0x66, 0xf1, 0x34, 0xc9, 0x60, 0x67, 0x46, | ||||
| 	0x5e, 0x2d, 0x54, 0x25, 0xd1, 0x09, 0xd9, 0x95, 0x3c, 0x4e, 0x47, 0xfc, 0xad, 0xe6, 0x99, 0x4a, | ||||
| 	0x44, 0x46, 0xb7, 0xab, 0x96, 0x8a, 0x53, 0xff, 0x8f, 0xdb, 0x3d, 0x59, 0xd8, 0xb3, 0x1d, 0x28, | ||||
| 	0x1a, 0x96, 0x35, 0xdd, 0xff, 0x6b, 0x84, 0xfc, 0x94, 0x89, 0xab, 0xec, 0xe5, 0x62, 0xce, 0x15, | ||||
| 	0x7d, 0x40, 0xec, 0x38, 0xf3, 0x77, 0xb1, 0x74, 0xaf, 0x67, 0x46, 0x41, 0xaf, 0x1c, 0x05, 0xbd, | ||||
| 	0xa3, 0x6c, 0xc1, 0xec, 0x38, 0xa3, 0x5f, 0x12, 0x67, 0x92, 0x9b, 0x5b, 0xda, 0x8a, 0xf6, 0xd7, | ||||
| 	0x64, 0x27, 0xc5, 0x40, 0x62, 0xa0, 0xa2, 0x9f, 0x13, 0x5b, 0x69, 0x7f, 0x1b, 0xb5, 0xf7, 0xd7, | ||||
| 	0xb4, 0x67, 0x38, 0x9c, 0x98, 0xad, 0xe0, 0xf6, 0xdb, 0x5a, 0x15, 0xe7, 0xdb, 0x59, 0x13, 0xbe, | ||||
| 	0x2c, 0xe7, 0x14, 0xb3, 0xb5, 0xa2, 0x3d, 0xe2, 0x4c, 0xc6, 0x29, 0x9e, 0x4e, 0x2b, 0x3a, 0x58, | ||||
| 	0xdf, 0x01, 0x3e, 0x47, 0xbf, 0x02, 0x64, 0x06, 0x42, 0xfa, 0x98, 0x38, 0x97, 0xa9, 0xc6, 0xc3, | ||||
| 	0x82, 0xab, 0xb1, 0xaa, 0xc7, 0x87, 0xad, 0x90, 0x5f, 0xa6, 0x1a, 0xe4, 0x49, 0x31, 0x70, 0xee, | ||||
| 	0x92, 0x63, 0xb3, 0x17, 0xf2, 0x64, 0xd0, 0x87, 0xdd, 0xe4, 0x83, 0x3e, 0x0e, 0xa1, 0xbb, 0x76, | ||||
| 	0x73, 0x7e, 0x53, 0x9f, 0x0f, 0xfa, 0x68, 0x7f, 0x18, 0xe1, 0x64, 0xda, 0x60, 0x7f, 0x18, 0x95, | ||||
| 	0xf6, 0x87, 0x11, 0xda, 0x1f, 0x46, 0x38, 0xae, 0x36, 0xd9, 0x2f, 0xf5, 0x39, 0xea, 0x6b, 0x38, | ||||
| 	0x6c, 0x9a, 0x1b, 0x50, 0xc2, 0x6d, 0x33, 0x72, 0xd4, 0x81, 0x3f, 0xbc, 0x1b, 0x64, 0x83, 0xbf, | ||||
| 	0x79, 0xc0, 0x0b, 0x7f, 0xa5, 0x25, 0xfd, 0x9a, 0xd4, 0xab, 0x89, 0x77, 0xd7, 0x07, 0xe0, 0xc3, | ||||
| 	0x6e, 0x0a, 0x8c, 0xf2, 0x69, 0x40, 0x6a, 0x59, 0x3c, 0xe3, 0x2b, 0x2d, 0xfa, 0x27, 0xbe, 0x05, | ||||
| 	0x98, 0x79, 0x17, 0x00, 0x00, 0xff, 0xff, 0xda, 0x8b, 0x4a, 0x7a, 0x0e, 0x09, 0x00, 0x00, | ||||
| } | ||||
							
								
								
									
										135
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								vendor/github.com/golang/protobuf/jsonpb/jsonpb_test_proto/test_objects.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,135 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2015 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto2"; | ||||
|  | ||||
| import "google/protobuf/any.proto"; | ||||
| import "google/protobuf/duration.proto"; | ||||
| import "google/protobuf/struct.proto"; | ||||
| import "google/protobuf/timestamp.proto"; | ||||
| import "google/protobuf/wrappers.proto"; | ||||
|  | ||||
| package jsonpb; | ||||
|  | ||||
| // Test message for holding primitive types. | ||||
| message Simple { | ||||
|   optional bool o_bool = 1; | ||||
|   optional int32 o_int32 = 2; | ||||
|   optional int64 o_int64 = 3; | ||||
|   optional uint32 o_uint32 = 4; | ||||
|   optional uint64 o_uint64 = 5; | ||||
|   optional sint32 o_sint32 = 6; | ||||
|   optional sint64 o_sint64 = 7; | ||||
|   optional float o_float = 8; | ||||
|   optional double o_double = 9; | ||||
|   optional string o_string = 10; | ||||
|   optional bytes o_bytes = 11; | ||||
| } | ||||
|  | ||||
| // Test message for holding repeated primitives. | ||||
| message Repeats { | ||||
|   repeated bool r_bool = 1; | ||||
|   repeated int32 r_int32 = 2; | ||||
|   repeated int64 r_int64 = 3; | ||||
|   repeated uint32 r_uint32 = 4; | ||||
|   repeated uint64 r_uint64 = 5; | ||||
|   repeated sint32 r_sint32 = 6; | ||||
|   repeated sint64 r_sint64 = 7; | ||||
|   repeated float r_float = 8; | ||||
|   repeated double r_double = 9; | ||||
|   repeated string r_string = 10; | ||||
|   repeated bytes r_bytes = 11; | ||||
| } | ||||
|  | ||||
| // Test message for holding enums and nested messages. | ||||
| message Widget { | ||||
|   enum Color { | ||||
|     RED = 0; | ||||
|     GREEN = 1; | ||||
|     BLUE = 2; | ||||
|   }; | ||||
|   optional Color color = 1; | ||||
|   repeated Color r_color = 2; | ||||
|  | ||||
|   optional Simple simple = 10; | ||||
|   repeated Simple r_simple = 11; | ||||
|  | ||||
|   optional Repeats repeats = 20; | ||||
|   repeated Repeats r_repeats = 21; | ||||
| } | ||||
|  | ||||
| message Maps { | ||||
|   map<int64, string> m_int64_str = 1; | ||||
|   map<bool, Simple> m_bool_simple = 2; | ||||
| } | ||||
|  | ||||
| message MsgWithOneof { | ||||
|   oneof union { | ||||
|     string title = 1; | ||||
|     int64 salary = 2; | ||||
|     string Country = 3; | ||||
|     string home_address = 4; | ||||
|   } | ||||
| } | ||||
|  | ||||
| message Real { | ||||
|   optional double value = 1; | ||||
|   extensions 100 to max; | ||||
| } | ||||
|  | ||||
| extend Real { | ||||
|   optional string name = 124; | ||||
| } | ||||
|  | ||||
| message Complex { | ||||
|   extend Real { | ||||
|     optional Complex real_extension = 123; | ||||
|   } | ||||
|   optional double imaginary = 1; | ||||
|   extensions 100 to max; | ||||
| } | ||||
|  | ||||
| message KnownTypes { | ||||
|   optional google.protobuf.Any an = 14; | ||||
|   optional google.protobuf.Duration dur = 1; | ||||
|   optional google.protobuf.Struct st = 12; | ||||
|   optional google.protobuf.Timestamp ts = 2; | ||||
|  | ||||
|   optional google.protobuf.DoubleValue dbl = 3; | ||||
|   optional google.protobuf.FloatValue flt = 4; | ||||
|   optional google.protobuf.Int64Value i64 = 5; | ||||
|   optional google.protobuf.UInt64Value u64 = 6; | ||||
|   optional google.protobuf.Int32Value i32 = 7; | ||||
|   optional google.protobuf.UInt32Value u32 = 8; | ||||
|   optional google.protobuf.BoolValue bool = 9; | ||||
|   optional google.protobuf.StringValue str = 10; | ||||
|   optional google.protobuf.BytesValue bytes = 11; | ||||
| } | ||||
							
								
								
									
										43
									
								
								vendor/github.com/golang/protobuf/proto/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								vendor/github.com/golang/protobuf/proto/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| # Go support for Protocol Buffers - Google's data interchange format | ||||
| # | ||||
| # Copyright 2010 The Go Authors.  All rights reserved. | ||||
| # https://github.com/golang/protobuf | ||||
| # | ||||
| # 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. | ||||
|  | ||||
| install: | ||||
| 	go install | ||||
|  | ||||
| test: install generate-test-pbs | ||||
| 	go test | ||||
|  | ||||
|  | ||||
| generate-test-pbs: | ||||
| 	make install | ||||
| 	make -C testdata | ||||
| 	protoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. proto3_proto/proto3.proto | ||||
| 	make | ||||
							
								
								
									
										2278
									
								
								vendor/github.com/golang/protobuf/proto/all_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2278
									
								
								vendor/github.com/golang/protobuf/proto/all_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										300
									
								
								vendor/github.com/golang/protobuf/proto/any_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										300
									
								
								vendor/github.com/golang/protobuf/proto/any_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,300 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2016 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto_test | ||||
|  | ||||
| import ( | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
|  | ||||
| 	pb "github.com/golang/protobuf/proto/proto3_proto" | ||||
| 	testpb "github.com/golang/protobuf/proto/testdata" | ||||
| 	anypb "github.com/golang/protobuf/ptypes/any" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	expandedMarshaler        = proto.TextMarshaler{ExpandAny: true} | ||||
| 	expandedCompactMarshaler = proto.TextMarshaler{Compact: true, ExpandAny: true} | ||||
| ) | ||||
|  | ||||
| // anyEqual reports whether two messages which may be google.protobuf.Any or may | ||||
| // contain google.protobuf.Any fields are equal. We can't use proto.Equal for | ||||
| // comparison, because semantically equivalent messages may be marshaled to | ||||
| // binary in different tag order. Instead, trust that TextMarshaler with | ||||
| // ExpandAny option works and compare the text marshaling results. | ||||
| func anyEqual(got, want proto.Message) bool { | ||||
| 	// if messages are proto.Equal, no need to marshal. | ||||
| 	if proto.Equal(got, want) { | ||||
| 		return true | ||||
| 	} | ||||
| 	g := expandedMarshaler.Text(got) | ||||
| 	w := expandedMarshaler.Text(want) | ||||
| 	return g == w | ||||
| } | ||||
|  | ||||
| type golden struct { | ||||
| 	m    proto.Message | ||||
| 	t, c string | ||||
| } | ||||
|  | ||||
| var goldenMessages = makeGolden() | ||||
|  | ||||
| func makeGolden() []golden { | ||||
| 	nested := &pb.Nested{Bunny: "Monty"} | ||||
| 	nb, err := proto.Marshal(nested) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	m1 := &pb.Message{ | ||||
| 		Name:        "David", | ||||
| 		ResultCount: 47, | ||||
| 		Anything:    &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(nested), Value: nb}, | ||||
| 	} | ||||
| 	m2 := &pb.Message{ | ||||
| 		Name:        "David", | ||||
| 		ResultCount: 47, | ||||
| 		Anything:    &anypb.Any{TypeUrl: "http://[::1]/type.googleapis.com/" + proto.MessageName(nested), Value: nb}, | ||||
| 	} | ||||
| 	m3 := &pb.Message{ | ||||
| 		Name:        "David", | ||||
| 		ResultCount: 47, | ||||
| 		Anything:    &anypb.Any{TypeUrl: `type.googleapis.com/"/` + proto.MessageName(nested), Value: nb}, | ||||
| 	} | ||||
| 	m4 := &pb.Message{ | ||||
| 		Name:        "David", | ||||
| 		ResultCount: 47, | ||||
| 		Anything:    &anypb.Any{TypeUrl: "type.googleapis.com/a/path/" + proto.MessageName(nested), Value: nb}, | ||||
| 	} | ||||
| 	m5 := &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(nested), Value: nb} | ||||
|  | ||||
| 	any1 := &testpb.MyMessage{Count: proto.Int32(47), Name: proto.String("David")} | ||||
| 	proto.SetExtension(any1, testpb.E_Ext_More, &testpb.Ext{Data: proto.String("foo")}) | ||||
| 	proto.SetExtension(any1, testpb.E_Ext_Text, proto.String("bar")) | ||||
| 	any1b, err := proto.Marshal(any1) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	any2 := &testpb.MyMessage{Count: proto.Int32(42), Bikeshed: testpb.MyMessage_GREEN.Enum(), RepBytes: [][]byte{[]byte("roboto")}} | ||||
| 	proto.SetExtension(any2, testpb.E_Ext_More, &testpb.Ext{Data: proto.String("baz")}) | ||||
| 	any2b, err := proto.Marshal(any2) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	m6 := &pb.Message{ | ||||
| 		Name:        "David", | ||||
| 		ResultCount: 47, | ||||
| 		Anything:    &anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any1), Value: any1b}, | ||||
| 		ManyThings: []*anypb.Any{ | ||||
| 			&anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any2), Value: any2b}, | ||||
| 			&anypb.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any1), Value: any1b}, | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	const ( | ||||
| 		m1Golden = ` | ||||
| name: "David" | ||||
| result_count: 47 | ||||
| anything: < | ||||
|   [type.googleapis.com/proto3_proto.Nested]: < | ||||
|     bunny: "Monty" | ||||
|   > | ||||
| > | ||||
| ` | ||||
| 		m2Golden = ` | ||||
| name: "David" | ||||
| result_count: 47 | ||||
| anything: < | ||||
|   ["http://[::1]/type.googleapis.com/proto3_proto.Nested"]: < | ||||
|     bunny: "Monty" | ||||
|   > | ||||
| > | ||||
| ` | ||||
| 		m3Golden = ` | ||||
| name: "David" | ||||
| result_count: 47 | ||||
| anything: < | ||||
|   ["type.googleapis.com/\"/proto3_proto.Nested"]: < | ||||
|     bunny: "Monty" | ||||
|   > | ||||
| > | ||||
| ` | ||||
| 		m4Golden = ` | ||||
| name: "David" | ||||
| result_count: 47 | ||||
| anything: < | ||||
|   [type.googleapis.com/a/path/proto3_proto.Nested]: < | ||||
|     bunny: "Monty" | ||||
|   > | ||||
| > | ||||
| ` | ||||
| 		m5Golden = ` | ||||
| [type.googleapis.com/proto3_proto.Nested]: < | ||||
|   bunny: "Monty" | ||||
| > | ||||
| ` | ||||
| 		m6Golden = ` | ||||
| name: "David" | ||||
| result_count: 47 | ||||
| anything: < | ||||
|   [type.googleapis.com/testdata.MyMessage]: < | ||||
|     count: 47 | ||||
|     name: "David" | ||||
|     [testdata.Ext.more]: < | ||||
|       data: "foo" | ||||
|     > | ||||
|     [testdata.Ext.text]: "bar" | ||||
|   > | ||||
| > | ||||
| many_things: < | ||||
|   [type.googleapis.com/testdata.MyMessage]: < | ||||
|     count: 42 | ||||
|     bikeshed: GREEN | ||||
|     rep_bytes: "roboto" | ||||
|     [testdata.Ext.more]: < | ||||
|       data: "baz" | ||||
|     > | ||||
|   > | ||||
| > | ||||
| many_things: < | ||||
|   [type.googleapis.com/testdata.MyMessage]: < | ||||
|     count: 47 | ||||
|     name: "David" | ||||
|     [testdata.Ext.more]: < | ||||
|       data: "foo" | ||||
|     > | ||||
|     [testdata.Ext.text]: "bar" | ||||
|   > | ||||
| > | ||||
| ` | ||||
| 	) | ||||
| 	return []golden{ | ||||
| 		{m1, strings.TrimSpace(m1Golden) + "\n", strings.TrimSpace(compact(m1Golden)) + " "}, | ||||
| 		{m2, strings.TrimSpace(m2Golden) + "\n", strings.TrimSpace(compact(m2Golden)) + " "}, | ||||
| 		{m3, strings.TrimSpace(m3Golden) + "\n", strings.TrimSpace(compact(m3Golden)) + " "}, | ||||
| 		{m4, strings.TrimSpace(m4Golden) + "\n", strings.TrimSpace(compact(m4Golden)) + " "}, | ||||
| 		{m5, strings.TrimSpace(m5Golden) + "\n", strings.TrimSpace(compact(m5Golden)) + " "}, | ||||
| 		{m6, strings.TrimSpace(m6Golden) + "\n", strings.TrimSpace(compact(m6Golden)) + " "}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestMarshalGolden(t *testing.T) { | ||||
| 	for _, tt := range goldenMessages { | ||||
| 		if got, want := expandedMarshaler.Text(tt.m), tt.t; got != want { | ||||
| 			t.Errorf("message %v: got:\n%s\nwant:\n%s", tt.m, got, want) | ||||
| 		} | ||||
| 		if got, want := expandedCompactMarshaler.Text(tt.m), tt.c; got != want { | ||||
| 			t.Errorf("message %v: got:\n`%s`\nwant:\n`%s`", tt.m, got, want) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestUnmarshalGolden(t *testing.T) { | ||||
| 	for _, tt := range goldenMessages { | ||||
| 		want := tt.m | ||||
| 		got := proto.Clone(tt.m) | ||||
| 		got.Reset() | ||||
| 		if err := proto.UnmarshalText(tt.t, got); err != nil { | ||||
| 			t.Errorf("failed to unmarshal\n%s\nerror: %v", tt.t, err) | ||||
| 		} | ||||
| 		if !anyEqual(got, want) { | ||||
| 			t.Errorf("message:\n%s\ngot:\n%s\nwant:\n%s", tt.t, got, want) | ||||
| 		} | ||||
| 		got.Reset() | ||||
| 		if err := proto.UnmarshalText(tt.c, got); err != nil { | ||||
| 			t.Errorf("failed to unmarshal\n%s\nerror: %v", tt.c, err) | ||||
| 		} | ||||
| 		if !anyEqual(got, want) { | ||||
| 			t.Errorf("message:\n%s\ngot:\n%s\nwant:\n%s", tt.c, got, want) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestMarshalUnknownAny(t *testing.T) { | ||||
| 	m := &pb.Message{ | ||||
| 		Anything: &anypb.Any{ | ||||
| 			TypeUrl: "foo", | ||||
| 			Value:   []byte("bar"), | ||||
| 		}, | ||||
| 	} | ||||
| 	want := `anything: < | ||||
|   type_url: "foo" | ||||
|   value: "bar" | ||||
| > | ||||
| ` | ||||
| 	got := expandedMarshaler.Text(m) | ||||
| 	if got != want { | ||||
| 		t.Errorf("got\n`%s`\nwant\n`%s`", got, want) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestAmbiguousAny(t *testing.T) { | ||||
| 	pb := &anypb.Any{} | ||||
| 	err := proto.UnmarshalText(` | ||||
| 	type_url: "ttt/proto3_proto.Nested" | ||||
| 	value: "\n\x05Monty" | ||||
| 	`, pb) | ||||
| 	t.Logf("result: %v (error: %v)", expandedMarshaler.Text(pb), err) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("failed to parse ambiguous Any message: %v", err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestUnmarshalOverwriteAny(t *testing.T) { | ||||
| 	pb := &anypb.Any{} | ||||
| 	err := proto.UnmarshalText(` | ||||
|   [type.googleapis.com/a/path/proto3_proto.Nested]: < | ||||
|     bunny: "Monty" | ||||
|   > | ||||
|   [type.googleapis.com/a/path/proto3_proto.Nested]: < | ||||
|     bunny: "Rabbit of Caerbannog" | ||||
|   > | ||||
| 	`, pb) | ||||
| 	want := `line 7: Any message unpacked multiple times, or "type_url" already set` | ||||
| 	if err.Error() != want { | ||||
| 		t.Errorf("incorrect error.\nHave: %v\nWant: %v", err.Error(), want) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestUnmarshalAnyMixAndMatch(t *testing.T) { | ||||
| 	pb := &anypb.Any{} | ||||
| 	err := proto.UnmarshalText(` | ||||
| 	value: "\n\x05Monty" | ||||
|   [type.googleapis.com/a/path/proto3_proto.Nested]: < | ||||
|     bunny: "Rabbit of Caerbannog" | ||||
|   > | ||||
| 	`, pb) | ||||
| 	want := `line 5: Any message unpacked multiple times, or "value" already set` | ||||
| 	if err.Error() != want { | ||||
| 		t.Errorf("incorrect error.\nHave: %v\nWant: %v", err.Error(), want) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										229
									
								
								vendor/github.com/golang/protobuf/proto/clone.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										229
									
								
								vendor/github.com/golang/protobuf/proto/clone.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,229 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2011 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| // Protocol buffer deep copy and merge. | ||||
| // TODO: RawMessage. | ||||
|  | ||||
| package proto | ||||
|  | ||||
| import ( | ||||
| 	"log" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // Clone returns a deep copy of a protocol buffer. | ||||
| func Clone(pb Message) Message { | ||||
| 	in := reflect.ValueOf(pb) | ||||
| 	if in.IsNil() { | ||||
| 		return pb | ||||
| 	} | ||||
|  | ||||
| 	out := reflect.New(in.Type().Elem()) | ||||
| 	// out is empty so a merge is a deep copy. | ||||
| 	mergeStruct(out.Elem(), in.Elem()) | ||||
| 	return out.Interface().(Message) | ||||
| } | ||||
|  | ||||
| // Merge merges src into dst. | ||||
| // Required and optional fields that are set in src will be set to that value in dst. | ||||
| // Elements of repeated fields will be appended. | ||||
| // Merge panics if src and dst are not the same type, or if dst is nil. | ||||
| func Merge(dst, src Message) { | ||||
| 	in := reflect.ValueOf(src) | ||||
| 	out := reflect.ValueOf(dst) | ||||
| 	if out.IsNil() { | ||||
| 		panic("proto: nil destination") | ||||
| 	} | ||||
| 	if in.Type() != out.Type() { | ||||
| 		// Explicit test prior to mergeStruct so that mistyped nils will fail | ||||
| 		panic("proto: type mismatch") | ||||
| 	} | ||||
| 	if in.IsNil() { | ||||
| 		// Merging nil into non-nil is a quiet no-op | ||||
| 		return | ||||
| 	} | ||||
| 	mergeStruct(out.Elem(), in.Elem()) | ||||
| } | ||||
|  | ||||
| func mergeStruct(out, in reflect.Value) { | ||||
| 	sprop := GetProperties(in.Type()) | ||||
| 	for i := 0; i < in.NumField(); i++ { | ||||
| 		f := in.Type().Field(i) | ||||
| 		if strings.HasPrefix(f.Name, "XXX_") { | ||||
| 			continue | ||||
| 		} | ||||
| 		mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) | ||||
| 	} | ||||
|  | ||||
| 	if emIn, ok := extendable(in.Addr().Interface()); ok { | ||||
| 		emOut, _ := extendable(out.Addr().Interface()) | ||||
| 		mIn, muIn := emIn.extensionsRead() | ||||
| 		if mIn != nil { | ||||
| 			mOut := emOut.extensionsWrite() | ||||
| 			muIn.Lock() | ||||
| 			mergeExtension(mOut, mIn) | ||||
| 			muIn.Unlock() | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	uf := in.FieldByName("XXX_unrecognized") | ||||
| 	if !uf.IsValid() { | ||||
| 		return | ||||
| 	} | ||||
| 	uin := uf.Bytes() | ||||
| 	if len(uin) > 0 { | ||||
| 		out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // mergeAny performs a merge between two values of the same type. | ||||
| // viaPtr indicates whether the values were indirected through a pointer (implying proto2). | ||||
| // prop is set if this is a struct field (it may be nil). | ||||
| func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { | ||||
| 	if in.Type() == protoMessageType { | ||||
| 		if !in.IsNil() { | ||||
| 			if out.IsNil() { | ||||
| 				out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) | ||||
| 			} else { | ||||
| 				Merge(out.Interface().(Message), in.Interface().(Message)) | ||||
| 			} | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
| 	switch in.Kind() { | ||||
| 	case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, | ||||
| 		reflect.String, reflect.Uint32, reflect.Uint64: | ||||
| 		if !viaPtr && isProto3Zero(in) { | ||||
| 			return | ||||
| 		} | ||||
| 		out.Set(in) | ||||
| 	case reflect.Interface: | ||||
| 		// Probably a oneof field; copy non-nil values. | ||||
| 		if in.IsNil() { | ||||
| 			return | ||||
| 		} | ||||
| 		// Allocate destination if it is not set, or set to a different type. | ||||
| 		// Otherwise we will merge as normal. | ||||
| 		if out.IsNil() || out.Elem().Type() != in.Elem().Type() { | ||||
| 			out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) | ||||
| 		} | ||||
| 		mergeAny(out.Elem(), in.Elem(), false, nil) | ||||
| 	case reflect.Map: | ||||
| 		if in.Len() == 0 { | ||||
| 			return | ||||
| 		} | ||||
| 		if out.IsNil() { | ||||
| 			out.Set(reflect.MakeMap(in.Type())) | ||||
| 		} | ||||
| 		// For maps with value types of *T or []byte we need to deep copy each value. | ||||
| 		elemKind := in.Type().Elem().Kind() | ||||
| 		for _, key := range in.MapKeys() { | ||||
| 			var val reflect.Value | ||||
| 			switch elemKind { | ||||
| 			case reflect.Ptr: | ||||
| 				val = reflect.New(in.Type().Elem().Elem()) | ||||
| 				mergeAny(val, in.MapIndex(key), false, nil) | ||||
| 			case reflect.Slice: | ||||
| 				val = in.MapIndex(key) | ||||
| 				val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) | ||||
| 			default: | ||||
| 				val = in.MapIndex(key) | ||||
| 			} | ||||
| 			out.SetMapIndex(key, val) | ||||
| 		} | ||||
| 	case reflect.Ptr: | ||||
| 		if in.IsNil() { | ||||
| 			return | ||||
| 		} | ||||
| 		if out.IsNil() { | ||||
| 			out.Set(reflect.New(in.Elem().Type())) | ||||
| 		} | ||||
| 		mergeAny(out.Elem(), in.Elem(), true, nil) | ||||
| 	case reflect.Slice: | ||||
| 		if in.IsNil() { | ||||
| 			return | ||||
| 		} | ||||
| 		if in.Type().Elem().Kind() == reflect.Uint8 { | ||||
| 			// []byte is a scalar bytes field, not a repeated field. | ||||
|  | ||||
| 			// Edge case: if this is in a proto3 message, a zero length | ||||
| 			// bytes field is considered the zero value, and should not | ||||
| 			// be merged. | ||||
| 			if prop != nil && prop.proto3 && in.Len() == 0 { | ||||
| 				return | ||||
| 			} | ||||
|  | ||||
| 			// Make a deep copy. | ||||
| 			// Append to []byte{} instead of []byte(nil) so that we never end up | ||||
| 			// with a nil result. | ||||
| 			out.SetBytes(append([]byte{}, in.Bytes()...)) | ||||
| 			return | ||||
| 		} | ||||
| 		n := in.Len() | ||||
| 		if out.IsNil() { | ||||
| 			out.Set(reflect.MakeSlice(in.Type(), 0, n)) | ||||
| 		} | ||||
| 		switch in.Type().Elem().Kind() { | ||||
| 		case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, | ||||
| 			reflect.String, reflect.Uint32, reflect.Uint64: | ||||
| 			out.Set(reflect.AppendSlice(out, in)) | ||||
| 		default: | ||||
| 			for i := 0; i < n; i++ { | ||||
| 				x := reflect.Indirect(reflect.New(in.Type().Elem())) | ||||
| 				mergeAny(x, in.Index(i), false, nil) | ||||
| 				out.Set(reflect.Append(out, x)) | ||||
| 			} | ||||
| 		} | ||||
| 	case reflect.Struct: | ||||
| 		mergeStruct(out, in) | ||||
| 	default: | ||||
| 		// unknown type, so not a protocol buffer | ||||
| 		log.Printf("proto: don't know how to copy %v", in) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeExtension(out, in map[int32]Extension) { | ||||
| 	for extNum, eIn := range in { | ||||
| 		eOut := Extension{desc: eIn.desc} | ||||
| 		if eIn.value != nil { | ||||
| 			v := reflect.New(reflect.TypeOf(eIn.value)).Elem() | ||||
| 			mergeAny(v, reflect.ValueOf(eIn.value), false, nil) | ||||
| 			eOut.value = v.Interface() | ||||
| 		} | ||||
| 		if eIn.enc != nil { | ||||
| 			eOut.enc = make([]byte, len(eIn.enc)) | ||||
| 			copy(eOut.enc, eIn.enc) | ||||
| 		} | ||||
|  | ||||
| 		out[extNum] = eOut | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										300
									
								
								vendor/github.com/golang/protobuf/proto/clone_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										300
									
								
								vendor/github.com/golang/protobuf/proto/clone_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,300 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2011 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto_test | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
|  | ||||
| 	proto3pb "github.com/golang/protobuf/proto/proto3_proto" | ||||
| 	pb "github.com/golang/protobuf/proto/testdata" | ||||
| ) | ||||
|  | ||||
| var cloneTestMessage = &pb.MyMessage{ | ||||
| 	Count: proto.Int32(42), | ||||
| 	Name:  proto.String("Dave"), | ||||
| 	Pet:   []string{"bunny", "kitty", "horsey"}, | ||||
| 	Inner: &pb.InnerMessage{ | ||||
| 		Host:      proto.String("niles"), | ||||
| 		Port:      proto.Int32(9099), | ||||
| 		Connected: proto.Bool(true), | ||||
| 	}, | ||||
| 	Others: []*pb.OtherMessage{ | ||||
| 		{ | ||||
| 			Value: []byte("some bytes"), | ||||
| 		}, | ||||
| 	}, | ||||
| 	Somegroup: &pb.MyMessage_SomeGroup{ | ||||
| 		GroupField: proto.Int32(6), | ||||
| 	}, | ||||
| 	RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	ext := &pb.Ext{ | ||||
| 		Data: proto.String("extension"), | ||||
| 	} | ||||
| 	if err := proto.SetExtension(cloneTestMessage, pb.E_Ext_More, ext); err != nil { | ||||
| 		panic("SetExtension: " + err.Error()) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestClone(t *testing.T) { | ||||
| 	m := proto.Clone(cloneTestMessage).(*pb.MyMessage) | ||||
| 	if !proto.Equal(m, cloneTestMessage) { | ||||
| 		t.Errorf("Clone(%v) = %v", cloneTestMessage, m) | ||||
| 	} | ||||
|  | ||||
| 	// Verify it was a deep copy. | ||||
| 	*m.Inner.Port++ | ||||
| 	if proto.Equal(m, cloneTestMessage) { | ||||
| 		t.Error("Mutating clone changed the original") | ||||
| 	} | ||||
| 	// Byte fields and repeated fields should be copied. | ||||
| 	if &m.Pet[0] == &cloneTestMessage.Pet[0] { | ||||
| 		t.Error("Pet: repeated field not copied") | ||||
| 	} | ||||
| 	if &m.Others[0] == &cloneTestMessage.Others[0] { | ||||
| 		t.Error("Others: repeated field not copied") | ||||
| 	} | ||||
| 	if &m.Others[0].Value[0] == &cloneTestMessage.Others[0].Value[0] { | ||||
| 		t.Error("Others[0].Value: bytes field not copied") | ||||
| 	} | ||||
| 	if &m.RepBytes[0] == &cloneTestMessage.RepBytes[0] { | ||||
| 		t.Error("RepBytes: repeated field not copied") | ||||
| 	} | ||||
| 	if &m.RepBytes[0][0] == &cloneTestMessage.RepBytes[0][0] { | ||||
| 		t.Error("RepBytes[0]: bytes field not copied") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestCloneNil(t *testing.T) { | ||||
| 	var m *pb.MyMessage | ||||
| 	if c := proto.Clone(m); !proto.Equal(m, c) { | ||||
| 		t.Errorf("Clone(%v) = %v", m, c) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var mergeTests = []struct { | ||||
| 	src, dst, want proto.Message | ||||
| }{ | ||||
| 	{ | ||||
| 		src: &pb.MyMessage{ | ||||
| 			Count: proto.Int32(42), | ||||
| 		}, | ||||
| 		dst: &pb.MyMessage{ | ||||
| 			Name: proto.String("Dave"), | ||||
| 		}, | ||||
| 		want: &pb.MyMessage{ | ||||
| 			Count: proto.Int32(42), | ||||
| 			Name:  proto.String("Dave"), | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ | ||||
| 		src: &pb.MyMessage{ | ||||
| 			Inner: &pb.InnerMessage{ | ||||
| 				Host:      proto.String("hey"), | ||||
| 				Connected: proto.Bool(true), | ||||
| 			}, | ||||
| 			Pet: []string{"horsey"}, | ||||
| 			Others: []*pb.OtherMessage{ | ||||
| 				{ | ||||
| 					Value: []byte("some bytes"), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		dst: &pb.MyMessage{ | ||||
| 			Inner: &pb.InnerMessage{ | ||||
| 				Host: proto.String("niles"), | ||||
| 				Port: proto.Int32(9099), | ||||
| 			}, | ||||
| 			Pet: []string{"bunny", "kitty"}, | ||||
| 			Others: []*pb.OtherMessage{ | ||||
| 				{ | ||||
| 					Key: proto.Int64(31415926535), | ||||
| 				}, | ||||
| 				{ | ||||
| 					// Explicitly test a src=nil field | ||||
| 					Inner: nil, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		want: &pb.MyMessage{ | ||||
| 			Inner: &pb.InnerMessage{ | ||||
| 				Host:      proto.String("hey"), | ||||
| 				Connected: proto.Bool(true), | ||||
| 				Port:      proto.Int32(9099), | ||||
| 			}, | ||||
| 			Pet: []string{"bunny", "kitty", "horsey"}, | ||||
| 			Others: []*pb.OtherMessage{ | ||||
| 				{ | ||||
| 					Key: proto.Int64(31415926535), | ||||
| 				}, | ||||
| 				{}, | ||||
| 				{ | ||||
| 					Value: []byte("some bytes"), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ | ||||
| 		src: &pb.MyMessage{ | ||||
| 			RepBytes: [][]byte{[]byte("wow")}, | ||||
| 		}, | ||||
| 		dst: &pb.MyMessage{ | ||||
| 			Somegroup: &pb.MyMessage_SomeGroup{ | ||||
| 				GroupField: proto.Int32(6), | ||||
| 			}, | ||||
| 			RepBytes: [][]byte{[]byte("sham")}, | ||||
| 		}, | ||||
| 		want: &pb.MyMessage{ | ||||
| 			Somegroup: &pb.MyMessage_SomeGroup{ | ||||
| 				GroupField: proto.Int32(6), | ||||
| 			}, | ||||
| 			RepBytes: [][]byte{[]byte("sham"), []byte("wow")}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	// Check that a scalar bytes field replaces rather than appends. | ||||
| 	{ | ||||
| 		src:  &pb.OtherMessage{Value: []byte("foo")}, | ||||
| 		dst:  &pb.OtherMessage{Value: []byte("bar")}, | ||||
| 		want: &pb.OtherMessage{Value: []byte("foo")}, | ||||
| 	}, | ||||
| 	{ | ||||
| 		src: &pb.MessageWithMap{ | ||||
| 			NameMapping: map[int32]string{6: "Nigel"}, | ||||
| 			MsgMapping: map[int64]*pb.FloatingPoint{ | ||||
| 				0x4001: &pb.FloatingPoint{F: proto.Float64(2.0)}, | ||||
| 				0x4002: &pb.FloatingPoint{ | ||||
| 					F: proto.Float64(2.0), | ||||
| 				}, | ||||
| 			}, | ||||
| 			ByteMapping: map[bool][]byte{true: []byte("wowsa")}, | ||||
| 		}, | ||||
| 		dst: &pb.MessageWithMap{ | ||||
| 			NameMapping: map[int32]string{ | ||||
| 				6: "Bruce", // should be overwritten | ||||
| 				7: "Andrew", | ||||
| 			}, | ||||
| 			MsgMapping: map[int64]*pb.FloatingPoint{ | ||||
| 				0x4002: &pb.FloatingPoint{ | ||||
| 					F:     proto.Float64(3.0), | ||||
| 					Exact: proto.Bool(true), | ||||
| 				}, // the entire message should be overwritten | ||||
| 			}, | ||||
| 		}, | ||||
| 		want: &pb.MessageWithMap{ | ||||
| 			NameMapping: map[int32]string{ | ||||
| 				6: "Nigel", | ||||
| 				7: "Andrew", | ||||
| 			}, | ||||
| 			MsgMapping: map[int64]*pb.FloatingPoint{ | ||||
| 				0x4001: &pb.FloatingPoint{F: proto.Float64(2.0)}, | ||||
| 				0x4002: &pb.FloatingPoint{ | ||||
| 					F: proto.Float64(2.0), | ||||
| 				}, | ||||
| 			}, | ||||
| 			ByteMapping: map[bool][]byte{true: []byte("wowsa")}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	// proto3 shouldn't merge zero values, | ||||
| 	// in the same way that proto2 shouldn't merge nils. | ||||
| 	{ | ||||
| 		src: &proto3pb.Message{ | ||||
| 			Name: "Aaron", | ||||
| 			Data: []byte(""), // zero value, but not nil | ||||
| 		}, | ||||
| 		dst: &proto3pb.Message{ | ||||
| 			HeightInCm: 176, | ||||
| 			Data:       []byte("texas!"), | ||||
| 		}, | ||||
| 		want: &proto3pb.Message{ | ||||
| 			Name:       "Aaron", | ||||
| 			HeightInCm: 176, | ||||
| 			Data:       []byte("texas!"), | ||||
| 		}, | ||||
| 	}, | ||||
| 	// Oneof fields should merge by assignment. | ||||
| 	{ | ||||
| 		src: &pb.Communique{ | ||||
| 			Union: &pb.Communique_Number{41}, | ||||
| 		}, | ||||
| 		dst: &pb.Communique{ | ||||
| 			Union: &pb.Communique_Name{"Bobby Tables"}, | ||||
| 		}, | ||||
| 		want: &pb.Communique{ | ||||
| 			Union: &pb.Communique_Number{41}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	// Oneof nil is the same as not set. | ||||
| 	{ | ||||
| 		src: &pb.Communique{}, | ||||
| 		dst: &pb.Communique{ | ||||
| 			Union: &pb.Communique_Name{"Bobby Tables"}, | ||||
| 		}, | ||||
| 		want: &pb.Communique{ | ||||
| 			Union: &pb.Communique_Name{"Bobby Tables"}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ | ||||
| 		src: &proto3pb.Message{ | ||||
| 			Terrain: map[string]*proto3pb.Nested{ | ||||
| 				"kay_a": &proto3pb.Nested{Cute: true},      // replace | ||||
| 				"kay_b": &proto3pb.Nested{Bunny: "rabbit"}, // insert | ||||
| 			}, | ||||
| 		}, | ||||
| 		dst: &proto3pb.Message{ | ||||
| 			Terrain: map[string]*proto3pb.Nested{ | ||||
| 				"kay_a": &proto3pb.Nested{Bunny: "lost"},  // replaced | ||||
| 				"kay_c": &proto3pb.Nested{Bunny: "bunny"}, // keep | ||||
| 			}, | ||||
| 		}, | ||||
| 		want: &proto3pb.Message{ | ||||
| 			Terrain: map[string]*proto3pb.Nested{ | ||||
| 				"kay_a": &proto3pb.Nested{Cute: true}, | ||||
| 				"kay_b": &proto3pb.Nested{Bunny: "rabbit"}, | ||||
| 				"kay_c": &proto3pb.Nested{Bunny: "bunny"}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func TestMerge(t *testing.T) { | ||||
| 	for _, m := range mergeTests { | ||||
| 		got := proto.Clone(m.dst) | ||||
| 		proto.Merge(got, m.src) | ||||
| 		if !proto.Equal(got, m.want) { | ||||
| 			t.Errorf("Merge(%v, %v)\n got %v\nwant %v\n", m.dst, m.src, got, m.want) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										970
									
								
								vendor/github.com/golang/protobuf/proto/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										970
									
								
								vendor/github.com/golang/protobuf/proto/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,970 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto | ||||
|  | ||||
| /* | ||||
|  * Routines for decoding protocol buffer data to construct in-memory representations. | ||||
|  */ | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"reflect" | ||||
| ) | ||||
|  | ||||
| // errOverflow is returned when an integer is too large to be represented. | ||||
| var errOverflow = errors.New("proto: integer overflow") | ||||
|  | ||||
| // ErrInternalBadWireType is returned by generated code when an incorrect | ||||
| // wire type is encountered. It does not get returned to user code. | ||||
| var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") | ||||
|  | ||||
| // The fundamental decoders that interpret bytes on the wire. | ||||
| // Those that take integer types all return uint64 and are | ||||
| // therefore of type valueDecoder. | ||||
|  | ||||
| // DecodeVarint reads a varint-encoded integer from the slice. | ||||
| // It returns the integer and the number of bytes consumed, or | ||||
| // zero if there is not enough. | ||||
| // This is the format for the | ||||
| // int32, int64, uint32, uint64, bool, and enum | ||||
| // protocol buffer types. | ||||
| func DecodeVarint(buf []byte) (x uint64, n int) { | ||||
| 	for shift := uint(0); shift < 64; shift += 7 { | ||||
| 		if n >= len(buf) { | ||||
| 			return 0, 0 | ||||
| 		} | ||||
| 		b := uint64(buf[n]) | ||||
| 		n++ | ||||
| 		x |= (b & 0x7F) << shift | ||||
| 		if (b & 0x80) == 0 { | ||||
| 			return x, n | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// The number is too large to represent in a 64-bit value. | ||||
| 	return 0, 0 | ||||
| } | ||||
|  | ||||
| func (p *Buffer) decodeVarintSlow() (x uint64, err error) { | ||||
| 	i := p.index | ||||
| 	l := len(p.buf) | ||||
|  | ||||
| 	for shift := uint(0); shift < 64; shift += 7 { | ||||
| 		if i >= l { | ||||
| 			err = io.ErrUnexpectedEOF | ||||
| 			return | ||||
| 		} | ||||
| 		b := p.buf[i] | ||||
| 		i++ | ||||
| 		x |= (uint64(b) & 0x7F) << shift | ||||
| 		if b < 0x80 { | ||||
| 			p.index = i | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// The number is too large to represent in a 64-bit value. | ||||
| 	err = errOverflow | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // DecodeVarint reads a varint-encoded integer from the Buffer. | ||||
| // This is the format for the | ||||
| // int32, int64, uint32, uint64, bool, and enum | ||||
| // protocol buffer types. | ||||
| func (p *Buffer) DecodeVarint() (x uint64, err error) { | ||||
| 	i := p.index | ||||
| 	buf := p.buf | ||||
|  | ||||
| 	if i >= len(buf) { | ||||
| 		return 0, io.ErrUnexpectedEOF | ||||
| 	} else if buf[i] < 0x80 { | ||||
| 		p.index++ | ||||
| 		return uint64(buf[i]), nil | ||||
| 	} else if len(buf)-i < 10 { | ||||
| 		return p.decodeVarintSlow() | ||||
| 	} | ||||
|  | ||||
| 	var b uint64 | ||||
| 	// we already checked the first byte | ||||
| 	x = uint64(buf[i]) - 0x80 | ||||
| 	i++ | ||||
|  | ||||
| 	b = uint64(buf[i]) | ||||
| 	i++ | ||||
| 	x += b << 7 | ||||
| 	if b&0x80 == 0 { | ||||
| 		goto done | ||||
| 	} | ||||
| 	x -= 0x80 << 7 | ||||
|  | ||||
| 	b = uint64(buf[i]) | ||||
| 	i++ | ||||
| 	x += b << 14 | ||||
| 	if b&0x80 == 0 { | ||||
| 		goto done | ||||
| 	} | ||||
| 	x -= 0x80 << 14 | ||||
|  | ||||
| 	b = uint64(buf[i]) | ||||
| 	i++ | ||||
| 	x += b << 21 | ||||
| 	if b&0x80 == 0 { | ||||
| 		goto done | ||||
| 	} | ||||
| 	x -= 0x80 << 21 | ||||
|  | ||||
| 	b = uint64(buf[i]) | ||||
| 	i++ | ||||
| 	x += b << 28 | ||||
| 	if b&0x80 == 0 { | ||||
| 		goto done | ||||
| 	} | ||||
| 	x -= 0x80 << 28 | ||||
|  | ||||
| 	b = uint64(buf[i]) | ||||
| 	i++ | ||||
| 	x += b << 35 | ||||
| 	if b&0x80 == 0 { | ||||
| 		goto done | ||||
| 	} | ||||
| 	x -= 0x80 << 35 | ||||
|  | ||||
| 	b = uint64(buf[i]) | ||||
| 	i++ | ||||
| 	x += b << 42 | ||||
| 	if b&0x80 == 0 { | ||||
| 		goto done | ||||
| 	} | ||||
| 	x -= 0x80 << 42 | ||||
|  | ||||
| 	b = uint64(buf[i]) | ||||
| 	i++ | ||||
| 	x += b << 49 | ||||
| 	if b&0x80 == 0 { | ||||
| 		goto done | ||||
| 	} | ||||
| 	x -= 0x80 << 49 | ||||
|  | ||||
| 	b = uint64(buf[i]) | ||||
| 	i++ | ||||
| 	x += b << 56 | ||||
| 	if b&0x80 == 0 { | ||||
| 		goto done | ||||
| 	} | ||||
| 	x -= 0x80 << 56 | ||||
|  | ||||
| 	b = uint64(buf[i]) | ||||
| 	i++ | ||||
| 	x += b << 63 | ||||
| 	if b&0x80 == 0 { | ||||
| 		goto done | ||||
| 	} | ||||
| 	// x -= 0x80 << 63 // Always zero. | ||||
|  | ||||
| 	return 0, errOverflow | ||||
|  | ||||
| done: | ||||
| 	p.index = i | ||||
| 	return x, nil | ||||
| } | ||||
|  | ||||
| // DecodeFixed64 reads a 64-bit integer from the Buffer. | ||||
| // This is the format for the | ||||
| // fixed64, sfixed64, and double protocol buffer types. | ||||
| func (p *Buffer) DecodeFixed64() (x uint64, err error) { | ||||
| 	// x, err already 0 | ||||
| 	i := p.index + 8 | ||||
| 	if i < 0 || i > len(p.buf) { | ||||
| 		err = io.ErrUnexpectedEOF | ||||
| 		return | ||||
| 	} | ||||
| 	p.index = i | ||||
|  | ||||
| 	x = uint64(p.buf[i-8]) | ||||
| 	x |= uint64(p.buf[i-7]) << 8 | ||||
| 	x |= uint64(p.buf[i-6]) << 16 | ||||
| 	x |= uint64(p.buf[i-5]) << 24 | ||||
| 	x |= uint64(p.buf[i-4]) << 32 | ||||
| 	x |= uint64(p.buf[i-3]) << 40 | ||||
| 	x |= uint64(p.buf[i-2]) << 48 | ||||
| 	x |= uint64(p.buf[i-1]) << 56 | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // DecodeFixed32 reads a 32-bit integer from the Buffer. | ||||
| // This is the format for the | ||||
| // fixed32, sfixed32, and float protocol buffer types. | ||||
| func (p *Buffer) DecodeFixed32() (x uint64, err error) { | ||||
| 	// x, err already 0 | ||||
| 	i := p.index + 4 | ||||
| 	if i < 0 || i > len(p.buf) { | ||||
| 		err = io.ErrUnexpectedEOF | ||||
| 		return | ||||
| 	} | ||||
| 	p.index = i | ||||
|  | ||||
| 	x = uint64(p.buf[i-4]) | ||||
| 	x |= uint64(p.buf[i-3]) << 8 | ||||
| 	x |= uint64(p.buf[i-2]) << 16 | ||||
| 	x |= uint64(p.buf[i-1]) << 24 | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // DecodeZigzag64 reads a zigzag-encoded 64-bit integer | ||||
| // from the Buffer. | ||||
| // This is the format used for the sint64 protocol buffer type. | ||||
| func (p *Buffer) DecodeZigzag64() (x uint64, err error) { | ||||
| 	x, err = p.DecodeVarint() | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // DecodeZigzag32 reads a zigzag-encoded 32-bit integer | ||||
| // from  the Buffer. | ||||
| // This is the format used for the sint32 protocol buffer type. | ||||
| func (p *Buffer) DecodeZigzag32() (x uint64, err error) { | ||||
| 	x, err = p.DecodeVarint() | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // These are not ValueDecoders: they produce an array of bytes or a string. | ||||
| // bytes, embedded messages | ||||
|  | ||||
| // DecodeRawBytes reads a count-delimited byte buffer from the Buffer. | ||||
| // This is the format used for the bytes protocol buffer | ||||
| // type and for embedded messages. | ||||
| func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { | ||||
| 	n, err := p.DecodeVarint() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	nb := int(n) | ||||
| 	if nb < 0 { | ||||
| 		return nil, fmt.Errorf("proto: bad byte length %d", nb) | ||||
| 	} | ||||
| 	end := p.index + nb | ||||
| 	if end < p.index || end > len(p.buf) { | ||||
| 		return nil, io.ErrUnexpectedEOF | ||||
| 	} | ||||
|  | ||||
| 	if !alloc { | ||||
| 		// todo: check if can get more uses of alloc=false | ||||
| 		buf = p.buf[p.index:end] | ||||
| 		p.index += nb | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	buf = make([]byte, nb) | ||||
| 	copy(buf, p.buf[p.index:]) | ||||
| 	p.index += nb | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // DecodeStringBytes reads an encoded string from the Buffer. | ||||
| // This is the format used for the proto2 string type. | ||||
| func (p *Buffer) DecodeStringBytes() (s string, err error) { | ||||
| 	buf, err := p.DecodeRawBytes(false) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	return string(buf), nil | ||||
| } | ||||
|  | ||||
| // Skip the next item in the buffer. Its wire type is decoded and presented as an argument. | ||||
| // If the protocol buffer has extensions, and the field matches, add it as an extension. | ||||
| // Otherwise, if the XXX_unrecognized field exists, append the skipped data there. | ||||
| func (o *Buffer) skipAndSave(t reflect.Type, tag, wire int, base structPointer, unrecField field) error { | ||||
| 	oi := o.index | ||||
|  | ||||
| 	err := o.skip(t, tag, wire) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if !unrecField.IsValid() { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	ptr := structPointer_Bytes(base, unrecField) | ||||
|  | ||||
| 	// Add the skipped field to struct field | ||||
| 	obuf := o.buf | ||||
|  | ||||
| 	o.buf = *ptr | ||||
| 	o.EncodeVarint(uint64(tag<<3 | wire)) | ||||
| 	*ptr = append(o.buf, obuf[oi:o.index]...) | ||||
|  | ||||
| 	o.buf = obuf | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Skip the next item in the buffer. Its wire type is decoded and presented as an argument. | ||||
| func (o *Buffer) skip(t reflect.Type, tag, wire int) error { | ||||
|  | ||||
| 	var u uint64 | ||||
| 	var err error | ||||
|  | ||||
| 	switch wire { | ||||
| 	case WireVarint: | ||||
| 		_, err = o.DecodeVarint() | ||||
| 	case WireFixed64: | ||||
| 		_, err = o.DecodeFixed64() | ||||
| 	case WireBytes: | ||||
| 		_, err = o.DecodeRawBytes(false) | ||||
| 	case WireFixed32: | ||||
| 		_, err = o.DecodeFixed32() | ||||
| 	case WireStartGroup: | ||||
| 		for { | ||||
| 			u, err = o.DecodeVarint() | ||||
| 			if err != nil { | ||||
| 				break | ||||
| 			} | ||||
| 			fwire := int(u & 0x7) | ||||
| 			if fwire == WireEndGroup { | ||||
| 				break | ||||
| 			} | ||||
| 			ftag := int(u >> 3) | ||||
| 			err = o.skip(t, ftag, fwire) | ||||
| 			if err != nil { | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	default: | ||||
| 		err = fmt.Errorf("proto: can't skip unknown wire type %d for %s", wire, t) | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // Unmarshaler is the interface representing objects that can | ||||
| // unmarshal themselves.  The method should reset the receiver before | ||||
| // decoding starts.  The argument points to data that may be | ||||
| // overwritten, so implementations should not keep references to the | ||||
| // buffer. | ||||
| type Unmarshaler interface { | ||||
| 	Unmarshal([]byte) error | ||||
| } | ||||
|  | ||||
| // Unmarshal parses the protocol buffer representation in buf and places the | ||||
| // decoded result in pb.  If the struct underlying pb does not match | ||||
| // the data in buf, the results can be unpredictable. | ||||
| // | ||||
| // Unmarshal resets pb before starting to unmarshal, so any | ||||
| // existing data in pb is always removed. Use UnmarshalMerge | ||||
| // to preserve and append to existing data. | ||||
| func Unmarshal(buf []byte, pb Message) error { | ||||
| 	pb.Reset() | ||||
| 	return UnmarshalMerge(buf, pb) | ||||
| } | ||||
|  | ||||
| // UnmarshalMerge parses the protocol buffer representation in buf and | ||||
| // writes the decoded result to pb.  If the struct underlying pb does not match | ||||
| // the data in buf, the results can be unpredictable. | ||||
| // | ||||
| // UnmarshalMerge merges into existing data in pb. | ||||
| // Most code should use Unmarshal instead. | ||||
| func UnmarshalMerge(buf []byte, pb Message) error { | ||||
| 	// If the object can unmarshal itself, let it. | ||||
| 	if u, ok := pb.(Unmarshaler); ok { | ||||
| 		return u.Unmarshal(buf) | ||||
| 	} | ||||
| 	return NewBuffer(buf).Unmarshal(pb) | ||||
| } | ||||
|  | ||||
| // DecodeMessage reads a count-delimited message from the Buffer. | ||||
| func (p *Buffer) DecodeMessage(pb Message) error { | ||||
| 	enc, err := p.DecodeRawBytes(false) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return NewBuffer(enc).Unmarshal(pb) | ||||
| } | ||||
|  | ||||
| // DecodeGroup reads a tag-delimited group from the Buffer. | ||||
| func (p *Buffer) DecodeGroup(pb Message) error { | ||||
| 	typ, base, err := getbase(pb) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), true, base) | ||||
| } | ||||
|  | ||||
| // Unmarshal parses the protocol buffer representation in the | ||||
| // Buffer and places the decoded result in pb.  If the struct | ||||
| // underlying pb does not match the data in the buffer, the results can be | ||||
| // unpredictable. | ||||
| // | ||||
| // Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. | ||||
| func (p *Buffer) Unmarshal(pb Message) error { | ||||
| 	// If the object can unmarshal itself, let it. | ||||
| 	if u, ok := pb.(Unmarshaler); ok { | ||||
| 		err := u.Unmarshal(p.buf[p.index:]) | ||||
| 		p.index = len(p.buf) | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	typ, base, err := getbase(pb) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	err = p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), false, base) | ||||
|  | ||||
| 	if collectStats { | ||||
| 		stats.Decode++ | ||||
| 	} | ||||
|  | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // unmarshalType does the work of unmarshaling a structure. | ||||
| func (o *Buffer) unmarshalType(st reflect.Type, prop *StructProperties, is_group bool, base structPointer) error { | ||||
| 	var state errorState | ||||
| 	required, reqFields := prop.reqCount, uint64(0) | ||||
|  | ||||
| 	var err error | ||||
| 	for err == nil && o.index < len(o.buf) { | ||||
| 		oi := o.index | ||||
| 		var u uint64 | ||||
| 		u, err = o.DecodeVarint() | ||||
| 		if err != nil { | ||||
| 			break | ||||
| 		} | ||||
| 		wire := int(u & 0x7) | ||||
| 		if wire == WireEndGroup { | ||||
| 			if is_group { | ||||
| 				if required > 0 { | ||||
| 					// Not enough information to determine the exact field. | ||||
| 					// (See below.) | ||||
| 					return &RequiredNotSetError{"{Unknown}"} | ||||
| 				} | ||||
| 				return nil // input is satisfied | ||||
| 			} | ||||
| 			return fmt.Errorf("proto: %s: wiretype end group for non-group", st) | ||||
| 		} | ||||
| 		tag := int(u >> 3) | ||||
| 		if tag <= 0 { | ||||
| 			return fmt.Errorf("proto: %s: illegal tag %d (wire type %d)", st, tag, wire) | ||||
| 		} | ||||
| 		fieldnum, ok := prop.decoderTags.get(tag) | ||||
| 		if !ok { | ||||
| 			// Maybe it's an extension? | ||||
| 			if prop.extendable { | ||||
| 				if e, _ := extendable(structPointer_Interface(base, st)); isExtensionField(e, int32(tag)) { | ||||
| 					if err = o.skip(st, tag, wire); err == nil { | ||||
| 						extmap := e.extensionsWrite() | ||||
| 						ext := extmap[int32(tag)] // may be missing | ||||
| 						ext.enc = append(ext.enc, o.buf[oi:o.index]...) | ||||
| 						extmap[int32(tag)] = ext | ||||
| 					} | ||||
| 					continue | ||||
| 				} | ||||
| 			} | ||||
| 			// Maybe it's a oneof? | ||||
| 			if prop.oneofUnmarshaler != nil { | ||||
| 				m := structPointer_Interface(base, st).(Message) | ||||
| 				// First return value indicates whether tag is a oneof field. | ||||
| 				ok, err = prop.oneofUnmarshaler(m, tag, wire, o) | ||||
| 				if err == ErrInternalBadWireType { | ||||
| 					// Map the error to something more descriptive. | ||||
| 					// Do the formatting here to save generated code space. | ||||
| 					err = fmt.Errorf("bad wiretype for oneof field in %T", m) | ||||
| 				} | ||||
| 				if ok { | ||||
| 					continue | ||||
| 				} | ||||
| 			} | ||||
| 			err = o.skipAndSave(st, tag, wire, base, prop.unrecField) | ||||
| 			continue | ||||
| 		} | ||||
| 		p := prop.Prop[fieldnum] | ||||
|  | ||||
| 		if p.dec == nil { | ||||
| 			fmt.Fprintf(os.Stderr, "proto: no protobuf decoder for %s.%s\n", st, st.Field(fieldnum).Name) | ||||
| 			continue | ||||
| 		} | ||||
| 		dec := p.dec | ||||
| 		if wire != WireStartGroup && wire != p.WireType { | ||||
| 			if wire == WireBytes && p.packedDec != nil { | ||||
| 				// a packable field | ||||
| 				dec = p.packedDec | ||||
| 			} else { | ||||
| 				err = fmt.Errorf("proto: bad wiretype for field %s.%s: got wiretype %d, want %d", st, st.Field(fieldnum).Name, wire, p.WireType) | ||||
| 				continue | ||||
| 			} | ||||
| 		} | ||||
| 		decErr := dec(o, p, base) | ||||
| 		if decErr != nil && !state.shouldContinue(decErr, p) { | ||||
| 			err = decErr | ||||
| 		} | ||||
| 		if err == nil && p.Required { | ||||
| 			// Successfully decoded a required field. | ||||
| 			if tag <= 64 { | ||||
| 				// use bitmap for fields 1-64 to catch field reuse. | ||||
| 				var mask uint64 = 1 << uint64(tag-1) | ||||
| 				if reqFields&mask == 0 { | ||||
| 					// new required field | ||||
| 					reqFields |= mask | ||||
| 					required-- | ||||
| 				} | ||||
| 			} else { | ||||
| 				// This is imprecise. It can be fooled by a required field | ||||
| 				// with a tag > 64 that is encoded twice; that's very rare. | ||||
| 				// A fully correct implementation would require allocating | ||||
| 				// a data structure, which we would like to avoid. | ||||
| 				required-- | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if err == nil { | ||||
| 		if is_group { | ||||
| 			return io.ErrUnexpectedEOF | ||||
| 		} | ||||
| 		if state.err != nil { | ||||
| 			return state.err | ||||
| 		} | ||||
| 		if required > 0 { | ||||
| 			// Not enough information to determine the exact field. If we use extra | ||||
| 			// CPU, we could determine the field only if the missing required field | ||||
| 			// has a tag <= 64 and we check reqFields. | ||||
| 			return &RequiredNotSetError{"{Unknown}"} | ||||
| 		} | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // Individual type decoders | ||||
| // For each, | ||||
| //	u is the decoded value, | ||||
| //	v is a pointer to the field (pointer) in the struct | ||||
|  | ||||
| // Sizes of the pools to allocate inside the Buffer. | ||||
| // The goal is modest amortization and allocation | ||||
| // on at least 16-byte boundaries. | ||||
| const ( | ||||
| 	boolPoolSize   = 16 | ||||
| 	uint32PoolSize = 8 | ||||
| 	uint64PoolSize = 4 | ||||
| ) | ||||
|  | ||||
| // Decode a bool. | ||||
| func (o *Buffer) dec_bool(p *Properties, base structPointer) error { | ||||
| 	u, err := p.valDec(o) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if len(o.bools) == 0 { | ||||
| 		o.bools = make([]bool, boolPoolSize) | ||||
| 	} | ||||
| 	o.bools[0] = u != 0 | ||||
| 	*structPointer_Bool(base, p.field) = &o.bools[0] | ||||
| 	o.bools = o.bools[1:] | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (o *Buffer) dec_proto3_bool(p *Properties, base structPointer) error { | ||||
| 	u, err := p.valDec(o) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*structPointer_BoolVal(base, p.field) = u != 0 | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode an int32. | ||||
| func (o *Buffer) dec_int32(p *Properties, base structPointer) error { | ||||
| 	u, err := p.valDec(o) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	word32_Set(structPointer_Word32(base, p.field), o, uint32(u)) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (o *Buffer) dec_proto3_int32(p *Properties, base structPointer) error { | ||||
| 	u, err := p.valDec(o) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	word32Val_Set(structPointer_Word32Val(base, p.field), uint32(u)) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode an int64. | ||||
| func (o *Buffer) dec_int64(p *Properties, base structPointer) error { | ||||
| 	u, err := p.valDec(o) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	word64_Set(structPointer_Word64(base, p.field), o, u) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (o *Buffer) dec_proto3_int64(p *Properties, base structPointer) error { | ||||
| 	u, err := p.valDec(o) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	word64Val_Set(structPointer_Word64Val(base, p.field), o, u) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode a string. | ||||
| func (o *Buffer) dec_string(p *Properties, base structPointer) error { | ||||
| 	s, err := o.DecodeStringBytes() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*structPointer_String(base, p.field) = &s | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (o *Buffer) dec_proto3_string(p *Properties, base structPointer) error { | ||||
| 	s, err := o.DecodeStringBytes() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*structPointer_StringVal(base, p.field) = s | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode a slice of bytes ([]byte). | ||||
| func (o *Buffer) dec_slice_byte(p *Properties, base structPointer) error { | ||||
| 	b, err := o.DecodeRawBytes(true) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*structPointer_Bytes(base, p.field) = b | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode a slice of bools ([]bool). | ||||
| func (o *Buffer) dec_slice_bool(p *Properties, base structPointer) error { | ||||
| 	u, err := p.valDec(o) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	v := structPointer_BoolSlice(base, p.field) | ||||
| 	*v = append(*v, u != 0) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode a slice of bools ([]bool) in packed format. | ||||
| func (o *Buffer) dec_slice_packed_bool(p *Properties, base structPointer) error { | ||||
| 	v := structPointer_BoolSlice(base, p.field) | ||||
|  | ||||
| 	nn, err := o.DecodeVarint() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	nb := int(nn) // number of bytes of encoded bools | ||||
| 	fin := o.index + nb | ||||
| 	if fin < o.index { | ||||
| 		return errOverflow | ||||
| 	} | ||||
|  | ||||
| 	y := *v | ||||
| 	for o.index < fin { | ||||
| 		u, err := p.valDec(o) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		y = append(y, u != 0) | ||||
| 	} | ||||
|  | ||||
| 	*v = y | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode a slice of int32s ([]int32). | ||||
| func (o *Buffer) dec_slice_int32(p *Properties, base structPointer) error { | ||||
| 	u, err := p.valDec(o) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	structPointer_Word32Slice(base, p.field).Append(uint32(u)) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode a slice of int32s ([]int32) in packed format. | ||||
| func (o *Buffer) dec_slice_packed_int32(p *Properties, base structPointer) error { | ||||
| 	v := structPointer_Word32Slice(base, p.field) | ||||
|  | ||||
| 	nn, err := o.DecodeVarint() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	nb := int(nn) // number of bytes of encoded int32s | ||||
|  | ||||
| 	fin := o.index + nb | ||||
| 	if fin < o.index { | ||||
| 		return errOverflow | ||||
| 	} | ||||
| 	for o.index < fin { | ||||
| 		u, err := p.valDec(o) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		v.Append(uint32(u)) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode a slice of int64s ([]int64). | ||||
| func (o *Buffer) dec_slice_int64(p *Properties, base structPointer) error { | ||||
| 	u, err := p.valDec(o) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	structPointer_Word64Slice(base, p.field).Append(u) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode a slice of int64s ([]int64) in packed format. | ||||
| func (o *Buffer) dec_slice_packed_int64(p *Properties, base structPointer) error { | ||||
| 	v := structPointer_Word64Slice(base, p.field) | ||||
|  | ||||
| 	nn, err := o.DecodeVarint() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	nb := int(nn) // number of bytes of encoded int64s | ||||
|  | ||||
| 	fin := o.index + nb | ||||
| 	if fin < o.index { | ||||
| 		return errOverflow | ||||
| 	} | ||||
| 	for o.index < fin { | ||||
| 		u, err := p.valDec(o) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		v.Append(u) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode a slice of strings ([]string). | ||||
| func (o *Buffer) dec_slice_string(p *Properties, base structPointer) error { | ||||
| 	s, err := o.DecodeStringBytes() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	v := structPointer_StringSlice(base, p.field) | ||||
| 	*v = append(*v, s) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode a slice of slice of bytes ([][]byte). | ||||
| func (o *Buffer) dec_slice_slice_byte(p *Properties, base structPointer) error { | ||||
| 	b, err := o.DecodeRawBytes(true) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	v := structPointer_BytesSlice(base, p.field) | ||||
| 	*v = append(*v, b) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode a map field. | ||||
| func (o *Buffer) dec_new_map(p *Properties, base structPointer) error { | ||||
| 	raw, err := o.DecodeRawBytes(false) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	oi := o.index       // index at the end of this map entry | ||||
| 	o.index -= len(raw) // move buffer back to start of map entry | ||||
|  | ||||
| 	mptr := structPointer_NewAt(base, p.field, p.mtype) // *map[K]V | ||||
| 	if mptr.Elem().IsNil() { | ||||
| 		mptr.Elem().Set(reflect.MakeMap(mptr.Type().Elem())) | ||||
| 	} | ||||
| 	v := mptr.Elem() // map[K]V | ||||
|  | ||||
| 	// Prepare addressable doubly-indirect placeholders for the key and value types. | ||||
| 	// See enc_new_map for why. | ||||
| 	keyptr := reflect.New(reflect.PtrTo(p.mtype.Key())).Elem() // addressable *K | ||||
| 	keybase := toStructPointer(keyptr.Addr())                  // **K | ||||
|  | ||||
| 	var valbase structPointer | ||||
| 	var valptr reflect.Value | ||||
| 	switch p.mtype.Elem().Kind() { | ||||
| 	case reflect.Slice: | ||||
| 		// []byte | ||||
| 		var dummy []byte | ||||
| 		valptr = reflect.ValueOf(&dummy)  // *[]byte | ||||
| 		valbase = toStructPointer(valptr) // *[]byte | ||||
| 	case reflect.Ptr: | ||||
| 		// message; valptr is **Msg; need to allocate the intermediate pointer | ||||
| 		valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V | ||||
| 		valptr.Set(reflect.New(valptr.Type().Elem())) | ||||
| 		valbase = toStructPointer(valptr) | ||||
| 	default: | ||||
| 		// everything else | ||||
| 		valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V | ||||
| 		valbase = toStructPointer(valptr.Addr())                   // **V | ||||
| 	} | ||||
|  | ||||
| 	// Decode. | ||||
| 	// This parses a restricted wire format, namely the encoding of a message | ||||
| 	// with two fields. See enc_new_map for the format. | ||||
| 	for o.index < oi { | ||||
| 		// tagcode for key and value properties are always a single byte | ||||
| 		// because they have tags 1 and 2. | ||||
| 		tagcode := o.buf[o.index] | ||||
| 		o.index++ | ||||
| 		switch tagcode { | ||||
| 		case p.mkeyprop.tagcode[0]: | ||||
| 			if err := p.mkeyprop.dec(o, p.mkeyprop, keybase); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		case p.mvalprop.tagcode[0]: | ||||
| 			if err := p.mvalprop.dec(o, p.mvalprop, valbase); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		default: | ||||
| 			// TODO: Should we silently skip this instead? | ||||
| 			return fmt.Errorf("proto: bad map data tag %d", raw[0]) | ||||
| 		} | ||||
| 	} | ||||
| 	keyelem, valelem := keyptr.Elem(), valptr.Elem() | ||||
| 	if !keyelem.IsValid() { | ||||
| 		keyelem = reflect.Zero(p.mtype.Key()) | ||||
| 	} | ||||
| 	if !valelem.IsValid() { | ||||
| 		valelem = reflect.Zero(p.mtype.Elem()) | ||||
| 	} | ||||
|  | ||||
| 	v.SetMapIndex(keyelem, valelem) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Decode a group. | ||||
| func (o *Buffer) dec_struct_group(p *Properties, base structPointer) error { | ||||
| 	bas := structPointer_GetStructPointer(base, p.field) | ||||
| 	if structPointer_IsNil(bas) { | ||||
| 		// allocate new nested message | ||||
| 		bas = toStructPointer(reflect.New(p.stype)) | ||||
| 		structPointer_SetStructPointer(base, p.field, bas) | ||||
| 	} | ||||
| 	return o.unmarshalType(p.stype, p.sprop, true, bas) | ||||
| } | ||||
|  | ||||
| // Decode an embedded message. | ||||
| func (o *Buffer) dec_struct_message(p *Properties, base structPointer) (err error) { | ||||
| 	raw, e := o.DecodeRawBytes(false) | ||||
| 	if e != nil { | ||||
| 		return e | ||||
| 	} | ||||
|  | ||||
| 	bas := structPointer_GetStructPointer(base, p.field) | ||||
| 	if structPointer_IsNil(bas) { | ||||
| 		// allocate new nested message | ||||
| 		bas = toStructPointer(reflect.New(p.stype)) | ||||
| 		structPointer_SetStructPointer(base, p.field, bas) | ||||
| 	} | ||||
|  | ||||
| 	// If the object can unmarshal itself, let it. | ||||
| 	if p.isUnmarshaler { | ||||
| 		iv := structPointer_Interface(bas, p.stype) | ||||
| 		return iv.(Unmarshaler).Unmarshal(raw) | ||||
| 	} | ||||
|  | ||||
| 	obuf := o.buf | ||||
| 	oi := o.index | ||||
| 	o.buf = raw | ||||
| 	o.index = 0 | ||||
|  | ||||
| 	err = o.unmarshalType(p.stype, p.sprop, false, bas) | ||||
| 	o.buf = obuf | ||||
| 	o.index = oi | ||||
|  | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // Decode a slice of embedded messages. | ||||
| func (o *Buffer) dec_slice_struct_message(p *Properties, base structPointer) error { | ||||
| 	return o.dec_slice_struct(p, false, base) | ||||
| } | ||||
|  | ||||
| // Decode a slice of embedded groups. | ||||
| func (o *Buffer) dec_slice_struct_group(p *Properties, base structPointer) error { | ||||
| 	return o.dec_slice_struct(p, true, base) | ||||
| } | ||||
|  | ||||
| // Decode a slice of structs ([]*struct). | ||||
| func (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base structPointer) error { | ||||
| 	v := reflect.New(p.stype) | ||||
| 	bas := toStructPointer(v) | ||||
| 	structPointer_StructPointerSlice(base, p.field).Append(bas) | ||||
|  | ||||
| 	if is_group { | ||||
| 		err := o.unmarshalType(p.stype, p.sprop, is_group, bas) | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	raw, err := o.DecodeRawBytes(false) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// If the object can unmarshal itself, let it. | ||||
| 	if p.isUnmarshaler { | ||||
| 		iv := v.Interface() | ||||
| 		return iv.(Unmarshaler).Unmarshal(raw) | ||||
| 	} | ||||
|  | ||||
| 	obuf := o.buf | ||||
| 	oi := o.index | ||||
| 	o.buf = raw | ||||
| 	o.index = 0 | ||||
|  | ||||
| 	err = o.unmarshalType(p.stype, p.sprop, is_group, bas) | ||||
|  | ||||
| 	o.buf = obuf | ||||
| 	o.index = oi | ||||
|  | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										256
									
								
								vendor/github.com/golang/protobuf/proto/decode_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										256
									
								
								vendor/github.com/golang/protobuf/proto/decode_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,256 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto_test | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	tpb "github.com/golang/protobuf/proto/proto3_proto" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	bytesBlackhole []byte | ||||
| 	msgBlackhole   = new(tpb.Message) | ||||
| ) | ||||
|  | ||||
| // BenchmarkVarint32ArraySmall shows the performance on an array of small int32 fields (1 and | ||||
| // 2 bytes long). | ||||
| func BenchmarkVarint32ArraySmall(b *testing.B) { | ||||
| 	for i := uint(1); i <= 10; i++ { | ||||
| 		dist := genInt32Dist([7]int{0, 3, 1}, 1<<i) | ||||
| 		raw, err := proto.Marshal(&tpb.Message{ | ||||
| 			ShortKey: dist, | ||||
| 		}) | ||||
| 		if err != nil { | ||||
| 			b.Error("wrong encode", err) | ||||
| 		} | ||||
| 		b.Run(fmt.Sprintf("Len%v", len(dist)), func(b *testing.B) { | ||||
| 			scratchBuf := proto.NewBuffer(nil) | ||||
| 			b.ResetTimer() | ||||
| 			for k := 0; k < b.N; k++ { | ||||
| 				scratchBuf.SetBuf(raw) | ||||
| 				msgBlackhole.Reset() | ||||
| 				if err := scratchBuf.Unmarshal(msgBlackhole); err != nil { | ||||
| 					b.Error("wrong decode", err) | ||||
| 				} | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // BenchmarkVarint32ArrayLarge shows the performance on an array of large int32 fields (3 and | ||||
| // 4 bytes long, with a small number of 1, 2, 5 and 10 byte long versions). | ||||
| func BenchmarkVarint32ArrayLarge(b *testing.B) { | ||||
| 	for i := uint(1); i <= 10; i++ { | ||||
| 		dist := genInt32Dist([7]int{0, 1, 2, 4, 8, 1, 1}, 1<<i) | ||||
| 		raw, err := proto.Marshal(&tpb.Message{ | ||||
| 			ShortKey: dist, | ||||
| 		}) | ||||
| 		if err != nil { | ||||
| 			b.Error("wrong encode", err) | ||||
| 		} | ||||
| 		b.Run(fmt.Sprintf("Len%v", len(dist)), func(b *testing.B) { | ||||
| 			scratchBuf := proto.NewBuffer(nil) | ||||
| 			b.ResetTimer() | ||||
| 			for k := 0; k < b.N; k++ { | ||||
| 				scratchBuf.SetBuf(raw) | ||||
| 				msgBlackhole.Reset() | ||||
| 				if err := scratchBuf.Unmarshal(msgBlackhole); err != nil { | ||||
| 					b.Error("wrong decode", err) | ||||
| 				} | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // BenchmarkVarint64ArraySmall shows the performance on an array of small int64 fields (1 and | ||||
| // 2 bytes long). | ||||
| func BenchmarkVarint64ArraySmall(b *testing.B) { | ||||
| 	for i := uint(1); i <= 10; i++ { | ||||
| 		dist := genUint64Dist([11]int{0, 3, 1}, 1<<i) | ||||
| 		raw, err := proto.Marshal(&tpb.Message{ | ||||
| 			Key: dist, | ||||
| 		}) | ||||
| 		if err != nil { | ||||
| 			b.Error("wrong encode", err) | ||||
| 		} | ||||
| 		b.Run(fmt.Sprintf("Len%v", len(dist)), func(b *testing.B) { | ||||
| 			scratchBuf := proto.NewBuffer(nil) | ||||
| 			b.ResetTimer() | ||||
| 			for k := 0; k < b.N; k++ { | ||||
| 				scratchBuf.SetBuf(raw) | ||||
| 				msgBlackhole.Reset() | ||||
| 				if err := scratchBuf.Unmarshal(msgBlackhole); err != nil { | ||||
| 					b.Error("wrong decode", err) | ||||
| 				} | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // BenchmarkVarint64ArrayLarge shows the performance on an array of large int64 fields (6, 7, | ||||
| // and 8 bytes long with a small number of the other sizes). | ||||
| func BenchmarkVarint64ArrayLarge(b *testing.B) { | ||||
| 	for i := uint(1); i <= 10; i++ { | ||||
| 		dist := genUint64Dist([11]int{0, 1, 1, 2, 4, 8, 16, 32, 16, 1, 1}, 1<<i) | ||||
| 		raw, err := proto.Marshal(&tpb.Message{ | ||||
| 			Key: dist, | ||||
| 		}) | ||||
| 		if err != nil { | ||||
| 			b.Error("wrong encode", err) | ||||
| 		} | ||||
| 		b.Run(fmt.Sprintf("Len%v", len(dist)), func(b *testing.B) { | ||||
| 			scratchBuf := proto.NewBuffer(nil) | ||||
| 			b.ResetTimer() | ||||
| 			for k := 0; k < b.N; k++ { | ||||
| 				scratchBuf.SetBuf(raw) | ||||
| 				msgBlackhole.Reset() | ||||
| 				if err := scratchBuf.Unmarshal(msgBlackhole); err != nil { | ||||
| 					b.Error("wrong decode", err) | ||||
| 				} | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // BenchmarkVarint64ArrayMixed shows the performance of lots of small messages, each | ||||
| // containing a small number of large (3, 4, and 5 byte) repeated int64s. | ||||
| func BenchmarkVarint64ArrayMixed(b *testing.B) { | ||||
| 	for i := uint(1); i <= 1<<5; i <<= 1 { | ||||
| 		dist := genUint64Dist([11]int{0, 0, 0, 4, 6, 4, 0, 0, 0, 0, 0}, int(i)) | ||||
| 		// number of sub fields | ||||
| 		for k := uint(1); k <= 1<<10; k <<= 2 { | ||||
| 			msg := &tpb.Message{} | ||||
| 			for m := uint(0); m < k; m++ { | ||||
| 				msg.Children = append(msg.Children, &tpb.Message{ | ||||
| 					Key: dist, | ||||
| 				}) | ||||
| 			} | ||||
| 			raw, err := proto.Marshal(msg) | ||||
| 			if err != nil { | ||||
| 				b.Error("wrong encode", err) | ||||
| 			} | ||||
| 			b.Run(fmt.Sprintf("Fields%vLen%v", k, i), func(b *testing.B) { | ||||
| 				scratchBuf := proto.NewBuffer(nil) | ||||
| 				b.ResetTimer() | ||||
| 				for k := 0; k < b.N; k++ { | ||||
| 					scratchBuf.SetBuf(raw) | ||||
| 					msgBlackhole.Reset() | ||||
| 					if err := scratchBuf.Unmarshal(msgBlackhole); err != nil { | ||||
| 						b.Error("wrong decode", err) | ||||
| 					} | ||||
| 				} | ||||
| 			}) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // genInt32Dist generates a slice of ints that will match the size distribution of dist. | ||||
| // A size of 6 corresponds to a max length varint32, which is 10 bytes.  The distribution | ||||
| // is 1-indexed. (i.e. the value at index 1 is how many 1 byte ints to create). | ||||
| func genInt32Dist(dist [7]int, count int) (dest []int32) { | ||||
| 	for i := 0; i < count; i++ { | ||||
| 		for k := 0; k < len(dist); k++ { | ||||
| 			var num int32 | ||||
| 			switch k { | ||||
| 			case 1: | ||||
| 				num = 1<<7 - 1 | ||||
| 			case 2: | ||||
| 				num = 1<<14 - 1 | ||||
| 			case 3: | ||||
| 				num = 1<<21 - 1 | ||||
| 			case 4: | ||||
| 				num = 1<<28 - 1 | ||||
| 			case 5: | ||||
| 				num = 1<<29 - 1 | ||||
| 			case 6: | ||||
| 				num = -1 | ||||
| 			} | ||||
| 			for m := 0; m < dist[k]; m++ { | ||||
| 				dest = append(dest, num) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // genUint64Dist generates a slice of ints that will match the size distribution of dist. | ||||
| // The distribution is 1-indexed. (i.e. the value at index 1 is how many 1 byte ints to create). | ||||
| func genUint64Dist(dist [11]int, count int) (dest []uint64) { | ||||
| 	for i := 0; i < count; i++ { | ||||
| 		for k := 0; k < len(dist); k++ { | ||||
| 			var num uint64 | ||||
| 			switch k { | ||||
| 			case 1: | ||||
| 				num = 1<<7 - 1 | ||||
| 			case 2: | ||||
| 				num = 1<<14 - 1 | ||||
| 			case 3: | ||||
| 				num = 1<<21 - 1 | ||||
| 			case 4: | ||||
| 				num = 1<<28 - 1 | ||||
| 			case 5: | ||||
| 				num = 1<<35 - 1 | ||||
| 			case 6: | ||||
| 				num = 1<<42 - 1 | ||||
| 			case 7: | ||||
| 				num = 1<<49 - 1 | ||||
| 			case 8: | ||||
| 				num = 1<<56 - 1 | ||||
| 			case 9: | ||||
| 				num = 1<<63 - 1 | ||||
| 			case 10: | ||||
| 				num = 1<<64 - 1 | ||||
| 			} | ||||
| 			for m := 0; m < dist[k]; m++ { | ||||
| 				dest = append(dest, num) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // BenchmarkDecodeEmpty measures the overhead of doing the minimal possible decode. | ||||
| func BenchmarkDecodeEmpty(b *testing.B) { | ||||
| 	raw, err := proto.Marshal(&tpb.Message{}) | ||||
| 	if err != nil { | ||||
| 		b.Error("wrong encode", err) | ||||
| 	} | ||||
| 	b.ResetTimer() | ||||
| 	for i := 0; i < b.N; i++ { | ||||
| 		if err := proto.Unmarshal(raw, msgBlackhole); err != nil { | ||||
| 			b.Error("wrong decode", err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										1355
									
								
								vendor/github.com/golang/protobuf/proto/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1355
									
								
								vendor/github.com/golang/protobuf/proto/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										83
									
								
								vendor/github.com/golang/protobuf/proto/encode_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								vendor/github.com/golang/protobuf/proto/encode_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto_test | ||||
|  | ||||
| import ( | ||||
| 	"strconv" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	tpb "github.com/golang/protobuf/proto/proto3_proto" | ||||
| 	"github.com/golang/protobuf/ptypes" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	blackhole []byte | ||||
| ) | ||||
|  | ||||
| // BenchmarkAny creates increasingly large arbitrary Any messages.  The type is always the | ||||
| // same. | ||||
| func BenchmarkAny(b *testing.B) { | ||||
| 	data := make([]byte, 1<<20) | ||||
| 	quantum := 1 << 10 | ||||
| 	for i := uint(0); i <= 10; i++ { | ||||
| 		b.Run(strconv.Itoa(quantum<<i), func(b *testing.B) { | ||||
| 			for k := 0; k < b.N; k++ { | ||||
| 				inner := &tpb.Message{ | ||||
| 					Data: data[:quantum<<i], | ||||
| 				} | ||||
| 				outer, err := ptypes.MarshalAny(inner) | ||||
| 				if err != nil { | ||||
| 					b.Error("wrong encode", err) | ||||
| 				} | ||||
| 				raw, err := proto.Marshal(&tpb.Message{ | ||||
| 					Anything: outer, | ||||
| 				}) | ||||
| 				if err != nil { | ||||
| 					b.Error("wrong encode", err) | ||||
| 				} | ||||
| 				blackhole = raw | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // BenchmarkEmpy measures the overhead of doing the minimal possible encode. | ||||
| func BenchmarkEmpy(b *testing.B) { | ||||
| 	for i := 0; i < b.N; i++ { | ||||
| 		raw, err := proto.Marshal(&tpb.Message{}) | ||||
| 		if err != nil { | ||||
| 			b.Error("wrong encode", err) | ||||
| 		} | ||||
| 		blackhole = raw | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										300
									
								
								vendor/github.com/golang/protobuf/proto/equal.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										300
									
								
								vendor/github.com/golang/protobuf/proto/equal.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,300 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2011 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| // Protocol buffer comparison. | ||||
|  | ||||
| package proto | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"log" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| /* | ||||
| Equal returns true iff protocol buffers a and b are equal. | ||||
| The arguments must both be pointers to protocol buffer structs. | ||||
|  | ||||
| Equality is defined in this way: | ||||
|   - Two messages are equal iff they are the same type, | ||||
|     corresponding fields are equal, unknown field sets | ||||
|     are equal, and extensions sets are equal. | ||||
|   - Two set scalar fields are equal iff their values are equal. | ||||
|     If the fields are of a floating-point type, remember that | ||||
|     NaN != x for all x, including NaN. If the message is defined | ||||
|     in a proto3 .proto file, fields are not "set"; specifically, | ||||
|     zero length proto3 "bytes" fields are equal (nil == {}). | ||||
|   - Two repeated fields are equal iff their lengths are the same, | ||||
|     and their corresponding elements are equal. Note a "bytes" field, | ||||
|     although represented by []byte, is not a repeated field and the | ||||
|     rule for the scalar fields described above applies. | ||||
|   - Two unset fields are equal. | ||||
|   - Two unknown field sets are equal if their current | ||||
|     encoded state is equal. | ||||
|   - Two extension sets are equal iff they have corresponding | ||||
|     elements that are pairwise equal. | ||||
|   - Two map fields are equal iff their lengths are the same, | ||||
|     and they contain the same set of elements. Zero-length map | ||||
|     fields are equal. | ||||
|   - Every other combination of things are not equal. | ||||
|  | ||||
| The return value is undefined if a and b are not protocol buffers. | ||||
| */ | ||||
| func Equal(a, b Message) bool { | ||||
| 	if a == nil || b == nil { | ||||
| 		return a == b | ||||
| 	} | ||||
| 	v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) | ||||
| 	if v1.Type() != v2.Type() { | ||||
| 		return false | ||||
| 	} | ||||
| 	if v1.Kind() == reflect.Ptr { | ||||
| 		if v1.IsNil() { | ||||
| 			return v2.IsNil() | ||||
| 		} | ||||
| 		if v2.IsNil() { | ||||
| 			return false | ||||
| 		} | ||||
| 		v1, v2 = v1.Elem(), v2.Elem() | ||||
| 	} | ||||
| 	if v1.Kind() != reflect.Struct { | ||||
| 		return false | ||||
| 	} | ||||
| 	return equalStruct(v1, v2) | ||||
| } | ||||
|  | ||||
| // v1 and v2 are known to have the same type. | ||||
| func equalStruct(v1, v2 reflect.Value) bool { | ||||
| 	sprop := GetProperties(v1.Type()) | ||||
| 	for i := 0; i < v1.NumField(); i++ { | ||||
| 		f := v1.Type().Field(i) | ||||
| 		if strings.HasPrefix(f.Name, "XXX_") { | ||||
| 			continue | ||||
| 		} | ||||
| 		f1, f2 := v1.Field(i), v2.Field(i) | ||||
| 		if f.Type.Kind() == reflect.Ptr { | ||||
| 			if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { | ||||
| 				// both unset | ||||
| 				continue | ||||
| 			} else if n1 != n2 { | ||||
| 				// set/unset mismatch | ||||
| 				return false | ||||
| 			} | ||||
| 			b1, ok := f1.Interface().(raw) | ||||
| 			if ok { | ||||
| 				b2 := f2.Interface().(raw) | ||||
| 				// RawMessage | ||||
| 				if !bytes.Equal(b1.Bytes(), b2.Bytes()) { | ||||
| 					return false | ||||
| 				} | ||||
| 				continue | ||||
| 			} | ||||
| 			f1, f2 = f1.Elem(), f2.Elem() | ||||
| 		} | ||||
| 		if !equalAny(f1, f2, sprop.Prop[i]) { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { | ||||
| 		em2 := v2.FieldByName("XXX_InternalExtensions") | ||||
| 		if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { | ||||
| 		em2 := v2.FieldByName("XXX_extensions") | ||||
| 		if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	uf := v1.FieldByName("XXX_unrecognized") | ||||
| 	if !uf.IsValid() { | ||||
| 		return true | ||||
| 	} | ||||
|  | ||||
| 	u1 := uf.Bytes() | ||||
| 	u2 := v2.FieldByName("XXX_unrecognized").Bytes() | ||||
| 	if !bytes.Equal(u1, u2) { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // v1 and v2 are known to have the same type. | ||||
| // prop may be nil. | ||||
| func equalAny(v1, v2 reflect.Value, prop *Properties) bool { | ||||
| 	if v1.Type() == protoMessageType { | ||||
| 		m1, _ := v1.Interface().(Message) | ||||
| 		m2, _ := v2.Interface().(Message) | ||||
| 		return Equal(m1, m2) | ||||
| 	} | ||||
| 	switch v1.Kind() { | ||||
| 	case reflect.Bool: | ||||
| 		return v1.Bool() == v2.Bool() | ||||
| 	case reflect.Float32, reflect.Float64: | ||||
| 		return v1.Float() == v2.Float() | ||||
| 	case reflect.Int32, reflect.Int64: | ||||
| 		return v1.Int() == v2.Int() | ||||
| 	case reflect.Interface: | ||||
| 		// Probably a oneof field; compare the inner values. | ||||
| 		n1, n2 := v1.IsNil(), v2.IsNil() | ||||
| 		if n1 || n2 { | ||||
| 			return n1 == n2 | ||||
| 		} | ||||
| 		e1, e2 := v1.Elem(), v2.Elem() | ||||
| 		if e1.Type() != e2.Type() { | ||||
| 			return false | ||||
| 		} | ||||
| 		return equalAny(e1, e2, nil) | ||||
| 	case reflect.Map: | ||||
| 		if v1.Len() != v2.Len() { | ||||
| 			return false | ||||
| 		} | ||||
| 		for _, key := range v1.MapKeys() { | ||||
| 			val2 := v2.MapIndex(key) | ||||
| 			if !val2.IsValid() { | ||||
| 				// This key was not found in the second map. | ||||
| 				return false | ||||
| 			} | ||||
| 			if !equalAny(v1.MapIndex(key), val2, nil) { | ||||
| 				return false | ||||
| 			} | ||||
| 		} | ||||
| 		return true | ||||
| 	case reflect.Ptr: | ||||
| 		// Maps may have nil values in them, so check for nil. | ||||
| 		if v1.IsNil() && v2.IsNil() { | ||||
| 			return true | ||||
| 		} | ||||
| 		if v1.IsNil() != v2.IsNil() { | ||||
| 			return false | ||||
| 		} | ||||
| 		return equalAny(v1.Elem(), v2.Elem(), prop) | ||||
| 	case reflect.Slice: | ||||
| 		if v1.Type().Elem().Kind() == reflect.Uint8 { | ||||
| 			// short circuit: []byte | ||||
|  | ||||
| 			// Edge case: if this is in a proto3 message, a zero length | ||||
| 			// bytes field is considered the zero value. | ||||
| 			if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { | ||||
| 				return true | ||||
| 			} | ||||
| 			if v1.IsNil() != v2.IsNil() { | ||||
| 				return false | ||||
| 			} | ||||
| 			return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) | ||||
| 		} | ||||
|  | ||||
| 		if v1.Len() != v2.Len() { | ||||
| 			return false | ||||
| 		} | ||||
| 		for i := 0; i < v1.Len(); i++ { | ||||
| 			if !equalAny(v1.Index(i), v2.Index(i), prop) { | ||||
| 				return false | ||||
| 			} | ||||
| 		} | ||||
| 		return true | ||||
| 	case reflect.String: | ||||
| 		return v1.Interface().(string) == v2.Interface().(string) | ||||
| 	case reflect.Struct: | ||||
| 		return equalStruct(v1, v2) | ||||
| 	case reflect.Uint32, reflect.Uint64: | ||||
| 		return v1.Uint() == v2.Uint() | ||||
| 	} | ||||
|  | ||||
| 	// unknown type, so not a protocol buffer | ||||
| 	log.Printf("proto: don't know how to compare %v", v1) | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // base is the struct type that the extensions are based on. | ||||
| // x1 and x2 are InternalExtensions. | ||||
| func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { | ||||
| 	em1, _ := x1.extensionsRead() | ||||
| 	em2, _ := x2.extensionsRead() | ||||
| 	return equalExtMap(base, em1, em2) | ||||
| } | ||||
|  | ||||
| func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { | ||||
| 	if len(em1) != len(em2) { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	for extNum, e1 := range em1 { | ||||
| 		e2, ok := em2[extNum] | ||||
| 		if !ok { | ||||
| 			return false | ||||
| 		} | ||||
|  | ||||
| 		m1, m2 := e1.value, e2.value | ||||
|  | ||||
| 		if m1 != nil && m2 != nil { | ||||
| 			// Both are unencoded. | ||||
| 			if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { | ||||
| 				return false | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// At least one is encoded. To do a semantically correct comparison | ||||
| 		// we need to unmarshal them first. | ||||
| 		var desc *ExtensionDesc | ||||
| 		if m := extensionMaps[base]; m != nil { | ||||
| 			desc = m[extNum] | ||||
| 		} | ||||
| 		if desc == nil { | ||||
| 			log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) | ||||
| 			continue | ||||
| 		} | ||||
| 		var err error | ||||
| 		if m1 == nil { | ||||
| 			m1, err = decodeExtension(e1.enc, desc) | ||||
| 		} | ||||
| 		if m2 == nil && err == nil { | ||||
| 			m2, err = decodeExtension(e2.enc, desc) | ||||
| 		} | ||||
| 		if err != nil { | ||||
| 			// The encoded form is invalid. | ||||
| 			log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) | ||||
| 			return false | ||||
| 		} | ||||
| 		if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return true | ||||
| } | ||||
							
								
								
									
										224
									
								
								vendor/github.com/golang/protobuf/proto/equal_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								vendor/github.com/golang/protobuf/proto/equal_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,224 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2011 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto_test | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	. "github.com/golang/protobuf/proto" | ||||
| 	proto3pb "github.com/golang/protobuf/proto/proto3_proto" | ||||
| 	pb "github.com/golang/protobuf/proto/testdata" | ||||
| ) | ||||
|  | ||||
| // Four identical base messages. | ||||
| // The init function adds extensions to some of them. | ||||
| var messageWithoutExtension = &pb.MyMessage{Count: Int32(7)} | ||||
| var messageWithExtension1a = &pb.MyMessage{Count: Int32(7)} | ||||
| var messageWithExtension1b = &pb.MyMessage{Count: Int32(7)} | ||||
| var messageWithExtension2 = &pb.MyMessage{Count: Int32(7)} | ||||
|  | ||||
| // Two messages with non-message extensions. | ||||
| var messageWithInt32Extension1 = &pb.MyMessage{Count: Int32(8)} | ||||
| var messageWithInt32Extension2 = &pb.MyMessage{Count: Int32(8)} | ||||
|  | ||||
| func init() { | ||||
| 	ext1 := &pb.Ext{Data: String("Kirk")} | ||||
| 	ext2 := &pb.Ext{Data: String("Picard")} | ||||
|  | ||||
| 	// messageWithExtension1a has ext1, but never marshals it. | ||||
| 	if err := SetExtension(messageWithExtension1a, pb.E_Ext_More, ext1); err != nil { | ||||
| 		panic("SetExtension on 1a failed: " + err.Error()) | ||||
| 	} | ||||
|  | ||||
| 	// messageWithExtension1b is the unmarshaled form of messageWithExtension1a. | ||||
| 	if err := SetExtension(messageWithExtension1b, pb.E_Ext_More, ext1); err != nil { | ||||
| 		panic("SetExtension on 1b failed: " + err.Error()) | ||||
| 	} | ||||
| 	buf, err := Marshal(messageWithExtension1b) | ||||
| 	if err != nil { | ||||
| 		panic("Marshal of 1b failed: " + err.Error()) | ||||
| 	} | ||||
| 	messageWithExtension1b.Reset() | ||||
| 	if err := Unmarshal(buf, messageWithExtension1b); err != nil { | ||||
| 		panic("Unmarshal of 1b failed: " + err.Error()) | ||||
| 	} | ||||
|  | ||||
| 	// messageWithExtension2 has ext2. | ||||
| 	if err := SetExtension(messageWithExtension2, pb.E_Ext_More, ext2); err != nil { | ||||
| 		panic("SetExtension on 2 failed: " + err.Error()) | ||||
| 	} | ||||
|  | ||||
| 	if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(23)); err != nil { | ||||
| 		panic("SetExtension on Int32-1 failed: " + err.Error()) | ||||
| 	} | ||||
| 	if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(24)); err != nil { | ||||
| 		panic("SetExtension on Int32-2 failed: " + err.Error()) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var EqualTests = []struct { | ||||
| 	desc string | ||||
| 	a, b Message | ||||
| 	exp  bool | ||||
| }{ | ||||
| 	{"different types", &pb.GoEnum{}, &pb.GoTestField{}, false}, | ||||
| 	{"equal empty", &pb.GoEnum{}, &pb.GoEnum{}, true}, | ||||
| 	{"nil vs nil", nil, nil, true}, | ||||
| 	{"typed nil vs typed nil", (*pb.GoEnum)(nil), (*pb.GoEnum)(nil), true}, | ||||
| 	{"typed nil vs empty", (*pb.GoEnum)(nil), &pb.GoEnum{}, false}, | ||||
| 	{"different typed nil", (*pb.GoEnum)(nil), (*pb.GoTestField)(nil), false}, | ||||
|  | ||||
| 	{"one set field, one unset field", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{}, false}, | ||||
| 	{"one set field zero, one unset field", &pb.GoTest{Param: Int32(0)}, &pb.GoTest{}, false}, | ||||
| 	{"different set fields", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{Label: String("bar")}, false}, | ||||
| 	{"equal set", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{Label: String("foo")}, true}, | ||||
|  | ||||
| 	{"repeated, one set", &pb.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb.GoTest{}, false}, | ||||
| 	{"repeated, different length", &pb.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb.GoTest{F_Int32Repeated: []int32{2}}, false}, | ||||
| 	{"repeated, different value", &pb.GoTest{F_Int32Repeated: []int32{2}}, &pb.GoTest{F_Int32Repeated: []int32{3}}, false}, | ||||
| 	{"repeated, equal", &pb.GoTest{F_Int32Repeated: []int32{2, 4}}, &pb.GoTest{F_Int32Repeated: []int32{2, 4}}, true}, | ||||
| 	{"repeated, nil equal nil", &pb.GoTest{F_Int32Repeated: nil}, &pb.GoTest{F_Int32Repeated: nil}, true}, | ||||
| 	{"repeated, nil equal empty", &pb.GoTest{F_Int32Repeated: nil}, &pb.GoTest{F_Int32Repeated: []int32{}}, true}, | ||||
| 	{"repeated, empty equal nil", &pb.GoTest{F_Int32Repeated: []int32{}}, &pb.GoTest{F_Int32Repeated: nil}, true}, | ||||
|  | ||||
| 	{ | ||||
| 		"nested, different", | ||||
| 		&pb.GoTest{RequiredField: &pb.GoTestField{Label: String("foo")}}, | ||||
| 		&pb.GoTest{RequiredField: &pb.GoTestField{Label: String("bar")}}, | ||||
| 		false, | ||||
| 	}, | ||||
| 	{ | ||||
| 		"nested, equal", | ||||
| 		&pb.GoTest{RequiredField: &pb.GoTestField{Label: String("wow")}}, | ||||
| 		&pb.GoTest{RequiredField: &pb.GoTestField{Label: String("wow")}}, | ||||
| 		true, | ||||
| 	}, | ||||
|  | ||||
| 	{"bytes", &pb.OtherMessage{Value: []byte("foo")}, &pb.OtherMessage{Value: []byte("foo")}, true}, | ||||
| 	{"bytes, empty", &pb.OtherMessage{Value: []byte{}}, &pb.OtherMessage{Value: []byte{}}, true}, | ||||
| 	{"bytes, empty vs nil", &pb.OtherMessage{Value: []byte{}}, &pb.OtherMessage{Value: nil}, false}, | ||||
| 	{ | ||||
| 		"repeated bytes", | ||||
| 		&pb.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}}, | ||||
| 		&pb.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}}, | ||||
| 		true, | ||||
| 	}, | ||||
| 	// In proto3, []byte{} and []byte(nil) are equal. | ||||
| 	{"proto3 bytes, empty vs nil", &proto3pb.Message{Data: []byte{}}, &proto3pb.Message{Data: nil}, true}, | ||||
|  | ||||
| 	{"extension vs. no extension", messageWithoutExtension, messageWithExtension1a, false}, | ||||
| 	{"extension vs. same extension", messageWithExtension1a, messageWithExtension1b, true}, | ||||
| 	{"extension vs. different extension", messageWithExtension1a, messageWithExtension2, false}, | ||||
|  | ||||
| 	{"int32 extension vs. itself", messageWithInt32Extension1, messageWithInt32Extension1, true}, | ||||
| 	{"int32 extension vs. a different int32", messageWithInt32Extension1, messageWithInt32Extension2, false}, | ||||
|  | ||||
| 	{ | ||||
| 		"message with group", | ||||
| 		&pb.MyMessage{ | ||||
| 			Count: Int32(1), | ||||
| 			Somegroup: &pb.MyMessage_SomeGroup{ | ||||
| 				GroupField: Int32(5), | ||||
| 			}, | ||||
| 		}, | ||||
| 		&pb.MyMessage{ | ||||
| 			Count: Int32(1), | ||||
| 			Somegroup: &pb.MyMessage_SomeGroup{ | ||||
| 				GroupField: Int32(5), | ||||
| 			}, | ||||
| 		}, | ||||
| 		true, | ||||
| 	}, | ||||
|  | ||||
| 	{ | ||||
| 		"map same", | ||||
| 		&pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, | ||||
| 		&pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, | ||||
| 		true, | ||||
| 	}, | ||||
| 	{ | ||||
| 		"map different entry", | ||||
| 		&pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, | ||||
| 		&pb.MessageWithMap{NameMapping: map[int32]string{2: "Rob"}}, | ||||
| 		false, | ||||
| 	}, | ||||
| 	{ | ||||
| 		"map different key only", | ||||
| 		&pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, | ||||
| 		&pb.MessageWithMap{NameMapping: map[int32]string{2: "Ken"}}, | ||||
| 		false, | ||||
| 	}, | ||||
| 	{ | ||||
| 		"map different value only", | ||||
| 		&pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}}, | ||||
| 		&pb.MessageWithMap{NameMapping: map[int32]string{1: "Rob"}}, | ||||
| 		false, | ||||
| 	}, | ||||
| 	{ | ||||
| 		"zero-length maps same", | ||||
| 		&pb.MessageWithMap{NameMapping: map[int32]string{}}, | ||||
| 		&pb.MessageWithMap{NameMapping: nil}, | ||||
| 		true, | ||||
| 	}, | ||||
| 	{ | ||||
| 		"orders in map don't matter", | ||||
| 		&pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken", 2: "Rob"}}, | ||||
| 		&pb.MessageWithMap{NameMapping: map[int32]string{2: "Rob", 1: "Ken"}}, | ||||
| 		true, | ||||
| 	}, | ||||
| 	{ | ||||
| 		"oneof same", | ||||
| 		&pb.Communique{Union: &pb.Communique_Number{41}}, | ||||
| 		&pb.Communique{Union: &pb.Communique_Number{41}}, | ||||
| 		true, | ||||
| 	}, | ||||
| 	{ | ||||
| 		"oneof one nil", | ||||
| 		&pb.Communique{Union: &pb.Communique_Number{41}}, | ||||
| 		&pb.Communique{}, | ||||
| 		false, | ||||
| 	}, | ||||
| 	{ | ||||
| 		"oneof different", | ||||
| 		&pb.Communique{Union: &pb.Communique_Number{41}}, | ||||
| 		&pb.Communique{Union: &pb.Communique_Name{"Bobby Tables"}}, | ||||
| 		false, | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func TestEqual(t *testing.T) { | ||||
| 	for _, tc := range EqualTests { | ||||
| 		if res := Equal(tc.a, tc.b); res != tc.exp { | ||||
| 			t.Errorf("%v: Equal(%v, %v) = %v, want %v", tc.desc, tc.a, tc.b, res, tc.exp) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										586
									
								
								vendor/github.com/golang/protobuf/proto/extensions.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										586
									
								
								vendor/github.com/golang/protobuf/proto/extensions.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,586 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto | ||||
|  | ||||
| /* | ||||
|  * Types and routines for supporting protocol buffer extensions. | ||||
|  */ | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"strconv" | ||||
| 	"sync" | ||||
| ) | ||||
|  | ||||
| // ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. | ||||
| var ErrMissingExtension = errors.New("proto: missing extension") | ||||
|  | ||||
| // ExtensionRange represents a range of message extensions for a protocol buffer. | ||||
| // Used in code generated by the protocol compiler. | ||||
| type ExtensionRange struct { | ||||
| 	Start, End int32 // both inclusive | ||||
| } | ||||
|  | ||||
| // extendableProto is an interface implemented by any protocol buffer generated by the current | ||||
| // proto compiler that may be extended. | ||||
| type extendableProto interface { | ||||
| 	Message | ||||
| 	ExtensionRangeArray() []ExtensionRange | ||||
| 	extensionsWrite() map[int32]Extension | ||||
| 	extensionsRead() (map[int32]Extension, sync.Locker) | ||||
| } | ||||
|  | ||||
| // extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous | ||||
| // version of the proto compiler that may be extended. | ||||
| type extendableProtoV1 interface { | ||||
| 	Message | ||||
| 	ExtensionRangeArray() []ExtensionRange | ||||
| 	ExtensionMap() map[int32]Extension | ||||
| } | ||||
|  | ||||
| // extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. | ||||
| type extensionAdapter struct { | ||||
| 	extendableProtoV1 | ||||
| } | ||||
|  | ||||
| func (e extensionAdapter) extensionsWrite() map[int32]Extension { | ||||
| 	return e.ExtensionMap() | ||||
| } | ||||
|  | ||||
| func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { | ||||
| 	return e.ExtensionMap(), notLocker{} | ||||
| } | ||||
|  | ||||
| // notLocker is a sync.Locker whose Lock and Unlock methods are nops. | ||||
| type notLocker struct{} | ||||
|  | ||||
| func (n notLocker) Lock()   {} | ||||
| func (n notLocker) Unlock() {} | ||||
|  | ||||
| // extendable returns the extendableProto interface for the given generated proto message. | ||||
| // If the proto message has the old extension format, it returns a wrapper that implements | ||||
| // the extendableProto interface. | ||||
| func extendable(p interface{}) (extendableProto, bool) { | ||||
| 	if ep, ok := p.(extendableProto); ok { | ||||
| 		return ep, ok | ||||
| 	} | ||||
| 	if ep, ok := p.(extendableProtoV1); ok { | ||||
| 		return extensionAdapter{ep}, ok | ||||
| 	} | ||||
| 	return nil, false | ||||
| } | ||||
|  | ||||
| // XXX_InternalExtensions is an internal representation of proto extensions. | ||||
| // | ||||
| // Each generated message struct type embeds an anonymous XXX_InternalExtensions field, | ||||
| // thus gaining the unexported 'extensions' method, which can be called only from the proto package. | ||||
| // | ||||
| // The methods of XXX_InternalExtensions are not concurrency safe in general, | ||||
| // but calls to logically read-only methods such as has and get may be executed concurrently. | ||||
| type XXX_InternalExtensions struct { | ||||
| 	// The struct must be indirect so that if a user inadvertently copies a | ||||
| 	// generated message and its embedded XXX_InternalExtensions, they | ||||
| 	// avoid the mayhem of a copied mutex. | ||||
| 	// | ||||
| 	// The mutex serializes all logically read-only operations to p.extensionMap. | ||||
| 	// It is up to the client to ensure that write operations to p.extensionMap are | ||||
| 	// mutually exclusive with other accesses. | ||||
| 	p *struct { | ||||
| 		mu           sync.Mutex | ||||
| 		extensionMap map[int32]Extension | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // extensionsWrite returns the extension map, creating it on first use. | ||||
| func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { | ||||
| 	if e.p == nil { | ||||
| 		e.p = new(struct { | ||||
| 			mu           sync.Mutex | ||||
| 			extensionMap map[int32]Extension | ||||
| 		}) | ||||
| 		e.p.extensionMap = make(map[int32]Extension) | ||||
| 	} | ||||
| 	return e.p.extensionMap | ||||
| } | ||||
|  | ||||
| // extensionsRead returns the extensions map for read-only use.  It may be nil. | ||||
| // The caller must hold the returned mutex's lock when accessing Elements within the map. | ||||
| func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { | ||||
| 	if e.p == nil { | ||||
| 		return nil, nil | ||||
| 	} | ||||
| 	return e.p.extensionMap, &e.p.mu | ||||
| } | ||||
|  | ||||
| var extendableProtoType = reflect.TypeOf((*extendableProto)(nil)).Elem() | ||||
| var extendableProtoV1Type = reflect.TypeOf((*extendableProtoV1)(nil)).Elem() | ||||
|  | ||||
| // ExtensionDesc represents an extension specification. | ||||
| // Used in generated code from the protocol compiler. | ||||
| type ExtensionDesc struct { | ||||
| 	ExtendedType  Message     // nil pointer to the type that is being extended | ||||
| 	ExtensionType interface{} // nil pointer to the extension type | ||||
| 	Field         int32       // field number | ||||
| 	Name          string      // fully-qualified name of extension, for text formatting | ||||
| 	Tag           string      // protobuf tag style | ||||
| } | ||||
|  | ||||
| func (ed *ExtensionDesc) repeated() bool { | ||||
| 	t := reflect.TypeOf(ed.ExtensionType) | ||||
| 	return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 | ||||
| } | ||||
|  | ||||
| // Extension represents an extension in a message. | ||||
| type Extension struct { | ||||
| 	// When an extension is stored in a message using SetExtension | ||||
| 	// only desc and value are set. When the message is marshaled | ||||
| 	// enc will be set to the encoded form of the message. | ||||
| 	// | ||||
| 	// When a message is unmarshaled and contains extensions, each | ||||
| 	// extension will have only enc set. When such an extension is | ||||
| 	// accessed using GetExtension (or GetExtensions) desc and value | ||||
| 	// will be set. | ||||
| 	desc  *ExtensionDesc | ||||
| 	value interface{} | ||||
| 	enc   []byte | ||||
| } | ||||
|  | ||||
| // SetRawExtension is for testing only. | ||||
| func SetRawExtension(base Message, id int32, b []byte) { | ||||
| 	epb, ok := extendable(base) | ||||
| 	if !ok { | ||||
| 		return | ||||
| 	} | ||||
| 	extmap := epb.extensionsWrite() | ||||
| 	extmap[id] = Extension{enc: b} | ||||
| } | ||||
|  | ||||
| // isExtensionField returns true iff the given field number is in an extension range. | ||||
| func isExtensionField(pb extendableProto, field int32) bool { | ||||
| 	for _, er := range pb.ExtensionRangeArray() { | ||||
| 		if er.Start <= field && field <= er.End { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // checkExtensionTypes checks that the given extension is valid for pb. | ||||
| func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { | ||||
| 	var pbi interface{} = pb | ||||
| 	// Check the extended type. | ||||
| 	if ea, ok := pbi.(extensionAdapter); ok { | ||||
| 		pbi = ea.extendableProtoV1 | ||||
| 	} | ||||
| 	if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { | ||||
| 		return errors.New("proto: bad extended type; " + b.String() + " does not extend " + a.String()) | ||||
| 	} | ||||
| 	// Check the range. | ||||
| 	if !isExtensionField(pb, extension.Field) { | ||||
| 		return errors.New("proto: bad extension number; not in declared ranges") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // extPropKey is sufficient to uniquely identify an extension. | ||||
| type extPropKey struct { | ||||
| 	base  reflect.Type | ||||
| 	field int32 | ||||
| } | ||||
|  | ||||
| var extProp = struct { | ||||
| 	sync.RWMutex | ||||
| 	m map[extPropKey]*Properties | ||||
| }{ | ||||
| 	m: make(map[extPropKey]*Properties), | ||||
| } | ||||
|  | ||||
| func extensionProperties(ed *ExtensionDesc) *Properties { | ||||
| 	key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} | ||||
|  | ||||
| 	extProp.RLock() | ||||
| 	if prop, ok := extProp.m[key]; ok { | ||||
| 		extProp.RUnlock() | ||||
| 		return prop | ||||
| 	} | ||||
| 	extProp.RUnlock() | ||||
|  | ||||
| 	extProp.Lock() | ||||
| 	defer extProp.Unlock() | ||||
| 	// Check again. | ||||
| 	if prop, ok := extProp.m[key]; ok { | ||||
| 		return prop | ||||
| 	} | ||||
|  | ||||
| 	prop := new(Properties) | ||||
| 	prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) | ||||
| 	extProp.m[key] = prop | ||||
| 	return prop | ||||
| } | ||||
|  | ||||
| // encode encodes any unmarshaled (unencoded) extensions in e. | ||||
| func encodeExtensions(e *XXX_InternalExtensions) error { | ||||
| 	m, mu := e.extensionsRead() | ||||
| 	if m == nil { | ||||
| 		return nil // fast path | ||||
| 	} | ||||
| 	mu.Lock() | ||||
| 	defer mu.Unlock() | ||||
| 	return encodeExtensionsMap(m) | ||||
| } | ||||
|  | ||||
| // encode encodes any unmarshaled (unencoded) extensions in e. | ||||
| func encodeExtensionsMap(m map[int32]Extension) error { | ||||
| 	for k, e := range m { | ||||
| 		if e.value == nil || e.desc == nil { | ||||
| 			// Extension is only in its encoded form. | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// We don't skip extensions that have an encoded form set, | ||||
| 		// because the extension value may have been mutated after | ||||
| 		// the last time this function was called. | ||||
|  | ||||
| 		et := reflect.TypeOf(e.desc.ExtensionType) | ||||
| 		props := extensionProperties(e.desc) | ||||
|  | ||||
| 		p := NewBuffer(nil) | ||||
| 		// If e.value has type T, the encoder expects a *struct{ X T }. | ||||
| 		// Pass a *T with a zero field and hope it all works out. | ||||
| 		x := reflect.New(et) | ||||
| 		x.Elem().Set(reflect.ValueOf(e.value)) | ||||
| 		if err := props.enc(p, props, toStructPointer(x)); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		e.enc = p.buf | ||||
| 		m[k] = e | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func extensionsSize(e *XXX_InternalExtensions) (n int) { | ||||
| 	m, mu := e.extensionsRead() | ||||
| 	if m == nil { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	mu.Lock() | ||||
| 	defer mu.Unlock() | ||||
| 	return extensionsMapSize(m) | ||||
| } | ||||
|  | ||||
| func extensionsMapSize(m map[int32]Extension) (n int) { | ||||
| 	for _, e := range m { | ||||
| 		if e.value == nil || e.desc == nil { | ||||
| 			// Extension is only in its encoded form. | ||||
| 			n += len(e.enc) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// We don't skip extensions that have an encoded form set, | ||||
| 		// because the extension value may have been mutated after | ||||
| 		// the last time this function was called. | ||||
|  | ||||
| 		et := reflect.TypeOf(e.desc.ExtensionType) | ||||
| 		props := extensionProperties(e.desc) | ||||
|  | ||||
| 		// If e.value has type T, the encoder expects a *struct{ X T }. | ||||
| 		// Pass a *T with a zero field and hope it all works out. | ||||
| 		x := reflect.New(et) | ||||
| 		x.Elem().Set(reflect.ValueOf(e.value)) | ||||
| 		n += props.size(props, toStructPointer(x)) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // HasExtension returns whether the given extension is present in pb. | ||||
| func HasExtension(pb Message, extension *ExtensionDesc) bool { | ||||
| 	// TODO: Check types, field numbers, etc.? | ||||
| 	epb, ok := extendable(pb) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	extmap, mu := epb.extensionsRead() | ||||
| 	if extmap == nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	mu.Lock() | ||||
| 	_, ok = extmap[extension.Field] | ||||
| 	mu.Unlock() | ||||
| 	return ok | ||||
| } | ||||
|  | ||||
| // ClearExtension removes the given extension from pb. | ||||
| func ClearExtension(pb Message, extension *ExtensionDesc) { | ||||
| 	epb, ok := extendable(pb) | ||||
| 	if !ok { | ||||
| 		return | ||||
| 	} | ||||
| 	// TODO: Check types, field numbers, etc.? | ||||
| 	extmap := epb.extensionsWrite() | ||||
| 	delete(extmap, extension.Field) | ||||
| } | ||||
|  | ||||
| // GetExtension parses and returns the given extension of pb. | ||||
| // If the extension is not present and has no default value it returns ErrMissingExtension. | ||||
| func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { | ||||
| 	epb, ok := extendable(pb) | ||||
| 	if !ok { | ||||
| 		return nil, errors.New("proto: not an extendable proto") | ||||
| 	} | ||||
|  | ||||
| 	if err := checkExtensionTypes(epb, extension); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	emap, mu := epb.extensionsRead() | ||||
| 	if emap == nil { | ||||
| 		return defaultExtensionValue(extension) | ||||
| 	} | ||||
| 	mu.Lock() | ||||
| 	defer mu.Unlock() | ||||
| 	e, ok := emap[extension.Field] | ||||
| 	if !ok { | ||||
| 		// defaultExtensionValue returns the default value or | ||||
| 		// ErrMissingExtension if there is no default. | ||||
| 		return defaultExtensionValue(extension) | ||||
| 	} | ||||
|  | ||||
| 	if e.value != nil { | ||||
| 		// Already decoded. Check the descriptor, though. | ||||
| 		if e.desc != extension { | ||||
| 			// This shouldn't happen. If it does, it means that | ||||
| 			// GetExtension was called twice with two different | ||||
| 			// descriptors with the same field number. | ||||
| 			return nil, errors.New("proto: descriptor conflict") | ||||
| 		} | ||||
| 		return e.value, nil | ||||
| 	} | ||||
|  | ||||
| 	v, err := decodeExtension(e.enc, extension) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// Remember the decoded version and drop the encoded version. | ||||
| 	// That way it is safe to mutate what we return. | ||||
| 	e.value = v | ||||
| 	e.desc = extension | ||||
| 	e.enc = nil | ||||
| 	emap[extension.Field] = e | ||||
| 	return e.value, nil | ||||
| } | ||||
|  | ||||
| // defaultExtensionValue returns the default value for extension. | ||||
| // If no default for an extension is defined ErrMissingExtension is returned. | ||||
| func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { | ||||
| 	t := reflect.TypeOf(extension.ExtensionType) | ||||
| 	props := extensionProperties(extension) | ||||
|  | ||||
| 	sf, _, err := fieldDefault(t, props) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	if sf == nil || sf.value == nil { | ||||
| 		// There is no default value. | ||||
| 		return nil, ErrMissingExtension | ||||
| 	} | ||||
|  | ||||
| 	if t.Kind() != reflect.Ptr { | ||||
| 		// We do not need to return a Ptr, we can directly return sf.value. | ||||
| 		return sf.value, nil | ||||
| 	} | ||||
|  | ||||
| 	// We need to return an interface{} that is a pointer to sf.value. | ||||
| 	value := reflect.New(t).Elem() | ||||
| 	value.Set(reflect.New(value.Type().Elem())) | ||||
| 	if sf.kind == reflect.Int32 { | ||||
| 		// We may have an int32 or an enum, but the underlying data is int32. | ||||
| 		// Since we can't set an int32 into a non int32 reflect.value directly | ||||
| 		// set it as a int32. | ||||
| 		value.Elem().SetInt(int64(sf.value.(int32))) | ||||
| 	} else { | ||||
| 		value.Elem().Set(reflect.ValueOf(sf.value)) | ||||
| 	} | ||||
| 	return value.Interface(), nil | ||||
| } | ||||
|  | ||||
| // decodeExtension decodes an extension encoded in b. | ||||
| func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { | ||||
| 	o := NewBuffer(b) | ||||
|  | ||||
| 	t := reflect.TypeOf(extension.ExtensionType) | ||||
|  | ||||
| 	props := extensionProperties(extension) | ||||
|  | ||||
| 	// t is a pointer to a struct, pointer to basic type or a slice. | ||||
| 	// Allocate a "field" to store the pointer/slice itself; the | ||||
| 	// pointer/slice will be stored here. We pass | ||||
| 	// the address of this field to props.dec. | ||||
| 	// This passes a zero field and a *t and lets props.dec | ||||
| 	// interpret it as a *struct{ x t }. | ||||
| 	value := reflect.New(t).Elem() | ||||
|  | ||||
| 	for { | ||||
| 		// Discard wire type and field number varint. It isn't needed. | ||||
| 		if _, err := o.DecodeVarint(); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | ||||
| 		if err := props.dec(o, props, toStructPointer(value.Addr())); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | ||||
| 		if o.index >= len(o.buf) { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	return value.Interface(), nil | ||||
| } | ||||
|  | ||||
| // GetExtensions returns a slice of the extensions present in pb that are also listed in es. | ||||
| // The returned slice has the same length as es; missing extensions will appear as nil elements. | ||||
| func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { | ||||
| 	epb, ok := extendable(pb) | ||||
| 	if !ok { | ||||
| 		return nil, errors.New("proto: not an extendable proto") | ||||
| 	} | ||||
| 	extensions = make([]interface{}, len(es)) | ||||
| 	for i, e := range es { | ||||
| 		extensions[i], err = GetExtension(epb, e) | ||||
| 		if err == ErrMissingExtension { | ||||
| 			err = nil | ||||
| 		} | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. | ||||
| // For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing | ||||
| // just the Field field, which defines the extension's field number. | ||||
| func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { | ||||
| 	epb, ok := extendable(pb) | ||||
| 	if !ok { | ||||
| 		return nil, fmt.Errorf("proto: %T is not an extendable proto.Message", pb) | ||||
| 	} | ||||
| 	registeredExtensions := RegisteredExtensions(pb) | ||||
|  | ||||
| 	emap, mu := epb.extensionsRead() | ||||
| 	if emap == nil { | ||||
| 		return nil, nil | ||||
| 	} | ||||
| 	mu.Lock() | ||||
| 	defer mu.Unlock() | ||||
| 	extensions := make([]*ExtensionDesc, 0, len(emap)) | ||||
| 	for extid, e := range emap { | ||||
| 		desc := e.desc | ||||
| 		if desc == nil { | ||||
| 			desc = registeredExtensions[extid] | ||||
| 			if desc == nil { | ||||
| 				desc = &ExtensionDesc{Field: extid} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		extensions = append(extensions, desc) | ||||
| 	} | ||||
| 	return extensions, nil | ||||
| } | ||||
|  | ||||
| // SetExtension sets the specified extension of pb to the specified value. | ||||
| func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { | ||||
| 	epb, ok := extendable(pb) | ||||
| 	if !ok { | ||||
| 		return errors.New("proto: not an extendable proto") | ||||
| 	} | ||||
| 	if err := checkExtensionTypes(epb, extension); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	typ := reflect.TypeOf(extension.ExtensionType) | ||||
| 	if typ != reflect.TypeOf(value) { | ||||
| 		return errors.New("proto: bad extension value type") | ||||
| 	} | ||||
| 	// nil extension values need to be caught early, because the | ||||
| 	// encoder can't distinguish an ErrNil due to a nil extension | ||||
| 	// from an ErrNil due to a missing field. Extensions are | ||||
| 	// always optional, so the encoder would just swallow the error | ||||
| 	// and drop all the extensions from the encoded message. | ||||
| 	if reflect.ValueOf(value).IsNil() { | ||||
| 		return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) | ||||
| 	} | ||||
|  | ||||
| 	extmap := epb.extensionsWrite() | ||||
| 	extmap[extension.Field] = Extension{desc: extension, value: value} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // ClearAllExtensions clears all extensions from pb. | ||||
| func ClearAllExtensions(pb Message) { | ||||
| 	epb, ok := extendable(pb) | ||||
| 	if !ok { | ||||
| 		return | ||||
| 	} | ||||
| 	m := epb.extensionsWrite() | ||||
| 	for k := range m { | ||||
| 		delete(m, k) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // A global registry of extensions. | ||||
| // The generated code will register the generated descriptors by calling RegisterExtension. | ||||
|  | ||||
| var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) | ||||
|  | ||||
| // RegisterExtension is called from the generated code. | ||||
| func RegisterExtension(desc *ExtensionDesc) { | ||||
| 	st := reflect.TypeOf(desc.ExtendedType).Elem() | ||||
| 	m := extensionMaps[st] | ||||
| 	if m == nil { | ||||
| 		m = make(map[int32]*ExtensionDesc) | ||||
| 		extensionMaps[st] = m | ||||
| 	} | ||||
| 	if _, ok := m[desc.Field]; ok { | ||||
| 		panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) | ||||
| 	} | ||||
| 	m[desc.Field] = desc | ||||
| } | ||||
|  | ||||
| // RegisteredExtensions returns a map of the registered extensions of a | ||||
| // protocol buffer struct, indexed by the extension number. | ||||
| // The argument pb should be a nil pointer to the struct type. | ||||
| func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { | ||||
| 	return extensionMaps[reflect.TypeOf(pb).Elem()] | ||||
| } | ||||
							
								
								
									
										508
									
								
								vendor/github.com/golang/protobuf/proto/extensions_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										508
									
								
								vendor/github.com/golang/protobuf/proto/extensions_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,508 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2014 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto_test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	pb "github.com/golang/protobuf/proto/testdata" | ||||
| ) | ||||
|  | ||||
| func TestGetExtensionsWithMissingExtensions(t *testing.T) { | ||||
| 	msg := &pb.MyMessage{} | ||||
| 	ext1 := &pb.Ext{} | ||||
| 	if err := proto.SetExtension(msg, pb.E_Ext_More, ext1); err != nil { | ||||
| 		t.Fatalf("Could not set ext1: %s", err) | ||||
| 	} | ||||
| 	exts, err := proto.GetExtensions(msg, []*proto.ExtensionDesc{ | ||||
| 		pb.E_Ext_More, | ||||
| 		pb.E_Ext_Text, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("GetExtensions() failed: %s", err) | ||||
| 	} | ||||
| 	if exts[0] != ext1 { | ||||
| 		t.Errorf("ext1 not in returned extensions: %T %v", exts[0], exts[0]) | ||||
| 	} | ||||
| 	if exts[1] != nil { | ||||
| 		t.Errorf("ext2 in returned extensions: %T %v", exts[1], exts[1]) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestExtensionDescsWithMissingExtensions(t *testing.T) { | ||||
| 	msg := &pb.MyMessage{Count: proto.Int32(0)} | ||||
| 	extdesc1 := pb.E_Ext_More | ||||
| 	if descs, err := proto.ExtensionDescs(msg); len(descs) != 0 || err != nil { | ||||
| 		t.Errorf("proto.ExtensionDescs: got %d descs, error %v; want 0, nil", len(descs), err) | ||||
| 	} | ||||
|  | ||||
| 	ext1 := &pb.Ext{} | ||||
| 	if err := proto.SetExtension(msg, extdesc1, ext1); err != nil { | ||||
| 		t.Fatalf("Could not set ext1: %s", err) | ||||
| 	} | ||||
| 	extdesc2 := &proto.ExtensionDesc{ | ||||
| 		ExtendedType:  (*pb.MyMessage)(nil), | ||||
| 		ExtensionType: (*bool)(nil), | ||||
| 		Field:         123456789, | ||||
| 		Name:          "a.b", | ||||
| 		Tag:           "varint,123456789,opt", | ||||
| 	} | ||||
| 	ext2 := proto.Bool(false) | ||||
| 	if err := proto.SetExtension(msg, extdesc2, ext2); err != nil { | ||||
| 		t.Fatalf("Could not set ext2: %s", err) | ||||
| 	} | ||||
|  | ||||
| 	b, err := proto.Marshal(msg) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("Could not marshal msg: %v", err) | ||||
| 	} | ||||
| 	if err := proto.Unmarshal(b, msg); err != nil { | ||||
| 		t.Fatalf("Could not unmarshal into msg: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	descs, err := proto.ExtensionDescs(msg) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("proto.ExtensionDescs: got error %v", err) | ||||
| 	} | ||||
| 	sortExtDescs(descs) | ||||
| 	wantDescs := []*proto.ExtensionDesc{extdesc1, &proto.ExtensionDesc{Field: extdesc2.Field}} | ||||
| 	if !reflect.DeepEqual(descs, wantDescs) { | ||||
| 		t.Errorf("proto.ExtensionDescs(msg) sorted extension ids: got %+v, want %+v", descs, wantDescs) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type ExtensionDescSlice []*proto.ExtensionDesc | ||||
|  | ||||
| func (s ExtensionDescSlice) Len() int           { return len(s) } | ||||
| func (s ExtensionDescSlice) Less(i, j int) bool { return s[i].Field < s[j].Field } | ||||
| func (s ExtensionDescSlice) Swap(i, j int)      { s[i], s[j] = s[j], s[i] } | ||||
|  | ||||
| func sortExtDescs(s []*proto.ExtensionDesc) { | ||||
| 	sort.Sort(ExtensionDescSlice(s)) | ||||
| } | ||||
|  | ||||
| func TestGetExtensionStability(t *testing.T) { | ||||
| 	check := func(m *pb.MyMessage) bool { | ||||
| 		ext1, err := proto.GetExtension(m, pb.E_Ext_More) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("GetExtension() failed: %s", err) | ||||
| 		} | ||||
| 		ext2, err := proto.GetExtension(m, pb.E_Ext_More) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("GetExtension() failed: %s", err) | ||||
| 		} | ||||
| 		return ext1 == ext2 | ||||
| 	} | ||||
| 	msg := &pb.MyMessage{Count: proto.Int32(4)} | ||||
| 	ext0 := &pb.Ext{} | ||||
| 	if err := proto.SetExtension(msg, pb.E_Ext_More, ext0); err != nil { | ||||
| 		t.Fatalf("Could not set ext1: %s", ext0) | ||||
| 	} | ||||
| 	if !check(msg) { | ||||
| 		t.Errorf("GetExtension() not stable before marshaling") | ||||
| 	} | ||||
| 	bb, err := proto.Marshal(msg) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("Marshal() failed: %s", err) | ||||
| 	} | ||||
| 	msg1 := &pb.MyMessage{} | ||||
| 	err = proto.Unmarshal(bb, msg1) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("Unmarshal() failed: %s", err) | ||||
| 	} | ||||
| 	if !check(msg1) { | ||||
| 		t.Errorf("GetExtension() not stable after unmarshaling") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestGetExtensionDefaults(t *testing.T) { | ||||
| 	var setFloat64 float64 = 1 | ||||
| 	var setFloat32 float32 = 2 | ||||
| 	var setInt32 int32 = 3 | ||||
| 	var setInt64 int64 = 4 | ||||
| 	var setUint32 uint32 = 5 | ||||
| 	var setUint64 uint64 = 6 | ||||
| 	var setBool = true | ||||
| 	var setBool2 = false | ||||
| 	var setString = "Goodnight string" | ||||
| 	var setBytes = []byte("Goodnight bytes") | ||||
| 	var setEnum = pb.DefaultsMessage_TWO | ||||
|  | ||||
| 	type testcase struct { | ||||
| 		ext  *proto.ExtensionDesc // Extension we are testing. | ||||
| 		want interface{}          // Expected value of extension, or nil (meaning that GetExtension will fail). | ||||
| 		def  interface{}          // Expected value of extension after ClearExtension(). | ||||
| 	} | ||||
| 	tests := []testcase{ | ||||
| 		{pb.E_NoDefaultDouble, setFloat64, nil}, | ||||
| 		{pb.E_NoDefaultFloat, setFloat32, nil}, | ||||
| 		{pb.E_NoDefaultInt32, setInt32, nil}, | ||||
| 		{pb.E_NoDefaultInt64, setInt64, nil}, | ||||
| 		{pb.E_NoDefaultUint32, setUint32, nil}, | ||||
| 		{pb.E_NoDefaultUint64, setUint64, nil}, | ||||
| 		{pb.E_NoDefaultSint32, setInt32, nil}, | ||||
| 		{pb.E_NoDefaultSint64, setInt64, nil}, | ||||
| 		{pb.E_NoDefaultFixed32, setUint32, nil}, | ||||
| 		{pb.E_NoDefaultFixed64, setUint64, nil}, | ||||
| 		{pb.E_NoDefaultSfixed32, setInt32, nil}, | ||||
| 		{pb.E_NoDefaultSfixed64, setInt64, nil}, | ||||
| 		{pb.E_NoDefaultBool, setBool, nil}, | ||||
| 		{pb.E_NoDefaultBool, setBool2, nil}, | ||||
| 		{pb.E_NoDefaultString, setString, nil}, | ||||
| 		{pb.E_NoDefaultBytes, setBytes, nil}, | ||||
| 		{pb.E_NoDefaultEnum, setEnum, nil}, | ||||
| 		{pb.E_DefaultDouble, setFloat64, float64(3.1415)}, | ||||
| 		{pb.E_DefaultFloat, setFloat32, float32(3.14)}, | ||||
| 		{pb.E_DefaultInt32, setInt32, int32(42)}, | ||||
| 		{pb.E_DefaultInt64, setInt64, int64(43)}, | ||||
| 		{pb.E_DefaultUint32, setUint32, uint32(44)}, | ||||
| 		{pb.E_DefaultUint64, setUint64, uint64(45)}, | ||||
| 		{pb.E_DefaultSint32, setInt32, int32(46)}, | ||||
| 		{pb.E_DefaultSint64, setInt64, int64(47)}, | ||||
| 		{pb.E_DefaultFixed32, setUint32, uint32(48)}, | ||||
| 		{pb.E_DefaultFixed64, setUint64, uint64(49)}, | ||||
| 		{pb.E_DefaultSfixed32, setInt32, int32(50)}, | ||||
| 		{pb.E_DefaultSfixed64, setInt64, int64(51)}, | ||||
| 		{pb.E_DefaultBool, setBool, true}, | ||||
| 		{pb.E_DefaultBool, setBool2, true}, | ||||
| 		{pb.E_DefaultString, setString, "Hello, string"}, | ||||
| 		{pb.E_DefaultBytes, setBytes, []byte("Hello, bytes")}, | ||||
| 		{pb.E_DefaultEnum, setEnum, pb.DefaultsMessage_ONE}, | ||||
| 	} | ||||
|  | ||||
| 	checkVal := func(test testcase, msg *pb.DefaultsMessage, valWant interface{}) error { | ||||
| 		val, err := proto.GetExtension(msg, test.ext) | ||||
| 		if err != nil { | ||||
| 			if valWant != nil { | ||||
| 				return fmt.Errorf("GetExtension(): %s", err) | ||||
| 			} | ||||
| 			if want := proto.ErrMissingExtension; err != want { | ||||
| 				return fmt.Errorf("Unexpected error: got %v, want %v", err, want) | ||||
| 			} | ||||
| 			return nil | ||||
| 		} | ||||
|  | ||||
| 		// All proto2 extension values are either a pointer to a value or a slice of values. | ||||
| 		ty := reflect.TypeOf(val) | ||||
| 		tyWant := reflect.TypeOf(test.ext.ExtensionType) | ||||
| 		if got, want := ty, tyWant; got != want { | ||||
| 			return fmt.Errorf("unexpected reflect.TypeOf(): got %v want %v", got, want) | ||||
| 		} | ||||
| 		tye := ty.Elem() | ||||
| 		tyeWant := tyWant.Elem() | ||||
| 		if got, want := tye, tyeWant; got != want { | ||||
| 			return fmt.Errorf("unexpected reflect.TypeOf().Elem(): got %v want %v", got, want) | ||||
| 		} | ||||
|  | ||||
| 		// Check the name of the type of the value. | ||||
| 		// If it is an enum it will be type int32 with the name of the enum. | ||||
| 		if got, want := tye.Name(), tye.Name(); got != want { | ||||
| 			return fmt.Errorf("unexpected reflect.TypeOf().Elem().Name(): got %v want %v", got, want) | ||||
| 		} | ||||
|  | ||||
| 		// Check that value is what we expect. | ||||
| 		// If we have a pointer in val, get the value it points to. | ||||
| 		valExp := val | ||||
| 		if ty.Kind() == reflect.Ptr { | ||||
| 			valExp = reflect.ValueOf(val).Elem().Interface() | ||||
| 		} | ||||
| 		if got, want := valExp, valWant; !reflect.DeepEqual(got, want) { | ||||
| 			return fmt.Errorf("unexpected reflect.DeepEqual(): got %v want %v", got, want) | ||||
| 		} | ||||
|  | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	setTo := func(test testcase) interface{} { | ||||
| 		setTo := reflect.ValueOf(test.want) | ||||
| 		if typ := reflect.TypeOf(test.ext.ExtensionType); typ.Kind() == reflect.Ptr { | ||||
| 			setTo = reflect.New(typ).Elem() | ||||
| 			setTo.Set(reflect.New(setTo.Type().Elem())) | ||||
| 			setTo.Elem().Set(reflect.ValueOf(test.want)) | ||||
| 		} | ||||
| 		return setTo.Interface() | ||||
| 	} | ||||
|  | ||||
| 	for _, test := range tests { | ||||
| 		msg := &pb.DefaultsMessage{} | ||||
| 		name := test.ext.Name | ||||
|  | ||||
| 		// Check the initial value. | ||||
| 		if err := checkVal(test, msg, test.def); err != nil { | ||||
| 			t.Errorf("%s: %v", name, err) | ||||
| 		} | ||||
|  | ||||
| 		// Set the per-type value and check value. | ||||
| 		name = fmt.Sprintf("%s (set to %T %v)", name, test.want, test.want) | ||||
| 		if err := proto.SetExtension(msg, test.ext, setTo(test)); err != nil { | ||||
| 			t.Errorf("%s: SetExtension(): %v", name, err) | ||||
| 			continue | ||||
| 		} | ||||
| 		if err := checkVal(test, msg, test.want); err != nil { | ||||
| 			t.Errorf("%s: %v", name, err) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// Set and check the value. | ||||
| 		name += " (cleared)" | ||||
| 		proto.ClearExtension(msg, test.ext) | ||||
| 		if err := checkVal(test, msg, test.def); err != nil { | ||||
| 			t.Errorf("%s: %v", name, err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestExtensionsRoundTrip(t *testing.T) { | ||||
| 	msg := &pb.MyMessage{} | ||||
| 	ext1 := &pb.Ext{ | ||||
| 		Data: proto.String("hi"), | ||||
| 	} | ||||
| 	ext2 := &pb.Ext{ | ||||
| 		Data: proto.String("there"), | ||||
| 	} | ||||
| 	exists := proto.HasExtension(msg, pb.E_Ext_More) | ||||
| 	if exists { | ||||
| 		t.Error("Extension More present unexpectedly") | ||||
| 	} | ||||
| 	if err := proto.SetExtension(msg, pb.E_Ext_More, ext1); err != nil { | ||||
| 		t.Error(err) | ||||
| 	} | ||||
| 	if err := proto.SetExtension(msg, pb.E_Ext_More, ext2); err != nil { | ||||
| 		t.Error(err) | ||||
| 	} | ||||
| 	e, err := proto.GetExtension(msg, pb.E_Ext_More) | ||||
| 	if err != nil { | ||||
| 		t.Error(err) | ||||
| 	} | ||||
| 	x, ok := e.(*pb.Ext) | ||||
| 	if !ok { | ||||
| 		t.Errorf("e has type %T, expected testdata.Ext", e) | ||||
| 	} else if *x.Data != "there" { | ||||
| 		t.Errorf("SetExtension failed to overwrite, got %+v, not 'there'", x) | ||||
| 	} | ||||
| 	proto.ClearExtension(msg, pb.E_Ext_More) | ||||
| 	if _, err = proto.GetExtension(msg, pb.E_Ext_More); err != proto.ErrMissingExtension { | ||||
| 		t.Errorf("got %v, expected ErrMissingExtension", e) | ||||
| 	} | ||||
| 	if _, err := proto.GetExtension(msg, pb.E_X215); err == nil { | ||||
| 		t.Error("expected bad extension error, got nil") | ||||
| 	} | ||||
| 	if err := proto.SetExtension(msg, pb.E_X215, 12); err == nil { | ||||
| 		t.Error("expected extension err") | ||||
| 	} | ||||
| 	if err := proto.SetExtension(msg, pb.E_Ext_More, 12); err == nil { | ||||
| 		t.Error("expected some sort of type mismatch error, got nil") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestNilExtension(t *testing.T) { | ||||
| 	msg := &pb.MyMessage{ | ||||
| 		Count: proto.Int32(1), | ||||
| 	} | ||||
| 	if err := proto.SetExtension(msg, pb.E_Ext_Text, proto.String("hello")); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	if err := proto.SetExtension(msg, pb.E_Ext_More, (*pb.Ext)(nil)); err == nil { | ||||
| 		t.Error("expected SetExtension to fail due to a nil extension") | ||||
| 	} else if want := "proto: SetExtension called with nil value of type *testdata.Ext"; err.Error() != want { | ||||
| 		t.Errorf("expected error %v, got %v", want, err) | ||||
| 	} | ||||
| 	// Note: if the behavior of Marshal is ever changed to ignore nil extensions, update | ||||
| 	// this test to verify that E_Ext_Text is properly propagated through marshal->unmarshal. | ||||
| } | ||||
|  | ||||
| func TestMarshalUnmarshalRepeatedExtension(t *testing.T) { | ||||
| 	// Add a repeated extension to the result. | ||||
| 	tests := []struct { | ||||
| 		name string | ||||
| 		ext  []*pb.ComplexExtension | ||||
| 	}{ | ||||
| 		{ | ||||
| 			"two fields", | ||||
| 			[]*pb.ComplexExtension{ | ||||
| 				{First: proto.Int32(7)}, | ||||
| 				{Second: proto.Int32(11)}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			"repeated field", | ||||
| 			[]*pb.ComplexExtension{ | ||||
| 				{Third: []int32{1000}}, | ||||
| 				{Third: []int32{2000}}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			"two fields and repeated field", | ||||
| 			[]*pb.ComplexExtension{ | ||||
| 				{Third: []int32{1000}}, | ||||
| 				{First: proto.Int32(9)}, | ||||
| 				{Second: proto.Int32(21)}, | ||||
| 				{Third: []int32{2000}}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	for _, test := range tests { | ||||
| 		// Marshal message with a repeated extension. | ||||
| 		msg1 := new(pb.OtherMessage) | ||||
| 		err := proto.SetExtension(msg1, pb.E_RComplex, test.ext) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("[%s] Error setting extension: %v", test.name, err) | ||||
| 		} | ||||
| 		b, err := proto.Marshal(msg1) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("[%s] Error marshaling message: %v", test.name, err) | ||||
| 		} | ||||
|  | ||||
| 		// Unmarshal and read the merged proto. | ||||
| 		msg2 := new(pb.OtherMessage) | ||||
| 		err = proto.Unmarshal(b, msg2) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err) | ||||
| 		} | ||||
| 		e, err := proto.GetExtension(msg2, pb.E_RComplex) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("[%s] Error getting extension: %v", test.name, err) | ||||
| 		} | ||||
| 		ext := e.([]*pb.ComplexExtension) | ||||
| 		if ext == nil { | ||||
| 			t.Fatalf("[%s] Invalid extension", test.name) | ||||
| 		} | ||||
| 		if !reflect.DeepEqual(ext, test.ext) { | ||||
| 			t.Errorf("[%s] Wrong value for ComplexExtension: got: %v want: %v\n", test.name, ext, test.ext) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestUnmarshalRepeatingNonRepeatedExtension(t *testing.T) { | ||||
| 	// We may see multiple instances of the same extension in the wire | ||||
| 	// format. For example, the proto compiler may encode custom options in | ||||
| 	// this way. Here, we verify that we merge the extensions together. | ||||
| 	tests := []struct { | ||||
| 		name string | ||||
| 		ext  []*pb.ComplexExtension | ||||
| 	}{ | ||||
| 		{ | ||||
| 			"two fields", | ||||
| 			[]*pb.ComplexExtension{ | ||||
| 				{First: proto.Int32(7)}, | ||||
| 				{Second: proto.Int32(11)}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			"repeated field", | ||||
| 			[]*pb.ComplexExtension{ | ||||
| 				{Third: []int32{1000}}, | ||||
| 				{Third: []int32{2000}}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			"two fields and repeated field", | ||||
| 			[]*pb.ComplexExtension{ | ||||
| 				{Third: []int32{1000}}, | ||||
| 				{First: proto.Int32(9)}, | ||||
| 				{Second: proto.Int32(21)}, | ||||
| 				{Third: []int32{2000}}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	for _, test := range tests { | ||||
| 		var buf bytes.Buffer | ||||
| 		var want pb.ComplexExtension | ||||
|  | ||||
| 		// Generate a serialized representation of a repeated extension | ||||
| 		// by catenating bytes together. | ||||
| 		for i, e := range test.ext { | ||||
| 			// Merge to create the wanted proto. | ||||
| 			proto.Merge(&want, e) | ||||
|  | ||||
| 			// serialize the message | ||||
| 			msg := new(pb.OtherMessage) | ||||
| 			err := proto.SetExtension(msg, pb.E_Complex, e) | ||||
| 			if err != nil { | ||||
| 				t.Fatalf("[%s] Error setting extension %d: %v", test.name, i, err) | ||||
| 			} | ||||
| 			b, err := proto.Marshal(msg) | ||||
| 			if err != nil { | ||||
| 				t.Fatalf("[%s] Error marshaling message %d: %v", test.name, i, err) | ||||
| 			} | ||||
| 			buf.Write(b) | ||||
| 		} | ||||
|  | ||||
| 		// Unmarshal and read the merged proto. | ||||
| 		msg2 := new(pb.OtherMessage) | ||||
| 		err := proto.Unmarshal(buf.Bytes(), msg2) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("[%s] Error unmarshaling message: %v", test.name, err) | ||||
| 		} | ||||
| 		e, err := proto.GetExtension(msg2, pb.E_Complex) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("[%s] Error getting extension: %v", test.name, err) | ||||
| 		} | ||||
| 		ext := e.(*pb.ComplexExtension) | ||||
| 		if ext == nil { | ||||
| 			t.Fatalf("[%s] Invalid extension", test.name) | ||||
| 		} | ||||
| 		if !reflect.DeepEqual(*ext, want) { | ||||
| 			t.Errorf("[%s] Wrong value for ComplexExtension: got: %s want: %s\n", test.name, ext, want) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestClearAllExtensions(t *testing.T) { | ||||
| 	// unregistered extension | ||||
| 	desc := &proto.ExtensionDesc{ | ||||
| 		ExtendedType:  (*pb.MyMessage)(nil), | ||||
| 		ExtensionType: (*bool)(nil), | ||||
| 		Field:         101010100, | ||||
| 		Name:          "emptyextension", | ||||
| 		Tag:           "varint,0,opt", | ||||
| 	} | ||||
| 	m := &pb.MyMessage{} | ||||
| 	if proto.HasExtension(m, desc) { | ||||
| 		t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m)) | ||||
| 	} | ||||
| 	if err := proto.SetExtension(m, desc, proto.Bool(true)); err != nil { | ||||
| 		t.Errorf("proto.SetExtension(m, desc, true): got error %q, want nil", err) | ||||
| 	} | ||||
| 	if !proto.HasExtension(m, desc) { | ||||
| 		t.Errorf("proto.HasExtension(%s): got false, want true", proto.MarshalTextString(m)) | ||||
| 	} | ||||
| 	proto.ClearAllExtensions(m) | ||||
| 	if proto.HasExtension(m, desc) { | ||||
| 		t.Errorf("proto.HasExtension(%s): got true, want false", proto.MarshalTextString(m)) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										898
									
								
								vendor/github.com/golang/protobuf/proto/lib.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										898
									
								
								vendor/github.com/golang/protobuf/proto/lib.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,898 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| /* | ||||
| Package proto converts data structures to and from the wire format of | ||||
| protocol buffers.  It works in concert with the Go source code generated | ||||
| for .proto files by the protocol compiler. | ||||
|  | ||||
| A summary of the properties of the protocol buffer interface | ||||
| for a protocol buffer variable v: | ||||
|  | ||||
|   - Names are turned from camel_case to CamelCase for export. | ||||
|   - There are no methods on v to set fields; just treat | ||||
| 	them as structure fields. | ||||
|   - There are getters that return a field's value if set, | ||||
| 	and return the field's default value if unset. | ||||
| 	The getters work even if the receiver is a nil message. | ||||
|   - The zero value for a struct is its correct initialization state. | ||||
| 	All desired fields must be set before marshaling. | ||||
|   - A Reset() method will restore a protobuf struct to its zero state. | ||||
|   - Non-repeated fields are pointers to the values; nil means unset. | ||||
| 	That is, optional or required field int32 f becomes F *int32. | ||||
|   - Repeated fields are slices. | ||||
|   - Helper functions are available to aid the setting of fields. | ||||
| 	msg.Foo = proto.String("hello") // set field | ||||
|   - Constants are defined to hold the default values of all fields that | ||||
| 	have them.  They have the form Default_StructName_FieldName. | ||||
| 	Because the getter methods handle defaulted values, | ||||
| 	direct use of these constants should be rare. | ||||
|   - Enums are given type names and maps from names to values. | ||||
| 	Enum values are prefixed by the enclosing message's name, or by the | ||||
| 	enum's type name if it is a top-level enum. Enum types have a String | ||||
| 	method, and a Enum method to assist in message construction. | ||||
|   - Nested messages, groups and enums have type names prefixed with the name of | ||||
| 	the surrounding message type. | ||||
|   - Extensions are given descriptor names that start with E_, | ||||
| 	followed by an underscore-delimited list of the nested messages | ||||
| 	that contain it (if any) followed by the CamelCased name of the | ||||
| 	extension field itself.  HasExtension, ClearExtension, GetExtension | ||||
| 	and SetExtension are functions for manipulating extensions. | ||||
|   - Oneof field sets are given a single field in their message, | ||||
| 	with distinguished wrapper types for each possible field value. | ||||
|   - Marshal and Unmarshal are functions to encode and decode the wire format. | ||||
|  | ||||
| When the .proto file specifies `syntax="proto3"`, there are some differences: | ||||
|  | ||||
|   - Non-repeated fields of non-message type are values instead of pointers. | ||||
|   - Getters are only generated for message and oneof fields. | ||||
|   - Enum types do not get an Enum method. | ||||
|  | ||||
| The simplest way to describe this is to see an example. | ||||
| Given file test.proto, containing | ||||
|  | ||||
| 	package example; | ||||
|  | ||||
| 	enum FOO { X = 17; } | ||||
|  | ||||
| 	message Test { | ||||
| 	  required string label = 1; | ||||
| 	  optional int32 type = 2 [default=77]; | ||||
| 	  repeated int64 reps = 3; | ||||
| 	  optional group OptionalGroup = 4 { | ||||
| 	    required string RequiredField = 5; | ||||
| 	  } | ||||
| 	  oneof union { | ||||
| 	    int32 number = 6; | ||||
| 	    string name = 7; | ||||
| 	  } | ||||
| 	} | ||||
|  | ||||
| The resulting file, test.pb.go, is: | ||||
|  | ||||
| 	package example | ||||
|  | ||||
| 	import proto "github.com/golang/protobuf/proto" | ||||
| 	import math "math" | ||||
|  | ||||
| 	type FOO int32 | ||||
| 	const ( | ||||
| 		FOO_X FOO = 17 | ||||
| 	) | ||||
| 	var FOO_name = map[int32]string{ | ||||
| 		17: "X", | ||||
| 	} | ||||
| 	var FOO_value = map[string]int32{ | ||||
| 		"X": 17, | ||||
| 	} | ||||
|  | ||||
| 	func (x FOO) Enum() *FOO { | ||||
| 		p := new(FOO) | ||||
| 		*p = x | ||||
| 		return p | ||||
| 	} | ||||
| 	func (x FOO) String() string { | ||||
| 		return proto.EnumName(FOO_name, int32(x)) | ||||
| 	} | ||||
| 	func (x *FOO) UnmarshalJSON(data []byte) error { | ||||
| 		value, err := proto.UnmarshalJSONEnum(FOO_value, data) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		*x = FOO(value) | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	type Test struct { | ||||
| 		Label         *string             `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` | ||||
| 		Type          *int32              `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` | ||||
| 		Reps          []int64             `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` | ||||
| 		Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` | ||||
| 		// Types that are valid to be assigned to Union: | ||||
| 		//	*Test_Number | ||||
| 		//	*Test_Name | ||||
| 		Union            isTest_Union `protobuf_oneof:"union"` | ||||
| 		XXX_unrecognized []byte       `json:"-"` | ||||
| 	} | ||||
| 	func (m *Test) Reset()         { *m = Test{} } | ||||
| 	func (m *Test) String() string { return proto.CompactTextString(m) } | ||||
| 	func (*Test) ProtoMessage() {} | ||||
|  | ||||
| 	type isTest_Union interface { | ||||
| 		isTest_Union() | ||||
| 	} | ||||
|  | ||||
| 	type Test_Number struct { | ||||
| 		Number int32 `protobuf:"varint,6,opt,name=number"` | ||||
| 	} | ||||
| 	type Test_Name struct { | ||||
| 		Name string `protobuf:"bytes,7,opt,name=name"` | ||||
| 	} | ||||
|  | ||||
| 	func (*Test_Number) isTest_Union() {} | ||||
| 	func (*Test_Name) isTest_Union()   {} | ||||
|  | ||||
| 	func (m *Test) GetUnion() isTest_Union { | ||||
| 		if m != nil { | ||||
| 			return m.Union | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
| 	const Default_Test_Type int32 = 77 | ||||
|  | ||||
| 	func (m *Test) GetLabel() string { | ||||
| 		if m != nil && m.Label != nil { | ||||
| 			return *m.Label | ||||
| 		} | ||||
| 		return "" | ||||
| 	} | ||||
|  | ||||
| 	func (m *Test) GetType() int32 { | ||||
| 		if m != nil && m.Type != nil { | ||||
| 			return *m.Type | ||||
| 		} | ||||
| 		return Default_Test_Type | ||||
| 	} | ||||
|  | ||||
| 	func (m *Test) GetOptionalgroup() *Test_OptionalGroup { | ||||
| 		if m != nil { | ||||
| 			return m.Optionalgroup | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	type Test_OptionalGroup struct { | ||||
| 		RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` | ||||
| 	} | ||||
| 	func (m *Test_OptionalGroup) Reset()         { *m = Test_OptionalGroup{} } | ||||
| 	func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } | ||||
|  | ||||
| 	func (m *Test_OptionalGroup) GetRequiredField() string { | ||||
| 		if m != nil && m.RequiredField != nil { | ||||
| 			return *m.RequiredField | ||||
| 		} | ||||
| 		return "" | ||||
| 	} | ||||
|  | ||||
| 	func (m *Test) GetNumber() int32 { | ||||
| 		if x, ok := m.GetUnion().(*Test_Number); ok { | ||||
| 			return x.Number | ||||
| 		} | ||||
| 		return 0 | ||||
| 	} | ||||
|  | ||||
| 	func (m *Test) GetName() string { | ||||
| 		if x, ok := m.GetUnion().(*Test_Name); ok { | ||||
| 			return x.Name | ||||
| 		} | ||||
| 		return "" | ||||
| 	} | ||||
|  | ||||
| 	func init() { | ||||
| 		proto.RegisterEnum("example.FOO", FOO_name, FOO_value) | ||||
| 	} | ||||
|  | ||||
| To create and play with a Test object: | ||||
|  | ||||
| 	package main | ||||
|  | ||||
| 	import ( | ||||
| 		"log" | ||||
|  | ||||
| 		"github.com/golang/protobuf/proto" | ||||
| 		pb "./example.pb" | ||||
| 	) | ||||
|  | ||||
| 	func main() { | ||||
| 		test := &pb.Test{ | ||||
| 			Label: proto.String("hello"), | ||||
| 			Type:  proto.Int32(17), | ||||
| 			Reps:  []int64{1, 2, 3}, | ||||
| 			Optionalgroup: &pb.Test_OptionalGroup{ | ||||
| 				RequiredField: proto.String("good bye"), | ||||
| 			}, | ||||
| 			Union: &pb.Test_Name{"fred"}, | ||||
| 		} | ||||
| 		data, err := proto.Marshal(test) | ||||
| 		if err != nil { | ||||
| 			log.Fatal("marshaling error: ", err) | ||||
| 		} | ||||
| 		newTest := &pb.Test{} | ||||
| 		err = proto.Unmarshal(data, newTest) | ||||
| 		if err != nil { | ||||
| 			log.Fatal("unmarshaling error: ", err) | ||||
| 		} | ||||
| 		// Now test and newTest contain the same data. | ||||
| 		if test.GetLabel() != newTest.GetLabel() { | ||||
| 			log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) | ||||
| 		} | ||||
| 		// Use a type switch to determine which oneof was set. | ||||
| 		switch u := test.Union.(type) { | ||||
| 		case *pb.Test_Number: // u.Number contains the number. | ||||
| 		case *pb.Test_Name: // u.Name contains the string. | ||||
| 		} | ||||
| 		// etc. | ||||
| 	} | ||||
| */ | ||||
| package proto | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"log" | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
| 	"strconv" | ||||
| 	"sync" | ||||
| ) | ||||
|  | ||||
| // Message is implemented by generated protocol buffer messages. | ||||
| type Message interface { | ||||
| 	Reset() | ||||
| 	String() string | ||||
| 	ProtoMessage() | ||||
| } | ||||
|  | ||||
| // Stats records allocation details about the protocol buffer encoders | ||||
| // and decoders.  Useful for tuning the library itself. | ||||
| type Stats struct { | ||||
| 	Emalloc uint64 // mallocs in encode | ||||
| 	Dmalloc uint64 // mallocs in decode | ||||
| 	Encode  uint64 // number of encodes | ||||
| 	Decode  uint64 // number of decodes | ||||
| 	Chit    uint64 // number of cache hits | ||||
| 	Cmiss   uint64 // number of cache misses | ||||
| 	Size    uint64 // number of sizes | ||||
| } | ||||
|  | ||||
| // Set to true to enable stats collection. | ||||
| const collectStats = false | ||||
|  | ||||
| var stats Stats | ||||
|  | ||||
| // GetStats returns a copy of the global Stats structure. | ||||
| func GetStats() Stats { return stats } | ||||
|  | ||||
| // A Buffer is a buffer manager for marshaling and unmarshaling | ||||
| // protocol buffers.  It may be reused between invocations to | ||||
| // reduce memory usage.  It is not necessary to use a Buffer; | ||||
| // the global functions Marshal and Unmarshal create a | ||||
| // temporary Buffer and are fine for most applications. | ||||
| type Buffer struct { | ||||
| 	buf   []byte // encode/decode byte stream | ||||
| 	index int    // read point | ||||
|  | ||||
| 	// pools of basic types to amortize allocation. | ||||
| 	bools   []bool | ||||
| 	uint32s []uint32 | ||||
| 	uint64s []uint64 | ||||
|  | ||||
| 	// extra pools, only used with pointer_reflect.go | ||||
| 	int32s   []int32 | ||||
| 	int64s   []int64 | ||||
| 	float32s []float32 | ||||
| 	float64s []float64 | ||||
| } | ||||
|  | ||||
| // NewBuffer allocates a new Buffer and initializes its internal data to | ||||
| // the contents of the argument slice. | ||||
| func NewBuffer(e []byte) *Buffer { | ||||
| 	return &Buffer{buf: e} | ||||
| } | ||||
|  | ||||
| // Reset resets the Buffer, ready for marshaling a new protocol buffer. | ||||
| func (p *Buffer) Reset() { | ||||
| 	p.buf = p.buf[0:0] // for reading/writing | ||||
| 	p.index = 0        // for reading | ||||
| } | ||||
|  | ||||
| // SetBuf replaces the internal buffer with the slice, | ||||
| // ready for unmarshaling the contents of the slice. | ||||
| func (p *Buffer) SetBuf(s []byte) { | ||||
| 	p.buf = s | ||||
| 	p.index = 0 | ||||
| } | ||||
|  | ||||
| // Bytes returns the contents of the Buffer. | ||||
| func (p *Buffer) Bytes() []byte { return p.buf } | ||||
|  | ||||
| /* | ||||
|  * Helper routines for simplifying the creation of optional fields of basic type. | ||||
|  */ | ||||
|  | ||||
| // Bool is a helper routine that allocates a new bool value | ||||
| // to store v and returns a pointer to it. | ||||
| func Bool(v bool) *bool { | ||||
| 	return &v | ||||
| } | ||||
|  | ||||
| // Int32 is a helper routine that allocates a new int32 value | ||||
| // to store v and returns a pointer to it. | ||||
| func Int32(v int32) *int32 { | ||||
| 	return &v | ||||
| } | ||||
|  | ||||
| // Int is a helper routine that allocates a new int32 value | ||||
| // to store v and returns a pointer to it, but unlike Int32 | ||||
| // its argument value is an int. | ||||
| func Int(v int) *int32 { | ||||
| 	p := new(int32) | ||||
| 	*p = int32(v) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| // Int64 is a helper routine that allocates a new int64 value | ||||
| // to store v and returns a pointer to it. | ||||
| func Int64(v int64) *int64 { | ||||
| 	return &v | ||||
| } | ||||
|  | ||||
| // Float32 is a helper routine that allocates a new float32 value | ||||
| // to store v and returns a pointer to it. | ||||
| func Float32(v float32) *float32 { | ||||
| 	return &v | ||||
| } | ||||
|  | ||||
| // Float64 is a helper routine that allocates a new float64 value | ||||
| // to store v and returns a pointer to it. | ||||
| func Float64(v float64) *float64 { | ||||
| 	return &v | ||||
| } | ||||
|  | ||||
| // Uint32 is a helper routine that allocates a new uint32 value | ||||
| // to store v and returns a pointer to it. | ||||
| func Uint32(v uint32) *uint32 { | ||||
| 	return &v | ||||
| } | ||||
|  | ||||
| // Uint64 is a helper routine that allocates a new uint64 value | ||||
| // to store v and returns a pointer to it. | ||||
| func Uint64(v uint64) *uint64 { | ||||
| 	return &v | ||||
| } | ||||
|  | ||||
| // String is a helper routine that allocates a new string value | ||||
| // to store v and returns a pointer to it. | ||||
| func String(v string) *string { | ||||
| 	return &v | ||||
| } | ||||
|  | ||||
| // EnumName is a helper function to simplify printing protocol buffer enums | ||||
| // by name.  Given an enum map and a value, it returns a useful string. | ||||
| func EnumName(m map[int32]string, v int32) string { | ||||
| 	s, ok := m[v] | ||||
| 	if ok { | ||||
| 		return s | ||||
| 	} | ||||
| 	return strconv.Itoa(int(v)) | ||||
| } | ||||
|  | ||||
| // UnmarshalJSONEnum is a helper function to simplify recovering enum int values | ||||
| // from their JSON-encoded representation. Given a map from the enum's symbolic | ||||
| // names to its int values, and a byte buffer containing the JSON-encoded | ||||
| // value, it returns an int32 that can be cast to the enum type by the caller. | ||||
| // | ||||
| // The function can deal with both JSON representations, numeric and symbolic. | ||||
| func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { | ||||
| 	if data[0] == '"' { | ||||
| 		// New style: enums are strings. | ||||
| 		var repr string | ||||
| 		if err := json.Unmarshal(data, &repr); err != nil { | ||||
| 			return -1, err | ||||
| 		} | ||||
| 		val, ok := m[repr] | ||||
| 		if !ok { | ||||
| 			return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) | ||||
| 		} | ||||
| 		return val, nil | ||||
| 	} | ||||
| 	// Old style: enums are ints. | ||||
| 	var val int32 | ||||
| 	if err := json.Unmarshal(data, &val); err != nil { | ||||
| 		return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) | ||||
| 	} | ||||
| 	return val, nil | ||||
| } | ||||
|  | ||||
| // DebugPrint dumps the encoded data in b in a debugging format with a header | ||||
| // including the string s. Used in testing but made available for general debugging. | ||||
| func (p *Buffer) DebugPrint(s string, b []byte) { | ||||
| 	var u uint64 | ||||
|  | ||||
| 	obuf := p.buf | ||||
| 	index := p.index | ||||
| 	p.buf = b | ||||
| 	p.index = 0 | ||||
| 	depth := 0 | ||||
|  | ||||
| 	fmt.Printf("\n--- %s ---\n", s) | ||||
|  | ||||
| out: | ||||
| 	for { | ||||
| 		for i := 0; i < depth; i++ { | ||||
| 			fmt.Print("  ") | ||||
| 		} | ||||
|  | ||||
| 		index := p.index | ||||
| 		if index == len(p.buf) { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		op, err := p.DecodeVarint() | ||||
| 		if err != nil { | ||||
| 			fmt.Printf("%3d: fetching op err %v\n", index, err) | ||||
| 			break out | ||||
| 		} | ||||
| 		tag := op >> 3 | ||||
| 		wire := op & 7 | ||||
|  | ||||
| 		switch wire { | ||||
| 		default: | ||||
| 			fmt.Printf("%3d: t=%3d unknown wire=%d\n", | ||||
| 				index, tag, wire) | ||||
| 			break out | ||||
|  | ||||
| 		case WireBytes: | ||||
| 			var r []byte | ||||
|  | ||||
| 			r, err = p.DecodeRawBytes(false) | ||||
| 			if err != nil { | ||||
| 				break out | ||||
| 			} | ||||
| 			fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) | ||||
| 			if len(r) <= 6 { | ||||
| 				for i := 0; i < len(r); i++ { | ||||
| 					fmt.Printf(" %.2x", r[i]) | ||||
| 				} | ||||
| 			} else { | ||||
| 				for i := 0; i < 3; i++ { | ||||
| 					fmt.Printf(" %.2x", r[i]) | ||||
| 				} | ||||
| 				fmt.Printf(" ..") | ||||
| 				for i := len(r) - 3; i < len(r); i++ { | ||||
| 					fmt.Printf(" %.2x", r[i]) | ||||
| 				} | ||||
| 			} | ||||
| 			fmt.Printf("\n") | ||||
|  | ||||
| 		case WireFixed32: | ||||
| 			u, err = p.DecodeFixed32() | ||||
| 			if err != nil { | ||||
| 				fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) | ||||
| 				break out | ||||
| 			} | ||||
| 			fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) | ||||
|  | ||||
| 		case WireFixed64: | ||||
| 			u, err = p.DecodeFixed64() | ||||
| 			if err != nil { | ||||
| 				fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) | ||||
| 				break out | ||||
| 			} | ||||
| 			fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) | ||||
|  | ||||
| 		case WireVarint: | ||||
| 			u, err = p.DecodeVarint() | ||||
| 			if err != nil { | ||||
| 				fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) | ||||
| 				break out | ||||
| 			} | ||||
| 			fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) | ||||
|  | ||||
| 		case WireStartGroup: | ||||
| 			fmt.Printf("%3d: t=%3d start\n", index, tag) | ||||
| 			depth++ | ||||
|  | ||||
| 		case WireEndGroup: | ||||
| 			depth-- | ||||
| 			fmt.Printf("%3d: t=%3d end\n", index, tag) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if depth != 0 { | ||||
| 		fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) | ||||
| 	} | ||||
| 	fmt.Printf("\n") | ||||
|  | ||||
| 	p.buf = obuf | ||||
| 	p.index = index | ||||
| } | ||||
|  | ||||
| // SetDefaults sets unset protocol buffer fields to their default values. | ||||
| // It only modifies fields that are both unset and have defined defaults. | ||||
| // It recursively sets default values in any non-nil sub-messages. | ||||
| func SetDefaults(pb Message) { | ||||
| 	setDefaults(reflect.ValueOf(pb), true, false) | ||||
| } | ||||
|  | ||||
| // v is a pointer to a struct. | ||||
| func setDefaults(v reflect.Value, recur, zeros bool) { | ||||
| 	v = v.Elem() | ||||
|  | ||||
| 	defaultMu.RLock() | ||||
| 	dm, ok := defaults[v.Type()] | ||||
| 	defaultMu.RUnlock() | ||||
| 	if !ok { | ||||
| 		dm = buildDefaultMessage(v.Type()) | ||||
| 		defaultMu.Lock() | ||||
| 		defaults[v.Type()] = dm | ||||
| 		defaultMu.Unlock() | ||||
| 	} | ||||
|  | ||||
| 	for _, sf := range dm.scalars { | ||||
| 		f := v.Field(sf.index) | ||||
| 		if !f.IsNil() { | ||||
| 			// field already set | ||||
| 			continue | ||||
| 		} | ||||
| 		dv := sf.value | ||||
| 		if dv == nil && !zeros { | ||||
| 			// no explicit default, and don't want to set zeros | ||||
| 			continue | ||||
| 		} | ||||
| 		fptr := f.Addr().Interface() // **T | ||||
| 		// TODO: Consider batching the allocations we do here. | ||||
| 		switch sf.kind { | ||||
| 		case reflect.Bool: | ||||
| 			b := new(bool) | ||||
| 			if dv != nil { | ||||
| 				*b = dv.(bool) | ||||
| 			} | ||||
| 			*(fptr.(**bool)) = b | ||||
| 		case reflect.Float32: | ||||
| 			f := new(float32) | ||||
| 			if dv != nil { | ||||
| 				*f = dv.(float32) | ||||
| 			} | ||||
| 			*(fptr.(**float32)) = f | ||||
| 		case reflect.Float64: | ||||
| 			f := new(float64) | ||||
| 			if dv != nil { | ||||
| 				*f = dv.(float64) | ||||
| 			} | ||||
| 			*(fptr.(**float64)) = f | ||||
| 		case reflect.Int32: | ||||
| 			// might be an enum | ||||
| 			if ft := f.Type(); ft != int32PtrType { | ||||
| 				// enum | ||||
| 				f.Set(reflect.New(ft.Elem())) | ||||
| 				if dv != nil { | ||||
| 					f.Elem().SetInt(int64(dv.(int32))) | ||||
| 				} | ||||
| 			} else { | ||||
| 				// int32 field | ||||
| 				i := new(int32) | ||||
| 				if dv != nil { | ||||
| 					*i = dv.(int32) | ||||
| 				} | ||||
| 				*(fptr.(**int32)) = i | ||||
| 			} | ||||
| 		case reflect.Int64: | ||||
| 			i := new(int64) | ||||
| 			if dv != nil { | ||||
| 				*i = dv.(int64) | ||||
| 			} | ||||
| 			*(fptr.(**int64)) = i | ||||
| 		case reflect.String: | ||||
| 			s := new(string) | ||||
| 			if dv != nil { | ||||
| 				*s = dv.(string) | ||||
| 			} | ||||
| 			*(fptr.(**string)) = s | ||||
| 		case reflect.Uint8: | ||||
| 			// exceptional case: []byte | ||||
| 			var b []byte | ||||
| 			if dv != nil { | ||||
| 				db := dv.([]byte) | ||||
| 				b = make([]byte, len(db)) | ||||
| 				copy(b, db) | ||||
| 			} else { | ||||
| 				b = []byte{} | ||||
| 			} | ||||
| 			*(fptr.(*[]byte)) = b | ||||
| 		case reflect.Uint32: | ||||
| 			u := new(uint32) | ||||
| 			if dv != nil { | ||||
| 				*u = dv.(uint32) | ||||
| 			} | ||||
| 			*(fptr.(**uint32)) = u | ||||
| 		case reflect.Uint64: | ||||
| 			u := new(uint64) | ||||
| 			if dv != nil { | ||||
| 				*u = dv.(uint64) | ||||
| 			} | ||||
| 			*(fptr.(**uint64)) = u | ||||
| 		default: | ||||
| 			log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	for _, ni := range dm.nested { | ||||
| 		f := v.Field(ni) | ||||
| 		// f is *T or []*T or map[T]*T | ||||
| 		switch f.Kind() { | ||||
| 		case reflect.Ptr: | ||||
| 			if f.IsNil() { | ||||
| 				continue | ||||
| 			} | ||||
| 			setDefaults(f, recur, zeros) | ||||
|  | ||||
| 		case reflect.Slice: | ||||
| 			for i := 0; i < f.Len(); i++ { | ||||
| 				e := f.Index(i) | ||||
| 				if e.IsNil() { | ||||
| 					continue | ||||
| 				} | ||||
| 				setDefaults(e, recur, zeros) | ||||
| 			} | ||||
|  | ||||
| 		case reflect.Map: | ||||
| 			for _, k := range f.MapKeys() { | ||||
| 				e := f.MapIndex(k) | ||||
| 				if e.IsNil() { | ||||
| 					continue | ||||
| 				} | ||||
| 				setDefaults(e, recur, zeros) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	// defaults maps a protocol buffer struct type to a slice of the fields, | ||||
| 	// with its scalar fields set to their proto-declared non-zero default values. | ||||
| 	defaultMu sync.RWMutex | ||||
| 	defaults  = make(map[reflect.Type]defaultMessage) | ||||
|  | ||||
| 	int32PtrType = reflect.TypeOf((*int32)(nil)) | ||||
| ) | ||||
|  | ||||
| // defaultMessage represents information about the default values of a message. | ||||
| type defaultMessage struct { | ||||
| 	scalars []scalarField | ||||
| 	nested  []int // struct field index of nested messages | ||||
| } | ||||
|  | ||||
| type scalarField struct { | ||||
| 	index int          // struct field index | ||||
| 	kind  reflect.Kind // element type (the T in *T or []T) | ||||
| 	value interface{}  // the proto-declared default value, or nil | ||||
| } | ||||
|  | ||||
| // t is a struct type. | ||||
| func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { | ||||
| 	sprop := GetProperties(t) | ||||
| 	for _, prop := range sprop.Prop { | ||||
| 		fi, ok := sprop.decoderTags.get(prop.Tag) | ||||
| 		if !ok { | ||||
| 			// XXX_unrecognized | ||||
| 			continue | ||||
| 		} | ||||
| 		ft := t.Field(fi).Type | ||||
|  | ||||
| 		sf, nested, err := fieldDefault(ft, prop) | ||||
| 		switch { | ||||
| 		case err != nil: | ||||
| 			log.Print(err) | ||||
| 		case nested: | ||||
| 			dm.nested = append(dm.nested, fi) | ||||
| 		case sf != nil: | ||||
| 			sf.index = fi | ||||
| 			dm.scalars = append(dm.scalars, *sf) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return dm | ||||
| } | ||||
|  | ||||
| // fieldDefault returns the scalarField for field type ft. | ||||
| // sf will be nil if the field can not have a default. | ||||
| // nestedMessage will be true if this is a nested message. | ||||
| // Note that sf.index is not set on return. | ||||
| func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { | ||||
| 	var canHaveDefault bool | ||||
| 	switch ft.Kind() { | ||||
| 	case reflect.Ptr: | ||||
| 		if ft.Elem().Kind() == reflect.Struct { | ||||
| 			nestedMessage = true | ||||
| 		} else { | ||||
| 			canHaveDefault = true // proto2 scalar field | ||||
| 		} | ||||
|  | ||||
| 	case reflect.Slice: | ||||
| 		switch ft.Elem().Kind() { | ||||
| 		case reflect.Ptr: | ||||
| 			nestedMessage = true // repeated message | ||||
| 		case reflect.Uint8: | ||||
| 			canHaveDefault = true // bytes field | ||||
| 		} | ||||
|  | ||||
| 	case reflect.Map: | ||||
| 		if ft.Elem().Kind() == reflect.Ptr { | ||||
| 			nestedMessage = true // map with message values | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if !canHaveDefault { | ||||
| 		if nestedMessage { | ||||
| 			return nil, true, nil | ||||
| 		} | ||||
| 		return nil, false, nil | ||||
| 	} | ||||
|  | ||||
| 	// We now know that ft is a pointer or slice. | ||||
| 	sf = &scalarField{kind: ft.Elem().Kind()} | ||||
|  | ||||
| 	// scalar fields without defaults | ||||
| 	if !prop.HasDefault { | ||||
| 		return sf, false, nil | ||||
| 	} | ||||
|  | ||||
| 	// a scalar field: either *T or []byte | ||||
| 	switch ft.Elem().Kind() { | ||||
| 	case reflect.Bool: | ||||
| 		x, err := strconv.ParseBool(prop.Default) | ||||
| 		if err != nil { | ||||
| 			return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) | ||||
| 		} | ||||
| 		sf.value = x | ||||
| 	case reflect.Float32: | ||||
| 		x, err := strconv.ParseFloat(prop.Default, 32) | ||||
| 		if err != nil { | ||||
| 			return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) | ||||
| 		} | ||||
| 		sf.value = float32(x) | ||||
| 	case reflect.Float64: | ||||
| 		x, err := strconv.ParseFloat(prop.Default, 64) | ||||
| 		if err != nil { | ||||
| 			return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) | ||||
| 		} | ||||
| 		sf.value = x | ||||
| 	case reflect.Int32: | ||||
| 		x, err := strconv.ParseInt(prop.Default, 10, 32) | ||||
| 		if err != nil { | ||||
| 			return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) | ||||
| 		} | ||||
| 		sf.value = int32(x) | ||||
| 	case reflect.Int64: | ||||
| 		x, err := strconv.ParseInt(prop.Default, 10, 64) | ||||
| 		if err != nil { | ||||
| 			return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) | ||||
| 		} | ||||
| 		sf.value = x | ||||
| 	case reflect.String: | ||||
| 		sf.value = prop.Default | ||||
| 	case reflect.Uint8: | ||||
| 		// []byte (not *uint8) | ||||
| 		sf.value = []byte(prop.Default) | ||||
| 	case reflect.Uint32: | ||||
| 		x, err := strconv.ParseUint(prop.Default, 10, 32) | ||||
| 		if err != nil { | ||||
| 			return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) | ||||
| 		} | ||||
| 		sf.value = uint32(x) | ||||
| 	case reflect.Uint64: | ||||
| 		x, err := strconv.ParseUint(prop.Default, 10, 64) | ||||
| 		if err != nil { | ||||
| 			return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) | ||||
| 		} | ||||
| 		sf.value = x | ||||
| 	default: | ||||
| 		return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) | ||||
| 	} | ||||
|  | ||||
| 	return sf, false, nil | ||||
| } | ||||
|  | ||||
| // Map fields may have key types of non-float scalars, strings and enums. | ||||
| // The easiest way to sort them in some deterministic order is to use fmt. | ||||
| // If this turns out to be inefficient we can always consider other options, | ||||
| // such as doing a Schwartzian transform. | ||||
|  | ||||
| func mapKeys(vs []reflect.Value) sort.Interface { | ||||
| 	s := mapKeySorter{ | ||||
| 		vs: vs, | ||||
| 		// default Less function: textual comparison | ||||
| 		less: func(a, b reflect.Value) bool { | ||||
| 			return fmt.Sprint(a.Interface()) < fmt.Sprint(b.Interface()) | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	// Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps; | ||||
| 	// numeric keys are sorted numerically. | ||||
| 	if len(vs) == 0 { | ||||
| 		return s | ||||
| 	} | ||||
| 	switch vs[0].Kind() { | ||||
| 	case reflect.Int32, reflect.Int64: | ||||
| 		s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } | ||||
| 	case reflect.Uint32, reflect.Uint64: | ||||
| 		s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } | ||||
| 	} | ||||
|  | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| type mapKeySorter struct { | ||||
| 	vs   []reflect.Value | ||||
| 	less func(a, b reflect.Value) bool | ||||
| } | ||||
|  | ||||
| func (s mapKeySorter) Len() int      { return len(s.vs) } | ||||
| func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } | ||||
| func (s mapKeySorter) Less(i, j int) bool { | ||||
| 	return s.less(s.vs[i], s.vs[j]) | ||||
| } | ||||
|  | ||||
| // isProto3Zero reports whether v is a zero proto3 value. | ||||
| func isProto3Zero(v reflect.Value) bool { | ||||
| 	switch v.Kind() { | ||||
| 	case reflect.Bool: | ||||
| 		return !v.Bool() | ||||
| 	case reflect.Int32, reflect.Int64: | ||||
| 		return v.Int() == 0 | ||||
| 	case reflect.Uint32, reflect.Uint64: | ||||
| 		return v.Uint() == 0 | ||||
| 	case reflect.Float32, reflect.Float64: | ||||
| 		return v.Float() == 0 | ||||
| 	case reflect.String: | ||||
| 		return v.String() == "" | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // ProtoPackageIsVersion2 is referenced from generated protocol buffer files | ||||
| // to assert that that code is compatible with this version of the proto package. | ||||
| const ProtoPackageIsVersion2 = true | ||||
|  | ||||
| // ProtoPackageIsVersion1 is referenced from generated protocol buffer files | ||||
| // to assert that that code is compatible with this version of the proto package. | ||||
| const ProtoPackageIsVersion1 = true | ||||
							
								
								
									
										311
									
								
								vendor/github.com/golang/protobuf/proto/message_set.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										311
									
								
								vendor/github.com/golang/protobuf/proto/message_set.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,311 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto | ||||
|  | ||||
| /* | ||||
|  * Support for message sets. | ||||
|  */ | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
| ) | ||||
|  | ||||
| // errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. | ||||
| // A message type ID is required for storing a protocol buffer in a message set. | ||||
| var errNoMessageTypeID = errors.New("proto does not have a message type ID") | ||||
|  | ||||
| // The first two types (_MessageSet_Item and messageSet) | ||||
| // model what the protocol compiler produces for the following protocol message: | ||||
| //   message MessageSet { | ||||
| //     repeated group Item = 1 { | ||||
| //       required int32 type_id = 2; | ||||
| //       required string message = 3; | ||||
| //     }; | ||||
| //   } | ||||
| // That is the MessageSet wire format. We can't use a proto to generate these | ||||
| // because that would introduce a circular dependency between it and this package. | ||||
|  | ||||
| type _MessageSet_Item struct { | ||||
| 	TypeId  *int32 `protobuf:"varint,2,req,name=type_id"` | ||||
| 	Message []byte `protobuf:"bytes,3,req,name=message"` | ||||
| } | ||||
|  | ||||
| type messageSet struct { | ||||
| 	Item             []*_MessageSet_Item `protobuf:"group,1,rep"` | ||||
| 	XXX_unrecognized []byte | ||||
| 	// TODO: caching? | ||||
| } | ||||
|  | ||||
| // Make sure messageSet is a Message. | ||||
| var _ Message = (*messageSet)(nil) | ||||
|  | ||||
| // messageTypeIder is an interface satisfied by a protocol buffer type | ||||
| // that may be stored in a MessageSet. | ||||
| type messageTypeIder interface { | ||||
| 	MessageTypeId() int32 | ||||
| } | ||||
|  | ||||
| func (ms *messageSet) find(pb Message) *_MessageSet_Item { | ||||
| 	mti, ok := pb.(messageTypeIder) | ||||
| 	if !ok { | ||||
| 		return nil | ||||
| 	} | ||||
| 	id := mti.MessageTypeId() | ||||
| 	for _, item := range ms.Item { | ||||
| 		if *item.TypeId == id { | ||||
| 			return item | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (ms *messageSet) Has(pb Message) bool { | ||||
| 	if ms.find(pb) != nil { | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (ms *messageSet) Unmarshal(pb Message) error { | ||||
| 	if item := ms.find(pb); item != nil { | ||||
| 		return Unmarshal(item.Message, pb) | ||||
| 	} | ||||
| 	if _, ok := pb.(messageTypeIder); !ok { | ||||
| 		return errNoMessageTypeID | ||||
| 	} | ||||
| 	return nil // TODO: return error instead? | ||||
| } | ||||
|  | ||||
| func (ms *messageSet) Marshal(pb Message) error { | ||||
| 	msg, err := Marshal(pb) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if item := ms.find(pb); item != nil { | ||||
| 		// reuse existing item | ||||
| 		item.Message = msg | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	mti, ok := pb.(messageTypeIder) | ||||
| 	if !ok { | ||||
| 		return errNoMessageTypeID | ||||
| 	} | ||||
|  | ||||
| 	mtid := mti.MessageTypeId() | ||||
| 	ms.Item = append(ms.Item, &_MessageSet_Item{ | ||||
| 		TypeId:  &mtid, | ||||
| 		Message: msg, | ||||
| 	}) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (ms *messageSet) Reset()         { *ms = messageSet{} } | ||||
| func (ms *messageSet) String() string { return CompactTextString(ms) } | ||||
| func (*messageSet) ProtoMessage()     {} | ||||
|  | ||||
| // Support for the message_set_wire_format message option. | ||||
|  | ||||
| func skipVarint(buf []byte) []byte { | ||||
| 	i := 0 | ||||
| 	for ; buf[i]&0x80 != 0; i++ { | ||||
| 	} | ||||
| 	return buf[i+1:] | ||||
| } | ||||
|  | ||||
| // MarshalMessageSet encodes the extension map represented by m in the message set wire format. | ||||
| // It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. | ||||
| func MarshalMessageSet(exts interface{}) ([]byte, error) { | ||||
| 	var m map[int32]Extension | ||||
| 	switch exts := exts.(type) { | ||||
| 	case *XXX_InternalExtensions: | ||||
| 		if err := encodeExtensions(exts); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		m, _ = exts.extensionsRead() | ||||
| 	case map[int32]Extension: | ||||
| 		if err := encodeExtensionsMap(exts); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		m = exts | ||||
| 	default: | ||||
| 		return nil, errors.New("proto: not an extension map") | ||||
| 	} | ||||
|  | ||||
| 	// Sort extension IDs to provide a deterministic encoding. | ||||
| 	// See also enc_map in encode.go. | ||||
| 	ids := make([]int, 0, len(m)) | ||||
| 	for id := range m { | ||||
| 		ids = append(ids, int(id)) | ||||
| 	} | ||||
| 	sort.Ints(ids) | ||||
|  | ||||
| 	ms := &messageSet{Item: make([]*_MessageSet_Item, 0, len(m))} | ||||
| 	for _, id := range ids { | ||||
| 		e := m[int32(id)] | ||||
| 		// Remove the wire type and field number varint, as well as the length varint. | ||||
| 		msg := skipVarint(skipVarint(e.enc)) | ||||
|  | ||||
| 		ms.Item = append(ms.Item, &_MessageSet_Item{ | ||||
| 			TypeId:  Int32(int32(id)), | ||||
| 			Message: msg, | ||||
| 		}) | ||||
| 	} | ||||
| 	return Marshal(ms) | ||||
| } | ||||
|  | ||||
| // UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. | ||||
| // It is called by generated Unmarshal methods on protocol buffer messages with the message_set_wire_format option. | ||||
| func UnmarshalMessageSet(buf []byte, exts interface{}) error { | ||||
| 	var m map[int32]Extension | ||||
| 	switch exts := exts.(type) { | ||||
| 	case *XXX_InternalExtensions: | ||||
| 		m = exts.extensionsWrite() | ||||
| 	case map[int32]Extension: | ||||
| 		m = exts | ||||
| 	default: | ||||
| 		return errors.New("proto: not an extension map") | ||||
| 	} | ||||
|  | ||||
| 	ms := new(messageSet) | ||||
| 	if err := Unmarshal(buf, ms); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	for _, item := range ms.Item { | ||||
| 		id := *item.TypeId | ||||
| 		msg := item.Message | ||||
|  | ||||
| 		// Restore wire type and field number varint, plus length varint. | ||||
| 		// Be careful to preserve duplicate items. | ||||
| 		b := EncodeVarint(uint64(id)<<3 | WireBytes) | ||||
| 		if ext, ok := m[id]; ok { | ||||
| 			// Existing data; rip off the tag and length varint | ||||
| 			// so we join the new data correctly. | ||||
| 			// We can assume that ext.enc is set because we are unmarshaling. | ||||
| 			o := ext.enc[len(b):]   // skip wire type and field number | ||||
| 			_, n := DecodeVarint(o) // calculate length of length varint | ||||
| 			o = o[n:]               // skip length varint | ||||
| 			msg = append(o, msg...) // join old data and new data | ||||
| 		} | ||||
| 		b = append(b, EncodeVarint(uint64(len(msg)))...) | ||||
| 		b = append(b, msg...) | ||||
|  | ||||
| 		m[id] = Extension{enc: b} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // MarshalMessageSetJSON encodes the extension map represented by m in JSON format. | ||||
| // It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. | ||||
| func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { | ||||
| 	var m map[int32]Extension | ||||
| 	switch exts := exts.(type) { | ||||
| 	case *XXX_InternalExtensions: | ||||
| 		m, _ = exts.extensionsRead() | ||||
| 	case map[int32]Extension: | ||||
| 		m = exts | ||||
| 	default: | ||||
| 		return nil, errors.New("proto: not an extension map") | ||||
| 	} | ||||
| 	var b bytes.Buffer | ||||
| 	b.WriteByte('{') | ||||
|  | ||||
| 	// Process the map in key order for deterministic output. | ||||
| 	ids := make([]int32, 0, len(m)) | ||||
| 	for id := range m { | ||||
| 		ids = append(ids, id) | ||||
| 	} | ||||
| 	sort.Sort(int32Slice(ids)) // int32Slice defined in text.go | ||||
|  | ||||
| 	for i, id := range ids { | ||||
| 		ext := m[id] | ||||
| 		if i > 0 { | ||||
| 			b.WriteByte(',') | ||||
| 		} | ||||
|  | ||||
| 		msd, ok := messageSetMap[id] | ||||
| 		if !ok { | ||||
| 			// Unknown type; we can't render it, so skip it. | ||||
| 			continue | ||||
| 		} | ||||
| 		fmt.Fprintf(&b, `"[%s]":`, msd.name) | ||||
|  | ||||
| 		x := ext.value | ||||
| 		if x == nil { | ||||
| 			x = reflect.New(msd.t.Elem()).Interface() | ||||
| 			if err := Unmarshal(ext.enc, x.(Message)); err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
| 		} | ||||
| 		d, err := json.Marshal(x) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		b.Write(d) | ||||
| 	} | ||||
| 	b.WriteByte('}') | ||||
| 	return b.Bytes(), nil | ||||
| } | ||||
|  | ||||
| // UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. | ||||
| // It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. | ||||
| func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error { | ||||
| 	// Common-case fast path. | ||||
| 	if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// This is fairly tricky, and it's not clear that it is needed. | ||||
| 	return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented") | ||||
| } | ||||
|  | ||||
| // A global registry of types that can be used in a MessageSet. | ||||
|  | ||||
| var messageSetMap = make(map[int32]messageSetDesc) | ||||
|  | ||||
| type messageSetDesc struct { | ||||
| 	t    reflect.Type // pointer to struct | ||||
| 	name string | ||||
| } | ||||
|  | ||||
| // RegisterMessageSetType is called from the generated code. | ||||
| func RegisterMessageSetType(m Message, fieldNum int32, name string) { | ||||
| 	messageSetMap[fieldNum] = messageSetDesc{ | ||||
| 		t:    reflect.TypeOf(m), | ||||
| 		name: name, | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										66
									
								
								vendor/github.com/golang/protobuf/proto/message_set_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								vendor/github.com/golang/protobuf/proto/message_set_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2014 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestUnmarshalMessageSetWithDuplicate(t *testing.T) { | ||||
| 	// Check that a repeated message set entry will be concatenated. | ||||
| 	in := &messageSet{ | ||||
| 		Item: []*_MessageSet_Item{ | ||||
| 			{TypeId: Int32(12345), Message: []byte("hoo")}, | ||||
| 			{TypeId: Int32(12345), Message: []byte("hah")}, | ||||
| 		}, | ||||
| 	} | ||||
| 	b, err := Marshal(in) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("Marshal: %v", err) | ||||
| 	} | ||||
| 	t.Logf("Marshaled bytes: %q", b) | ||||
|  | ||||
| 	var extensions XXX_InternalExtensions | ||||
| 	if err := UnmarshalMessageSet(b, &extensions); err != nil { | ||||
| 		t.Fatalf("UnmarshalMessageSet: %v", err) | ||||
| 	} | ||||
| 	ext, ok := extensions.p.extensionMap[12345] | ||||
| 	if !ok { | ||||
| 		t.Fatalf("Didn't retrieve extension 12345; map is %v", extensions.p.extensionMap) | ||||
| 	} | ||||
| 	// Skip wire type/field number and length varints. | ||||
| 	got := skipVarint(skipVarint(ext.enc)) | ||||
| 	if want := []byte("hoohah"); !bytes.Equal(got, want) { | ||||
| 		t.Errorf("Combined extension is %q, want %q", got, want) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										484
									
								
								vendor/github.com/golang/protobuf/proto/pointer_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										484
									
								
								vendor/github.com/golang/protobuf/proto/pointer_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,484 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2012 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| // +build appengine js | ||||
|  | ||||
| // This file contains an implementation of proto field accesses using package reflect. | ||||
| // It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can | ||||
| // be used on App Engine. | ||||
|  | ||||
| package proto | ||||
|  | ||||
| import ( | ||||
| 	"math" | ||||
| 	"reflect" | ||||
| ) | ||||
|  | ||||
| // A structPointer is a pointer to a struct. | ||||
| type structPointer struct { | ||||
| 	v reflect.Value | ||||
| } | ||||
|  | ||||
| // toStructPointer returns a structPointer equivalent to the given reflect value. | ||||
| // The reflect value must itself be a pointer to a struct. | ||||
| func toStructPointer(v reflect.Value) structPointer { | ||||
| 	return structPointer{v} | ||||
| } | ||||
|  | ||||
| // IsNil reports whether p is nil. | ||||
| func structPointer_IsNil(p structPointer) bool { | ||||
| 	return p.v.IsNil() | ||||
| } | ||||
|  | ||||
| // Interface returns the struct pointer as an interface value. | ||||
| func structPointer_Interface(p structPointer, _ reflect.Type) interface{} { | ||||
| 	return p.v.Interface() | ||||
| } | ||||
|  | ||||
| // A field identifies a field in a struct, accessible from a structPointer. | ||||
| // In this implementation, a field is identified by the sequence of field indices | ||||
| // passed to reflect's FieldByIndex. | ||||
| type field []int | ||||
|  | ||||
| // toField returns a field equivalent to the given reflect field. | ||||
| func toField(f *reflect.StructField) field { | ||||
| 	return f.Index | ||||
| } | ||||
|  | ||||
| // invalidField is an invalid field identifier. | ||||
| var invalidField = field(nil) | ||||
|  | ||||
| // IsValid reports whether the field identifier is valid. | ||||
| func (f field) IsValid() bool { return f != nil } | ||||
|  | ||||
| // field returns the given field in the struct as a reflect value. | ||||
| func structPointer_field(p structPointer, f field) reflect.Value { | ||||
| 	// Special case: an extension map entry with a value of type T | ||||
| 	// passes a *T to the struct-handling code with a zero field, | ||||
| 	// expecting that it will be treated as equivalent to *struct{ X T }, | ||||
| 	// which has the same memory layout. We have to handle that case | ||||
| 	// specially, because reflect will panic if we call FieldByIndex on a | ||||
| 	// non-struct. | ||||
| 	if f == nil { | ||||
| 		return p.v.Elem() | ||||
| 	} | ||||
|  | ||||
| 	return p.v.Elem().FieldByIndex(f) | ||||
| } | ||||
|  | ||||
| // ifield returns the given field in the struct as an interface value. | ||||
| func structPointer_ifield(p structPointer, f field) interface{} { | ||||
| 	return structPointer_field(p, f).Addr().Interface() | ||||
| } | ||||
|  | ||||
| // Bytes returns the address of a []byte field in the struct. | ||||
| func structPointer_Bytes(p structPointer, f field) *[]byte { | ||||
| 	return structPointer_ifield(p, f).(*[]byte) | ||||
| } | ||||
|  | ||||
| // BytesSlice returns the address of a [][]byte field in the struct. | ||||
| func structPointer_BytesSlice(p structPointer, f field) *[][]byte { | ||||
| 	return structPointer_ifield(p, f).(*[][]byte) | ||||
| } | ||||
|  | ||||
| // Bool returns the address of a *bool field in the struct. | ||||
| func structPointer_Bool(p structPointer, f field) **bool { | ||||
| 	return structPointer_ifield(p, f).(**bool) | ||||
| } | ||||
|  | ||||
| // BoolVal returns the address of a bool field in the struct. | ||||
| func structPointer_BoolVal(p structPointer, f field) *bool { | ||||
| 	return structPointer_ifield(p, f).(*bool) | ||||
| } | ||||
|  | ||||
| // BoolSlice returns the address of a []bool field in the struct. | ||||
| func structPointer_BoolSlice(p structPointer, f field) *[]bool { | ||||
| 	return structPointer_ifield(p, f).(*[]bool) | ||||
| } | ||||
|  | ||||
| // String returns the address of a *string field in the struct. | ||||
| func structPointer_String(p structPointer, f field) **string { | ||||
| 	return structPointer_ifield(p, f).(**string) | ||||
| } | ||||
|  | ||||
| // StringVal returns the address of a string field in the struct. | ||||
| func structPointer_StringVal(p structPointer, f field) *string { | ||||
| 	return structPointer_ifield(p, f).(*string) | ||||
| } | ||||
|  | ||||
| // StringSlice returns the address of a []string field in the struct. | ||||
| func structPointer_StringSlice(p structPointer, f field) *[]string { | ||||
| 	return structPointer_ifield(p, f).(*[]string) | ||||
| } | ||||
|  | ||||
| // Extensions returns the address of an extension map field in the struct. | ||||
| func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { | ||||
| 	return structPointer_ifield(p, f).(*XXX_InternalExtensions) | ||||
| } | ||||
|  | ||||
| // ExtMap returns the address of an extension map field in the struct. | ||||
| func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { | ||||
| 	return structPointer_ifield(p, f).(*map[int32]Extension) | ||||
| } | ||||
|  | ||||
| // NewAt returns the reflect.Value for a pointer to a field in the struct. | ||||
| func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { | ||||
| 	return structPointer_field(p, f).Addr() | ||||
| } | ||||
|  | ||||
| // SetStructPointer writes a *struct field in the struct. | ||||
| func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { | ||||
| 	structPointer_field(p, f).Set(q.v) | ||||
| } | ||||
|  | ||||
| // GetStructPointer reads a *struct field in the struct. | ||||
| func structPointer_GetStructPointer(p structPointer, f field) structPointer { | ||||
| 	return structPointer{structPointer_field(p, f)} | ||||
| } | ||||
|  | ||||
| // StructPointerSlice the address of a []*struct field in the struct. | ||||
| func structPointer_StructPointerSlice(p structPointer, f field) structPointerSlice { | ||||
| 	return structPointerSlice{structPointer_field(p, f)} | ||||
| } | ||||
|  | ||||
| // A structPointerSlice represents the address of a slice of pointers to structs | ||||
| // (themselves messages or groups). That is, v.Type() is *[]*struct{...}. | ||||
| type structPointerSlice struct { | ||||
| 	v reflect.Value | ||||
| } | ||||
|  | ||||
| func (p structPointerSlice) Len() int                  { return p.v.Len() } | ||||
| func (p structPointerSlice) Index(i int) structPointer { return structPointer{p.v.Index(i)} } | ||||
| func (p structPointerSlice) Append(q structPointer) { | ||||
| 	p.v.Set(reflect.Append(p.v, q.v)) | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	int32Type   = reflect.TypeOf(int32(0)) | ||||
| 	uint32Type  = reflect.TypeOf(uint32(0)) | ||||
| 	float32Type = reflect.TypeOf(float32(0)) | ||||
| 	int64Type   = reflect.TypeOf(int64(0)) | ||||
| 	uint64Type  = reflect.TypeOf(uint64(0)) | ||||
| 	float64Type = reflect.TypeOf(float64(0)) | ||||
| ) | ||||
|  | ||||
| // A word32 represents a field of type *int32, *uint32, *float32, or *enum. | ||||
| // That is, v.Type() is *int32, *uint32, *float32, or *enum and v is assignable. | ||||
| type word32 struct { | ||||
| 	v reflect.Value | ||||
| } | ||||
|  | ||||
| // IsNil reports whether p is nil. | ||||
| func word32_IsNil(p word32) bool { | ||||
| 	return p.v.IsNil() | ||||
| } | ||||
|  | ||||
| // Set sets p to point at a newly allocated word with bits set to x. | ||||
| func word32_Set(p word32, o *Buffer, x uint32) { | ||||
| 	t := p.v.Type().Elem() | ||||
| 	switch t { | ||||
| 	case int32Type: | ||||
| 		if len(o.int32s) == 0 { | ||||
| 			o.int32s = make([]int32, uint32PoolSize) | ||||
| 		} | ||||
| 		o.int32s[0] = int32(x) | ||||
| 		p.v.Set(reflect.ValueOf(&o.int32s[0])) | ||||
| 		o.int32s = o.int32s[1:] | ||||
| 		return | ||||
| 	case uint32Type: | ||||
| 		if len(o.uint32s) == 0 { | ||||
| 			o.uint32s = make([]uint32, uint32PoolSize) | ||||
| 		} | ||||
| 		o.uint32s[0] = x | ||||
| 		p.v.Set(reflect.ValueOf(&o.uint32s[0])) | ||||
| 		o.uint32s = o.uint32s[1:] | ||||
| 		return | ||||
| 	case float32Type: | ||||
| 		if len(o.float32s) == 0 { | ||||
| 			o.float32s = make([]float32, uint32PoolSize) | ||||
| 		} | ||||
| 		o.float32s[0] = math.Float32frombits(x) | ||||
| 		p.v.Set(reflect.ValueOf(&o.float32s[0])) | ||||
| 		o.float32s = o.float32s[1:] | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// must be enum | ||||
| 	p.v.Set(reflect.New(t)) | ||||
| 	p.v.Elem().SetInt(int64(int32(x))) | ||||
| } | ||||
|  | ||||
| // Get gets the bits pointed at by p, as a uint32. | ||||
| func word32_Get(p word32) uint32 { | ||||
| 	elem := p.v.Elem() | ||||
| 	switch elem.Kind() { | ||||
| 	case reflect.Int32: | ||||
| 		return uint32(elem.Int()) | ||||
| 	case reflect.Uint32: | ||||
| 		return uint32(elem.Uint()) | ||||
| 	case reflect.Float32: | ||||
| 		return math.Float32bits(float32(elem.Float())) | ||||
| 	} | ||||
| 	panic("unreachable") | ||||
| } | ||||
|  | ||||
| // Word32 returns a reference to a *int32, *uint32, *float32, or *enum field in the struct. | ||||
| func structPointer_Word32(p structPointer, f field) word32 { | ||||
| 	return word32{structPointer_field(p, f)} | ||||
| } | ||||
|  | ||||
| // A word32Val represents a field of type int32, uint32, float32, or enum. | ||||
| // That is, v.Type() is int32, uint32, float32, or enum and v is assignable. | ||||
| type word32Val struct { | ||||
| 	v reflect.Value | ||||
| } | ||||
|  | ||||
| // Set sets *p to x. | ||||
| func word32Val_Set(p word32Val, x uint32) { | ||||
| 	switch p.v.Type() { | ||||
| 	case int32Type: | ||||
| 		p.v.SetInt(int64(x)) | ||||
| 		return | ||||
| 	case uint32Type: | ||||
| 		p.v.SetUint(uint64(x)) | ||||
| 		return | ||||
| 	case float32Type: | ||||
| 		p.v.SetFloat(float64(math.Float32frombits(x))) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// must be enum | ||||
| 	p.v.SetInt(int64(int32(x))) | ||||
| } | ||||
|  | ||||
| // Get gets the bits pointed at by p, as a uint32. | ||||
| func word32Val_Get(p word32Val) uint32 { | ||||
| 	elem := p.v | ||||
| 	switch elem.Kind() { | ||||
| 	case reflect.Int32: | ||||
| 		return uint32(elem.Int()) | ||||
| 	case reflect.Uint32: | ||||
| 		return uint32(elem.Uint()) | ||||
| 	case reflect.Float32: | ||||
| 		return math.Float32bits(float32(elem.Float())) | ||||
| 	} | ||||
| 	panic("unreachable") | ||||
| } | ||||
|  | ||||
| // Word32Val returns a reference to a int32, uint32, float32, or enum field in the struct. | ||||
| func structPointer_Word32Val(p structPointer, f field) word32Val { | ||||
| 	return word32Val{structPointer_field(p, f)} | ||||
| } | ||||
|  | ||||
| // A word32Slice is a slice of 32-bit values. | ||||
| // That is, v.Type() is []int32, []uint32, []float32, or []enum. | ||||
| type word32Slice struct { | ||||
| 	v reflect.Value | ||||
| } | ||||
|  | ||||
| func (p word32Slice) Append(x uint32) { | ||||
| 	n, m := p.v.Len(), p.v.Cap() | ||||
| 	if n < m { | ||||
| 		p.v.SetLen(n + 1) | ||||
| 	} else { | ||||
| 		t := p.v.Type().Elem() | ||||
| 		p.v.Set(reflect.Append(p.v, reflect.Zero(t))) | ||||
| 	} | ||||
| 	elem := p.v.Index(n) | ||||
| 	switch elem.Kind() { | ||||
| 	case reflect.Int32: | ||||
| 		elem.SetInt(int64(int32(x))) | ||||
| 	case reflect.Uint32: | ||||
| 		elem.SetUint(uint64(x)) | ||||
| 	case reflect.Float32: | ||||
| 		elem.SetFloat(float64(math.Float32frombits(x))) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (p word32Slice) Len() int { | ||||
| 	return p.v.Len() | ||||
| } | ||||
|  | ||||
| func (p word32Slice) Index(i int) uint32 { | ||||
| 	elem := p.v.Index(i) | ||||
| 	switch elem.Kind() { | ||||
| 	case reflect.Int32: | ||||
| 		return uint32(elem.Int()) | ||||
| 	case reflect.Uint32: | ||||
| 		return uint32(elem.Uint()) | ||||
| 	case reflect.Float32: | ||||
| 		return math.Float32bits(float32(elem.Float())) | ||||
| 	} | ||||
| 	panic("unreachable") | ||||
| } | ||||
|  | ||||
| // Word32Slice returns a reference to a []int32, []uint32, []float32, or []enum field in the struct. | ||||
| func structPointer_Word32Slice(p structPointer, f field) word32Slice { | ||||
| 	return word32Slice{structPointer_field(p, f)} | ||||
| } | ||||
|  | ||||
| // word64 is like word32 but for 64-bit values. | ||||
| type word64 struct { | ||||
| 	v reflect.Value | ||||
| } | ||||
|  | ||||
| func word64_Set(p word64, o *Buffer, x uint64) { | ||||
| 	t := p.v.Type().Elem() | ||||
| 	switch t { | ||||
| 	case int64Type: | ||||
| 		if len(o.int64s) == 0 { | ||||
| 			o.int64s = make([]int64, uint64PoolSize) | ||||
| 		} | ||||
| 		o.int64s[0] = int64(x) | ||||
| 		p.v.Set(reflect.ValueOf(&o.int64s[0])) | ||||
| 		o.int64s = o.int64s[1:] | ||||
| 		return | ||||
| 	case uint64Type: | ||||
| 		if len(o.uint64s) == 0 { | ||||
| 			o.uint64s = make([]uint64, uint64PoolSize) | ||||
| 		} | ||||
| 		o.uint64s[0] = x | ||||
| 		p.v.Set(reflect.ValueOf(&o.uint64s[0])) | ||||
| 		o.uint64s = o.uint64s[1:] | ||||
| 		return | ||||
| 	case float64Type: | ||||
| 		if len(o.float64s) == 0 { | ||||
| 			o.float64s = make([]float64, uint64PoolSize) | ||||
| 		} | ||||
| 		o.float64s[0] = math.Float64frombits(x) | ||||
| 		p.v.Set(reflect.ValueOf(&o.float64s[0])) | ||||
| 		o.float64s = o.float64s[1:] | ||||
| 		return | ||||
| 	} | ||||
| 	panic("unreachable") | ||||
| } | ||||
|  | ||||
| func word64_IsNil(p word64) bool { | ||||
| 	return p.v.IsNil() | ||||
| } | ||||
|  | ||||
| func word64_Get(p word64) uint64 { | ||||
| 	elem := p.v.Elem() | ||||
| 	switch elem.Kind() { | ||||
| 	case reflect.Int64: | ||||
| 		return uint64(elem.Int()) | ||||
| 	case reflect.Uint64: | ||||
| 		return elem.Uint() | ||||
| 	case reflect.Float64: | ||||
| 		return math.Float64bits(elem.Float()) | ||||
| 	} | ||||
| 	panic("unreachable") | ||||
| } | ||||
|  | ||||
| func structPointer_Word64(p structPointer, f field) word64 { | ||||
| 	return word64{structPointer_field(p, f)} | ||||
| } | ||||
|  | ||||
| // word64Val is like word32Val but for 64-bit values. | ||||
| type word64Val struct { | ||||
| 	v reflect.Value | ||||
| } | ||||
|  | ||||
| func word64Val_Set(p word64Val, o *Buffer, x uint64) { | ||||
| 	switch p.v.Type() { | ||||
| 	case int64Type: | ||||
| 		p.v.SetInt(int64(x)) | ||||
| 		return | ||||
| 	case uint64Type: | ||||
| 		p.v.SetUint(x) | ||||
| 		return | ||||
| 	case float64Type: | ||||
| 		p.v.SetFloat(math.Float64frombits(x)) | ||||
| 		return | ||||
| 	} | ||||
| 	panic("unreachable") | ||||
| } | ||||
|  | ||||
| func word64Val_Get(p word64Val) uint64 { | ||||
| 	elem := p.v | ||||
| 	switch elem.Kind() { | ||||
| 	case reflect.Int64: | ||||
| 		return uint64(elem.Int()) | ||||
| 	case reflect.Uint64: | ||||
| 		return elem.Uint() | ||||
| 	case reflect.Float64: | ||||
| 		return math.Float64bits(elem.Float()) | ||||
| 	} | ||||
| 	panic("unreachable") | ||||
| } | ||||
|  | ||||
| func structPointer_Word64Val(p structPointer, f field) word64Val { | ||||
| 	return word64Val{structPointer_field(p, f)} | ||||
| } | ||||
|  | ||||
| type word64Slice struct { | ||||
| 	v reflect.Value | ||||
| } | ||||
|  | ||||
| func (p word64Slice) Append(x uint64) { | ||||
| 	n, m := p.v.Len(), p.v.Cap() | ||||
| 	if n < m { | ||||
| 		p.v.SetLen(n + 1) | ||||
| 	} else { | ||||
| 		t := p.v.Type().Elem() | ||||
| 		p.v.Set(reflect.Append(p.v, reflect.Zero(t))) | ||||
| 	} | ||||
| 	elem := p.v.Index(n) | ||||
| 	switch elem.Kind() { | ||||
| 	case reflect.Int64: | ||||
| 		elem.SetInt(int64(int64(x))) | ||||
| 	case reflect.Uint64: | ||||
| 		elem.SetUint(uint64(x)) | ||||
| 	case reflect.Float64: | ||||
| 		elem.SetFloat(float64(math.Float64frombits(x))) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (p word64Slice) Len() int { | ||||
| 	return p.v.Len() | ||||
| } | ||||
|  | ||||
| func (p word64Slice) Index(i int) uint64 { | ||||
| 	elem := p.v.Index(i) | ||||
| 	switch elem.Kind() { | ||||
| 	case reflect.Int64: | ||||
| 		return uint64(elem.Int()) | ||||
| 	case reflect.Uint64: | ||||
| 		return uint64(elem.Uint()) | ||||
| 	case reflect.Float64: | ||||
| 		return math.Float64bits(float64(elem.Float())) | ||||
| 	} | ||||
| 	panic("unreachable") | ||||
| } | ||||
|  | ||||
| func structPointer_Word64Slice(p structPointer, f field) word64Slice { | ||||
| 	return word64Slice{structPointer_field(p, f)} | ||||
| } | ||||
							
								
								
									
										270
									
								
								vendor/github.com/golang/protobuf/proto/pointer_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								vendor/github.com/golang/protobuf/proto/pointer_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,270 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2012 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| // +build !appengine,!js | ||||
|  | ||||
| // This file contains the implementation of the proto field accesses using package unsafe. | ||||
|  | ||||
| package proto | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"unsafe" | ||||
| ) | ||||
|  | ||||
| // NOTE: These type_Foo functions would more idiomatically be methods, | ||||
| // but Go does not allow methods on pointer types, and we must preserve | ||||
| // some pointer type for the garbage collector. We use these | ||||
| // funcs with clunky names as our poor approximation to methods. | ||||
| // | ||||
| // An alternative would be | ||||
| //	type structPointer struct { p unsafe.Pointer } | ||||
| // but that does not registerize as well. | ||||
|  | ||||
| // A structPointer is a pointer to a struct. | ||||
| type structPointer unsafe.Pointer | ||||
|  | ||||
| // toStructPointer returns a structPointer equivalent to the given reflect value. | ||||
| func toStructPointer(v reflect.Value) structPointer { | ||||
| 	return structPointer(unsafe.Pointer(v.Pointer())) | ||||
| } | ||||
|  | ||||
| // IsNil reports whether p is nil. | ||||
| func structPointer_IsNil(p structPointer) bool { | ||||
| 	return p == nil | ||||
| } | ||||
|  | ||||
| // Interface returns the struct pointer, assumed to have element type t, | ||||
| // as an interface value. | ||||
| func structPointer_Interface(p structPointer, t reflect.Type) interface{} { | ||||
| 	return reflect.NewAt(t, unsafe.Pointer(p)).Interface() | ||||
| } | ||||
|  | ||||
| // A field identifies a field in a struct, accessible from a structPointer. | ||||
| // In this implementation, a field is identified by its byte offset from the start of the struct. | ||||
| type field uintptr | ||||
|  | ||||
| // toField returns a field equivalent to the given reflect field. | ||||
| func toField(f *reflect.StructField) field { | ||||
| 	return field(f.Offset) | ||||
| } | ||||
|  | ||||
| // invalidField is an invalid field identifier. | ||||
| const invalidField = ^field(0) | ||||
|  | ||||
| // IsValid reports whether the field identifier is valid. | ||||
| func (f field) IsValid() bool { | ||||
| 	return f != ^field(0) | ||||
| } | ||||
|  | ||||
| // Bytes returns the address of a []byte field in the struct. | ||||
| func structPointer_Bytes(p structPointer, f field) *[]byte { | ||||
| 	return (*[]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
|  | ||||
| // BytesSlice returns the address of a [][]byte field in the struct. | ||||
| func structPointer_BytesSlice(p structPointer, f field) *[][]byte { | ||||
| 	return (*[][]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
|  | ||||
| // Bool returns the address of a *bool field in the struct. | ||||
| func structPointer_Bool(p structPointer, f field) **bool { | ||||
| 	return (**bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
|  | ||||
| // BoolVal returns the address of a bool field in the struct. | ||||
| func structPointer_BoolVal(p structPointer, f field) *bool { | ||||
| 	return (*bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
|  | ||||
| // BoolSlice returns the address of a []bool field in the struct. | ||||
| func structPointer_BoolSlice(p structPointer, f field) *[]bool { | ||||
| 	return (*[]bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
|  | ||||
| // String returns the address of a *string field in the struct. | ||||
| func structPointer_String(p structPointer, f field) **string { | ||||
| 	return (**string)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
|  | ||||
| // StringVal returns the address of a string field in the struct. | ||||
| func structPointer_StringVal(p structPointer, f field) *string { | ||||
| 	return (*string)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
|  | ||||
| // StringSlice returns the address of a []string field in the struct. | ||||
| func structPointer_StringSlice(p structPointer, f field) *[]string { | ||||
| 	return (*[]string)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
|  | ||||
| // ExtMap returns the address of an extension map field in the struct. | ||||
| func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { | ||||
| 	return (*XXX_InternalExtensions)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
|  | ||||
| func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { | ||||
| 	return (*map[int32]Extension)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
|  | ||||
| // NewAt returns the reflect.Value for a pointer to a field in the struct. | ||||
| func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { | ||||
| 	return reflect.NewAt(typ, unsafe.Pointer(uintptr(p)+uintptr(f))) | ||||
| } | ||||
|  | ||||
| // SetStructPointer writes a *struct field in the struct. | ||||
| func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { | ||||
| 	*(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) = q | ||||
| } | ||||
|  | ||||
| // GetStructPointer reads a *struct field in the struct. | ||||
| func structPointer_GetStructPointer(p structPointer, f field) structPointer { | ||||
| 	return *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
|  | ||||
| // StructPointerSlice the address of a []*struct field in the struct. | ||||
| func structPointer_StructPointerSlice(p structPointer, f field) *structPointerSlice { | ||||
| 	return (*structPointerSlice)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
|  | ||||
| // A structPointerSlice represents a slice of pointers to structs (themselves submessages or groups). | ||||
| type structPointerSlice []structPointer | ||||
|  | ||||
| func (v *structPointerSlice) Len() int                  { return len(*v) } | ||||
| func (v *structPointerSlice) Index(i int) structPointer { return (*v)[i] } | ||||
| func (v *structPointerSlice) Append(p structPointer)    { *v = append(*v, p) } | ||||
|  | ||||
| // A word32 is the address of a "pointer to 32-bit value" field. | ||||
| type word32 **uint32 | ||||
|  | ||||
| // IsNil reports whether *v is nil. | ||||
| func word32_IsNil(p word32) bool { | ||||
| 	return *p == nil | ||||
| } | ||||
|  | ||||
| // Set sets *v to point at a newly allocated word set to x. | ||||
| func word32_Set(p word32, o *Buffer, x uint32) { | ||||
| 	if len(o.uint32s) == 0 { | ||||
| 		o.uint32s = make([]uint32, uint32PoolSize) | ||||
| 	} | ||||
| 	o.uint32s[0] = x | ||||
| 	*p = &o.uint32s[0] | ||||
| 	o.uint32s = o.uint32s[1:] | ||||
| } | ||||
|  | ||||
| // Get gets the value pointed at by *v. | ||||
| func word32_Get(p word32) uint32 { | ||||
| 	return **p | ||||
| } | ||||
|  | ||||
| // Word32 returns the address of a *int32, *uint32, *float32, or *enum field in the struct. | ||||
| func structPointer_Word32(p structPointer, f field) word32 { | ||||
| 	return word32((**uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) | ||||
| } | ||||
|  | ||||
| // A word32Val is the address of a 32-bit value field. | ||||
| type word32Val *uint32 | ||||
|  | ||||
| // Set sets *p to x. | ||||
| func word32Val_Set(p word32Val, x uint32) { | ||||
| 	*p = x | ||||
| } | ||||
|  | ||||
| // Get gets the value pointed at by p. | ||||
| func word32Val_Get(p word32Val) uint32 { | ||||
| 	return *p | ||||
| } | ||||
|  | ||||
| // Word32Val returns the address of a *int32, *uint32, *float32, or *enum field in the struct. | ||||
| func structPointer_Word32Val(p structPointer, f field) word32Val { | ||||
| 	return word32Val((*uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) | ||||
| } | ||||
|  | ||||
| // A word32Slice is a slice of 32-bit values. | ||||
| type word32Slice []uint32 | ||||
|  | ||||
| func (v *word32Slice) Append(x uint32)    { *v = append(*v, x) } | ||||
| func (v *word32Slice) Len() int           { return len(*v) } | ||||
| func (v *word32Slice) Index(i int) uint32 { return (*v)[i] } | ||||
|  | ||||
| // Word32Slice returns the address of a []int32, []uint32, []float32, or []enum field in the struct. | ||||
| func structPointer_Word32Slice(p structPointer, f field) *word32Slice { | ||||
| 	return (*word32Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
|  | ||||
| // word64 is like word32 but for 64-bit values. | ||||
| type word64 **uint64 | ||||
|  | ||||
| func word64_Set(p word64, o *Buffer, x uint64) { | ||||
| 	if len(o.uint64s) == 0 { | ||||
| 		o.uint64s = make([]uint64, uint64PoolSize) | ||||
| 	} | ||||
| 	o.uint64s[0] = x | ||||
| 	*p = &o.uint64s[0] | ||||
| 	o.uint64s = o.uint64s[1:] | ||||
| } | ||||
|  | ||||
| func word64_IsNil(p word64) bool { | ||||
| 	return *p == nil | ||||
| } | ||||
|  | ||||
| func word64_Get(p word64) uint64 { | ||||
| 	return **p | ||||
| } | ||||
|  | ||||
| func structPointer_Word64(p structPointer, f field) word64 { | ||||
| 	return word64((**uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) | ||||
| } | ||||
|  | ||||
| // word64Val is like word32Val but for 64-bit values. | ||||
| type word64Val *uint64 | ||||
|  | ||||
| func word64Val_Set(p word64Val, o *Buffer, x uint64) { | ||||
| 	*p = x | ||||
| } | ||||
|  | ||||
| func word64Val_Get(p word64Val) uint64 { | ||||
| 	return *p | ||||
| } | ||||
|  | ||||
| func structPointer_Word64Val(p structPointer, f field) word64Val { | ||||
| 	return word64Val((*uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) | ||||
| } | ||||
|  | ||||
| // word64Slice is like word32Slice but for 64-bit values. | ||||
| type word64Slice []uint64 | ||||
|  | ||||
| func (v *word64Slice) Append(x uint64)    { *v = append(*v, x) } | ||||
| func (v *word64Slice) Len() int           { return len(*v) } | ||||
| func (v *word64Slice) Index(i int) uint64 { return (*v)[i] } | ||||
|  | ||||
| func structPointer_Word64Slice(p structPointer, f field) *word64Slice { | ||||
| 	return (*word64Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) | ||||
| } | ||||
							
								
								
									
										872
									
								
								vendor/github.com/golang/protobuf/proto/properties.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										872
									
								
								vendor/github.com/golang/protobuf/proto/properties.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,872 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto | ||||
|  | ||||
| /* | ||||
|  * Routines for encoding data into the wire format for protocol buffers. | ||||
|  */ | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"log" | ||||
| 	"os" | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| ) | ||||
|  | ||||
| const debug bool = false | ||||
|  | ||||
| // Constants that identify the encoding of a value on the wire. | ||||
| const ( | ||||
| 	WireVarint     = 0 | ||||
| 	WireFixed64    = 1 | ||||
| 	WireBytes      = 2 | ||||
| 	WireStartGroup = 3 | ||||
| 	WireEndGroup   = 4 | ||||
| 	WireFixed32    = 5 | ||||
| ) | ||||
|  | ||||
| const startSize = 10 // initial slice/string sizes | ||||
|  | ||||
| // Encoders are defined in encode.go | ||||
| // An encoder outputs the full representation of a field, including its | ||||
| // tag and encoder type. | ||||
| type encoder func(p *Buffer, prop *Properties, base structPointer) error | ||||
|  | ||||
| // A valueEncoder encodes a single integer in a particular encoding. | ||||
| type valueEncoder func(o *Buffer, x uint64) error | ||||
|  | ||||
| // Sizers are defined in encode.go | ||||
| // A sizer returns the encoded size of a field, including its tag and encoder | ||||
| // type. | ||||
| type sizer func(prop *Properties, base structPointer) int | ||||
|  | ||||
| // A valueSizer returns the encoded size of a single integer in a particular | ||||
| // encoding. | ||||
| type valueSizer func(x uint64) int | ||||
|  | ||||
| // Decoders are defined in decode.go | ||||
| // A decoder creates a value from its wire representation. | ||||
| // Unrecognized subelements are saved in unrec. | ||||
| type decoder func(p *Buffer, prop *Properties, base structPointer) error | ||||
|  | ||||
| // A valueDecoder decodes a single integer in a particular encoding. | ||||
| type valueDecoder func(o *Buffer) (x uint64, err error) | ||||
|  | ||||
| // A oneofMarshaler does the marshaling for all oneof fields in a message. | ||||
| type oneofMarshaler func(Message, *Buffer) error | ||||
|  | ||||
| // A oneofUnmarshaler does the unmarshaling for a oneof field in a message. | ||||
| type oneofUnmarshaler func(Message, int, int, *Buffer) (bool, error) | ||||
|  | ||||
| // A oneofSizer does the sizing for all oneof fields in a message. | ||||
| type oneofSizer func(Message) int | ||||
|  | ||||
| // tagMap is an optimization over map[int]int for typical protocol buffer | ||||
| // use-cases. Encoded protocol buffers are often in tag order with small tag | ||||
| // numbers. | ||||
| type tagMap struct { | ||||
| 	fastTags []int | ||||
| 	slowTags map[int]int | ||||
| } | ||||
|  | ||||
| // tagMapFastLimit is the upper bound on the tag number that will be stored in | ||||
| // the tagMap slice rather than its map. | ||||
| const tagMapFastLimit = 1024 | ||||
|  | ||||
| func (p *tagMap) get(t int) (int, bool) { | ||||
| 	if t > 0 && t < tagMapFastLimit { | ||||
| 		if t >= len(p.fastTags) { | ||||
| 			return 0, false | ||||
| 		} | ||||
| 		fi := p.fastTags[t] | ||||
| 		return fi, fi >= 0 | ||||
| 	} | ||||
| 	fi, ok := p.slowTags[t] | ||||
| 	return fi, ok | ||||
| } | ||||
|  | ||||
| func (p *tagMap) put(t int, fi int) { | ||||
| 	if t > 0 && t < tagMapFastLimit { | ||||
| 		for len(p.fastTags) < t+1 { | ||||
| 			p.fastTags = append(p.fastTags, -1) | ||||
| 		} | ||||
| 		p.fastTags[t] = fi | ||||
| 		return | ||||
| 	} | ||||
| 	if p.slowTags == nil { | ||||
| 		p.slowTags = make(map[int]int) | ||||
| 	} | ||||
| 	p.slowTags[t] = fi | ||||
| } | ||||
|  | ||||
| // StructProperties represents properties for all the fields of a struct. | ||||
| // decoderTags and decoderOrigNames should only be used by the decoder. | ||||
| type StructProperties struct { | ||||
| 	Prop             []*Properties  // properties for each field | ||||
| 	reqCount         int            // required count | ||||
| 	decoderTags      tagMap         // map from proto tag to struct field number | ||||
| 	decoderOrigNames map[string]int // map from original name to struct field number | ||||
| 	order            []int          // list of struct field numbers in tag order | ||||
| 	unrecField       field          // field id of the XXX_unrecognized []byte field | ||||
| 	extendable       bool           // is this an extendable proto | ||||
|  | ||||
| 	oneofMarshaler   oneofMarshaler | ||||
| 	oneofUnmarshaler oneofUnmarshaler | ||||
| 	oneofSizer       oneofSizer | ||||
| 	stype            reflect.Type | ||||
|  | ||||
| 	// OneofTypes contains information about the oneof fields in this message. | ||||
| 	// It is keyed by the original name of a field. | ||||
| 	OneofTypes map[string]*OneofProperties | ||||
| } | ||||
|  | ||||
| // OneofProperties represents information about a specific field in a oneof. | ||||
| type OneofProperties struct { | ||||
| 	Type  reflect.Type // pointer to generated struct type for this oneof field | ||||
| 	Field int          // struct field number of the containing oneof in the message | ||||
| 	Prop  *Properties | ||||
| } | ||||
|  | ||||
| // Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. | ||||
| // See encode.go, (*Buffer).enc_struct. | ||||
|  | ||||
| func (sp *StructProperties) Len() int { return len(sp.order) } | ||||
| func (sp *StructProperties) Less(i, j int) bool { | ||||
| 	return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag | ||||
| } | ||||
| func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } | ||||
|  | ||||
| // Properties represents the protocol-specific behavior of a single struct field. | ||||
| type Properties struct { | ||||
| 	Name     string // name of the field, for error messages | ||||
| 	OrigName string // original name before protocol compiler (always set) | ||||
| 	JSONName string // name to use for JSON; determined by protoc | ||||
| 	Wire     string | ||||
| 	WireType int | ||||
| 	Tag      int | ||||
| 	Required bool | ||||
| 	Optional bool | ||||
| 	Repeated bool | ||||
| 	Packed   bool   // relevant for repeated primitives only | ||||
| 	Enum     string // set for enum types only | ||||
| 	proto3   bool   // whether this is known to be a proto3 field; set for []byte only | ||||
| 	oneof    bool   // whether this is a oneof field | ||||
|  | ||||
| 	Default    string // default value | ||||
| 	HasDefault bool   // whether an explicit default was provided | ||||
| 	def_uint64 uint64 | ||||
|  | ||||
| 	enc           encoder | ||||
| 	valEnc        valueEncoder // set for bool and numeric types only | ||||
| 	field         field | ||||
| 	tagcode       []byte // encoding of EncodeVarint((Tag<<3)|WireType) | ||||
| 	tagbuf        [8]byte | ||||
| 	stype         reflect.Type      // set for struct types only | ||||
| 	sprop         *StructProperties // set for struct types only | ||||
| 	isMarshaler   bool | ||||
| 	isUnmarshaler bool | ||||
|  | ||||
| 	mtype    reflect.Type // set for map types only | ||||
| 	mkeyprop *Properties  // set for map types only | ||||
| 	mvalprop *Properties  // set for map types only | ||||
|  | ||||
| 	size    sizer | ||||
| 	valSize valueSizer // set for bool and numeric types only | ||||
|  | ||||
| 	dec    decoder | ||||
| 	valDec valueDecoder // set for bool and numeric types only | ||||
|  | ||||
| 	// If this is a packable field, this will be the decoder for the packed version of the field. | ||||
| 	packedDec decoder | ||||
| } | ||||
|  | ||||
| // String formats the properties in the protobuf struct field tag style. | ||||
| func (p *Properties) String() string { | ||||
| 	s := p.Wire | ||||
| 	s = "," | ||||
| 	s += strconv.Itoa(p.Tag) | ||||
| 	if p.Required { | ||||
| 		s += ",req" | ||||
| 	} | ||||
| 	if p.Optional { | ||||
| 		s += ",opt" | ||||
| 	} | ||||
| 	if p.Repeated { | ||||
| 		s += ",rep" | ||||
| 	} | ||||
| 	if p.Packed { | ||||
| 		s += ",packed" | ||||
| 	} | ||||
| 	s += ",name=" + p.OrigName | ||||
| 	if p.JSONName != p.OrigName { | ||||
| 		s += ",json=" + p.JSONName | ||||
| 	} | ||||
| 	if p.proto3 { | ||||
| 		s += ",proto3" | ||||
| 	} | ||||
| 	if p.oneof { | ||||
| 		s += ",oneof" | ||||
| 	} | ||||
| 	if len(p.Enum) > 0 { | ||||
| 		s += ",enum=" + p.Enum | ||||
| 	} | ||||
| 	if p.HasDefault { | ||||
| 		s += ",def=" + p.Default | ||||
| 	} | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| // Parse populates p by parsing a string in the protobuf struct field tag style. | ||||
| func (p *Properties) Parse(s string) { | ||||
| 	// "bytes,49,opt,name=foo,def=hello!" | ||||
| 	fields := strings.Split(s, ",") // breaks def=, but handled below. | ||||
| 	if len(fields) < 2 { | ||||
| 		fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	p.Wire = fields[0] | ||||
| 	switch p.Wire { | ||||
| 	case "varint": | ||||
| 		p.WireType = WireVarint | ||||
| 		p.valEnc = (*Buffer).EncodeVarint | ||||
| 		p.valDec = (*Buffer).DecodeVarint | ||||
| 		p.valSize = sizeVarint | ||||
| 	case "fixed32": | ||||
| 		p.WireType = WireFixed32 | ||||
| 		p.valEnc = (*Buffer).EncodeFixed32 | ||||
| 		p.valDec = (*Buffer).DecodeFixed32 | ||||
| 		p.valSize = sizeFixed32 | ||||
| 	case "fixed64": | ||||
| 		p.WireType = WireFixed64 | ||||
| 		p.valEnc = (*Buffer).EncodeFixed64 | ||||
| 		p.valDec = (*Buffer).DecodeFixed64 | ||||
| 		p.valSize = sizeFixed64 | ||||
| 	case "zigzag32": | ||||
| 		p.WireType = WireVarint | ||||
| 		p.valEnc = (*Buffer).EncodeZigzag32 | ||||
| 		p.valDec = (*Buffer).DecodeZigzag32 | ||||
| 		p.valSize = sizeZigzag32 | ||||
| 	case "zigzag64": | ||||
| 		p.WireType = WireVarint | ||||
| 		p.valEnc = (*Buffer).EncodeZigzag64 | ||||
| 		p.valDec = (*Buffer).DecodeZigzag64 | ||||
| 		p.valSize = sizeZigzag64 | ||||
| 	case "bytes", "group": | ||||
| 		p.WireType = WireBytes | ||||
| 		// no numeric converter for non-numeric types | ||||
| 	default: | ||||
| 		fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	var err error | ||||
| 	p.Tag, err = strconv.Atoi(fields[1]) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	for i := 2; i < len(fields); i++ { | ||||
| 		f := fields[i] | ||||
| 		switch { | ||||
| 		case f == "req": | ||||
| 			p.Required = true | ||||
| 		case f == "opt": | ||||
| 			p.Optional = true | ||||
| 		case f == "rep": | ||||
| 			p.Repeated = true | ||||
| 		case f == "packed": | ||||
| 			p.Packed = true | ||||
| 		case strings.HasPrefix(f, "name="): | ||||
| 			p.OrigName = f[5:] | ||||
| 		case strings.HasPrefix(f, "json="): | ||||
| 			p.JSONName = f[5:] | ||||
| 		case strings.HasPrefix(f, "enum="): | ||||
| 			p.Enum = f[5:] | ||||
| 		case f == "proto3": | ||||
| 			p.proto3 = true | ||||
| 		case f == "oneof": | ||||
| 			p.oneof = true | ||||
| 		case strings.HasPrefix(f, "def="): | ||||
| 			p.HasDefault = true | ||||
| 			p.Default = f[4:] // rest of string | ||||
| 			if i+1 < len(fields) { | ||||
| 				// Commas aren't escaped, and def is always last. | ||||
| 				p.Default += "," + strings.Join(fields[i+1:], ",") | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func logNoSliceEnc(t1, t2 reflect.Type) { | ||||
| 	fmt.Fprintf(os.Stderr, "proto: no slice oenc for %T = []%T\n", t1, t2) | ||||
| } | ||||
|  | ||||
| var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() | ||||
|  | ||||
| // Initialize the fields for encoding and decoding. | ||||
| func (p *Properties) setEncAndDec(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { | ||||
| 	p.enc = nil | ||||
| 	p.dec = nil | ||||
| 	p.size = nil | ||||
|  | ||||
| 	switch t1 := typ; t1.Kind() { | ||||
| 	default: | ||||
| 		fmt.Fprintf(os.Stderr, "proto: no coders for %v\n", t1) | ||||
|  | ||||
| 	// proto3 scalar types | ||||
|  | ||||
| 	case reflect.Bool: | ||||
| 		p.enc = (*Buffer).enc_proto3_bool | ||||
| 		p.dec = (*Buffer).dec_proto3_bool | ||||
| 		p.size = size_proto3_bool | ||||
| 	case reflect.Int32: | ||||
| 		p.enc = (*Buffer).enc_proto3_int32 | ||||
| 		p.dec = (*Buffer).dec_proto3_int32 | ||||
| 		p.size = size_proto3_int32 | ||||
| 	case reflect.Uint32: | ||||
| 		p.enc = (*Buffer).enc_proto3_uint32 | ||||
| 		p.dec = (*Buffer).dec_proto3_int32 // can reuse | ||||
| 		p.size = size_proto3_uint32 | ||||
| 	case reflect.Int64, reflect.Uint64: | ||||
| 		p.enc = (*Buffer).enc_proto3_int64 | ||||
| 		p.dec = (*Buffer).dec_proto3_int64 | ||||
| 		p.size = size_proto3_int64 | ||||
| 	case reflect.Float32: | ||||
| 		p.enc = (*Buffer).enc_proto3_uint32 // can just treat them as bits | ||||
| 		p.dec = (*Buffer).dec_proto3_int32 | ||||
| 		p.size = size_proto3_uint32 | ||||
| 	case reflect.Float64: | ||||
| 		p.enc = (*Buffer).enc_proto3_int64 // can just treat them as bits | ||||
| 		p.dec = (*Buffer).dec_proto3_int64 | ||||
| 		p.size = size_proto3_int64 | ||||
| 	case reflect.String: | ||||
| 		p.enc = (*Buffer).enc_proto3_string | ||||
| 		p.dec = (*Buffer).dec_proto3_string | ||||
| 		p.size = size_proto3_string | ||||
|  | ||||
| 	case reflect.Ptr: | ||||
| 		switch t2 := t1.Elem(); t2.Kind() { | ||||
| 		default: | ||||
| 			fmt.Fprintf(os.Stderr, "proto: no encoder function for %v -> %v\n", t1, t2) | ||||
| 			break | ||||
| 		case reflect.Bool: | ||||
| 			p.enc = (*Buffer).enc_bool | ||||
| 			p.dec = (*Buffer).dec_bool | ||||
| 			p.size = size_bool | ||||
| 		case reflect.Int32: | ||||
| 			p.enc = (*Buffer).enc_int32 | ||||
| 			p.dec = (*Buffer).dec_int32 | ||||
| 			p.size = size_int32 | ||||
| 		case reflect.Uint32: | ||||
| 			p.enc = (*Buffer).enc_uint32 | ||||
| 			p.dec = (*Buffer).dec_int32 // can reuse | ||||
| 			p.size = size_uint32 | ||||
| 		case reflect.Int64, reflect.Uint64: | ||||
| 			p.enc = (*Buffer).enc_int64 | ||||
| 			p.dec = (*Buffer).dec_int64 | ||||
| 			p.size = size_int64 | ||||
| 		case reflect.Float32: | ||||
| 			p.enc = (*Buffer).enc_uint32 // can just treat them as bits | ||||
| 			p.dec = (*Buffer).dec_int32 | ||||
| 			p.size = size_uint32 | ||||
| 		case reflect.Float64: | ||||
| 			p.enc = (*Buffer).enc_int64 // can just treat them as bits | ||||
| 			p.dec = (*Buffer).dec_int64 | ||||
| 			p.size = size_int64 | ||||
| 		case reflect.String: | ||||
| 			p.enc = (*Buffer).enc_string | ||||
| 			p.dec = (*Buffer).dec_string | ||||
| 			p.size = size_string | ||||
| 		case reflect.Struct: | ||||
| 			p.stype = t1.Elem() | ||||
| 			p.isMarshaler = isMarshaler(t1) | ||||
| 			p.isUnmarshaler = isUnmarshaler(t1) | ||||
| 			if p.Wire == "bytes" { | ||||
| 				p.enc = (*Buffer).enc_struct_message | ||||
| 				p.dec = (*Buffer).dec_struct_message | ||||
| 				p.size = size_struct_message | ||||
| 			} else { | ||||
| 				p.enc = (*Buffer).enc_struct_group | ||||
| 				p.dec = (*Buffer).dec_struct_group | ||||
| 				p.size = size_struct_group | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	case reflect.Slice: | ||||
| 		switch t2 := t1.Elem(); t2.Kind() { | ||||
| 		default: | ||||
| 			logNoSliceEnc(t1, t2) | ||||
| 			break | ||||
| 		case reflect.Bool: | ||||
| 			if p.Packed { | ||||
| 				p.enc = (*Buffer).enc_slice_packed_bool | ||||
| 				p.size = size_slice_packed_bool | ||||
| 			} else { | ||||
| 				p.enc = (*Buffer).enc_slice_bool | ||||
| 				p.size = size_slice_bool | ||||
| 			} | ||||
| 			p.dec = (*Buffer).dec_slice_bool | ||||
| 			p.packedDec = (*Buffer).dec_slice_packed_bool | ||||
| 		case reflect.Int32: | ||||
| 			if p.Packed { | ||||
| 				p.enc = (*Buffer).enc_slice_packed_int32 | ||||
| 				p.size = size_slice_packed_int32 | ||||
| 			} else { | ||||
| 				p.enc = (*Buffer).enc_slice_int32 | ||||
| 				p.size = size_slice_int32 | ||||
| 			} | ||||
| 			p.dec = (*Buffer).dec_slice_int32 | ||||
| 			p.packedDec = (*Buffer).dec_slice_packed_int32 | ||||
| 		case reflect.Uint32: | ||||
| 			if p.Packed { | ||||
| 				p.enc = (*Buffer).enc_slice_packed_uint32 | ||||
| 				p.size = size_slice_packed_uint32 | ||||
| 			} else { | ||||
| 				p.enc = (*Buffer).enc_slice_uint32 | ||||
| 				p.size = size_slice_uint32 | ||||
| 			} | ||||
| 			p.dec = (*Buffer).dec_slice_int32 | ||||
| 			p.packedDec = (*Buffer).dec_slice_packed_int32 | ||||
| 		case reflect.Int64, reflect.Uint64: | ||||
| 			if p.Packed { | ||||
| 				p.enc = (*Buffer).enc_slice_packed_int64 | ||||
| 				p.size = size_slice_packed_int64 | ||||
| 			} else { | ||||
| 				p.enc = (*Buffer).enc_slice_int64 | ||||
| 				p.size = size_slice_int64 | ||||
| 			} | ||||
| 			p.dec = (*Buffer).dec_slice_int64 | ||||
| 			p.packedDec = (*Buffer).dec_slice_packed_int64 | ||||
| 		case reflect.Uint8: | ||||
| 			p.dec = (*Buffer).dec_slice_byte | ||||
| 			if p.proto3 { | ||||
| 				p.enc = (*Buffer).enc_proto3_slice_byte | ||||
| 				p.size = size_proto3_slice_byte | ||||
| 			} else { | ||||
| 				p.enc = (*Buffer).enc_slice_byte | ||||
| 				p.size = size_slice_byte | ||||
| 			} | ||||
| 		case reflect.Float32, reflect.Float64: | ||||
| 			switch t2.Bits() { | ||||
| 			case 32: | ||||
| 				// can just treat them as bits | ||||
| 				if p.Packed { | ||||
| 					p.enc = (*Buffer).enc_slice_packed_uint32 | ||||
| 					p.size = size_slice_packed_uint32 | ||||
| 				} else { | ||||
| 					p.enc = (*Buffer).enc_slice_uint32 | ||||
| 					p.size = size_slice_uint32 | ||||
| 				} | ||||
| 				p.dec = (*Buffer).dec_slice_int32 | ||||
| 				p.packedDec = (*Buffer).dec_slice_packed_int32 | ||||
| 			case 64: | ||||
| 				// can just treat them as bits | ||||
| 				if p.Packed { | ||||
| 					p.enc = (*Buffer).enc_slice_packed_int64 | ||||
| 					p.size = size_slice_packed_int64 | ||||
| 				} else { | ||||
| 					p.enc = (*Buffer).enc_slice_int64 | ||||
| 					p.size = size_slice_int64 | ||||
| 				} | ||||
| 				p.dec = (*Buffer).dec_slice_int64 | ||||
| 				p.packedDec = (*Buffer).dec_slice_packed_int64 | ||||
| 			default: | ||||
| 				logNoSliceEnc(t1, t2) | ||||
| 				break | ||||
| 			} | ||||
| 		case reflect.String: | ||||
| 			p.enc = (*Buffer).enc_slice_string | ||||
| 			p.dec = (*Buffer).dec_slice_string | ||||
| 			p.size = size_slice_string | ||||
| 		case reflect.Ptr: | ||||
| 			switch t3 := t2.Elem(); t3.Kind() { | ||||
| 			default: | ||||
| 				fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T -> %T\n", t1, t2, t3) | ||||
| 				break | ||||
| 			case reflect.Struct: | ||||
| 				p.stype = t2.Elem() | ||||
| 				p.isMarshaler = isMarshaler(t2) | ||||
| 				p.isUnmarshaler = isUnmarshaler(t2) | ||||
| 				if p.Wire == "bytes" { | ||||
| 					p.enc = (*Buffer).enc_slice_struct_message | ||||
| 					p.dec = (*Buffer).dec_slice_struct_message | ||||
| 					p.size = size_slice_struct_message | ||||
| 				} else { | ||||
| 					p.enc = (*Buffer).enc_slice_struct_group | ||||
| 					p.dec = (*Buffer).dec_slice_struct_group | ||||
| 					p.size = size_slice_struct_group | ||||
| 				} | ||||
| 			} | ||||
| 		case reflect.Slice: | ||||
| 			switch t2.Elem().Kind() { | ||||
| 			default: | ||||
| 				fmt.Fprintf(os.Stderr, "proto: no slice elem oenc for %T -> %T -> %T\n", t1, t2, t2.Elem()) | ||||
| 				break | ||||
| 			case reflect.Uint8: | ||||
| 				p.enc = (*Buffer).enc_slice_slice_byte | ||||
| 				p.dec = (*Buffer).dec_slice_slice_byte | ||||
| 				p.size = size_slice_slice_byte | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	case reflect.Map: | ||||
| 		p.enc = (*Buffer).enc_new_map | ||||
| 		p.dec = (*Buffer).dec_new_map | ||||
| 		p.size = size_new_map | ||||
|  | ||||
| 		p.mtype = t1 | ||||
| 		p.mkeyprop = &Properties{} | ||||
| 		p.mkeyprop.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) | ||||
| 		p.mvalprop = &Properties{} | ||||
| 		vtype := p.mtype.Elem() | ||||
| 		if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { | ||||
| 			// The value type is not a message (*T) or bytes ([]byte), | ||||
| 			// so we need encoders for the pointer to this type. | ||||
| 			vtype = reflect.PtrTo(vtype) | ||||
| 		} | ||||
| 		p.mvalprop.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) | ||||
| 	} | ||||
|  | ||||
| 	// precalculate tag code | ||||
| 	wire := p.WireType | ||||
| 	if p.Packed { | ||||
| 		wire = WireBytes | ||||
| 	} | ||||
| 	x := uint32(p.Tag)<<3 | uint32(wire) | ||||
| 	i := 0 | ||||
| 	for i = 0; x > 127; i++ { | ||||
| 		p.tagbuf[i] = 0x80 | uint8(x&0x7F) | ||||
| 		x >>= 7 | ||||
| 	} | ||||
| 	p.tagbuf[i] = uint8(x) | ||||
| 	p.tagcode = p.tagbuf[0 : i+1] | ||||
|  | ||||
| 	if p.stype != nil { | ||||
| 		if lockGetProp { | ||||
| 			p.sprop = GetProperties(p.stype) | ||||
| 		} else { | ||||
| 			p.sprop = getPropertiesLocked(p.stype) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	marshalerType   = reflect.TypeOf((*Marshaler)(nil)).Elem() | ||||
| 	unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() | ||||
| ) | ||||
|  | ||||
| // isMarshaler reports whether type t implements Marshaler. | ||||
| func isMarshaler(t reflect.Type) bool { | ||||
| 	// We're checking for (likely) pointer-receiver methods | ||||
| 	// so if t is not a pointer, something is very wrong. | ||||
| 	// The calls above only invoke isMarshaler on pointer types. | ||||
| 	if t.Kind() != reflect.Ptr { | ||||
| 		panic("proto: misuse of isMarshaler") | ||||
| 	} | ||||
| 	return t.Implements(marshalerType) | ||||
| } | ||||
|  | ||||
| // isUnmarshaler reports whether type t implements Unmarshaler. | ||||
| func isUnmarshaler(t reflect.Type) bool { | ||||
| 	// We're checking for (likely) pointer-receiver methods | ||||
| 	// so if t is not a pointer, something is very wrong. | ||||
| 	// The calls above only invoke isUnmarshaler on pointer types. | ||||
| 	if t.Kind() != reflect.Ptr { | ||||
| 		panic("proto: misuse of isUnmarshaler") | ||||
| 	} | ||||
| 	return t.Implements(unmarshalerType) | ||||
| } | ||||
|  | ||||
| // Init populates the properties from a protocol buffer struct tag. | ||||
| func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { | ||||
| 	p.init(typ, name, tag, f, true) | ||||
| } | ||||
|  | ||||
| func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { | ||||
| 	// "bytes,49,opt,def=hello!" | ||||
| 	p.Name = name | ||||
| 	p.OrigName = name | ||||
| 	if f != nil { | ||||
| 		p.field = toField(f) | ||||
| 	} | ||||
| 	if tag == "" { | ||||
| 		return | ||||
| 	} | ||||
| 	p.Parse(tag) | ||||
| 	p.setEncAndDec(typ, f, lockGetProp) | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	propertiesMu  sync.RWMutex | ||||
| 	propertiesMap = make(map[reflect.Type]*StructProperties) | ||||
| ) | ||||
|  | ||||
| // GetProperties returns the list of properties for the type represented by t. | ||||
| // t must represent a generated struct type of a protocol message. | ||||
| func GetProperties(t reflect.Type) *StructProperties { | ||||
| 	if t.Kind() != reflect.Struct { | ||||
| 		panic("proto: type must have kind struct") | ||||
| 	} | ||||
|  | ||||
| 	// Most calls to GetProperties in a long-running program will be | ||||
| 	// retrieving details for types we have seen before. | ||||
| 	propertiesMu.RLock() | ||||
| 	sprop, ok := propertiesMap[t] | ||||
| 	propertiesMu.RUnlock() | ||||
| 	if ok { | ||||
| 		if collectStats { | ||||
| 			stats.Chit++ | ||||
| 		} | ||||
| 		return sprop | ||||
| 	} | ||||
|  | ||||
| 	propertiesMu.Lock() | ||||
| 	sprop = getPropertiesLocked(t) | ||||
| 	propertiesMu.Unlock() | ||||
| 	return sprop | ||||
| } | ||||
|  | ||||
| // getPropertiesLocked requires that propertiesMu is held. | ||||
| func getPropertiesLocked(t reflect.Type) *StructProperties { | ||||
| 	if prop, ok := propertiesMap[t]; ok { | ||||
| 		if collectStats { | ||||
| 			stats.Chit++ | ||||
| 		} | ||||
| 		return prop | ||||
| 	} | ||||
| 	if collectStats { | ||||
| 		stats.Cmiss++ | ||||
| 	} | ||||
|  | ||||
| 	prop := new(StructProperties) | ||||
| 	// in case of recursive protos, fill this in now. | ||||
| 	propertiesMap[t] = prop | ||||
|  | ||||
| 	// build properties | ||||
| 	prop.extendable = reflect.PtrTo(t).Implements(extendableProtoType) || | ||||
| 		reflect.PtrTo(t).Implements(extendableProtoV1Type) | ||||
| 	prop.unrecField = invalidField | ||||
| 	prop.Prop = make([]*Properties, t.NumField()) | ||||
| 	prop.order = make([]int, t.NumField()) | ||||
|  | ||||
| 	for i := 0; i < t.NumField(); i++ { | ||||
| 		f := t.Field(i) | ||||
| 		p := new(Properties) | ||||
| 		name := f.Name | ||||
| 		p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) | ||||
|  | ||||
| 		if f.Name == "XXX_InternalExtensions" { // special case | ||||
| 			p.enc = (*Buffer).enc_exts | ||||
| 			p.dec = nil // not needed | ||||
| 			p.size = size_exts | ||||
| 		} else if f.Name == "XXX_extensions" { // special case | ||||
| 			p.enc = (*Buffer).enc_map | ||||
| 			p.dec = nil // not needed | ||||
| 			p.size = size_map | ||||
| 		} else if f.Name == "XXX_unrecognized" { // special case | ||||
| 			prop.unrecField = toField(&f) | ||||
| 		} | ||||
| 		oneof := f.Tag.Get("protobuf_oneof") // special case | ||||
| 		if oneof != "" { | ||||
| 			// Oneof fields don't use the traditional protobuf tag. | ||||
| 			p.OrigName = oneof | ||||
| 		} | ||||
| 		prop.Prop[i] = p | ||||
| 		prop.order[i] = i | ||||
| 		if debug { | ||||
| 			print(i, " ", f.Name, " ", t.String(), " ") | ||||
| 			if p.Tag > 0 { | ||||
| 				print(p.String()) | ||||
| 			} | ||||
| 			print("\n") | ||||
| 		} | ||||
| 		if p.enc == nil && !strings.HasPrefix(f.Name, "XXX_") && oneof == "" { | ||||
| 			fmt.Fprintln(os.Stderr, "proto: no encoder for", f.Name, f.Type.String(), "[GetProperties]") | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Re-order prop.order. | ||||
| 	sort.Sort(prop) | ||||
|  | ||||
| 	type oneofMessage interface { | ||||
| 		XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) | ||||
| 	} | ||||
| 	if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { | ||||
| 		var oots []interface{} | ||||
| 		prop.oneofMarshaler, prop.oneofUnmarshaler, prop.oneofSizer, oots = om.XXX_OneofFuncs() | ||||
| 		prop.stype = t | ||||
|  | ||||
| 		// Interpret oneof metadata. | ||||
| 		prop.OneofTypes = make(map[string]*OneofProperties) | ||||
| 		for _, oot := range oots { | ||||
| 			oop := &OneofProperties{ | ||||
| 				Type: reflect.ValueOf(oot).Type(), // *T | ||||
| 				Prop: new(Properties), | ||||
| 			} | ||||
| 			sft := oop.Type.Elem().Field(0) | ||||
| 			oop.Prop.Name = sft.Name | ||||
| 			oop.Prop.Parse(sft.Tag.Get("protobuf")) | ||||
| 			// There will be exactly one interface field that | ||||
| 			// this new value is assignable to. | ||||
| 			for i := 0; i < t.NumField(); i++ { | ||||
| 				f := t.Field(i) | ||||
| 				if f.Type.Kind() != reflect.Interface { | ||||
| 					continue | ||||
| 				} | ||||
| 				if !oop.Type.AssignableTo(f.Type) { | ||||
| 					continue | ||||
| 				} | ||||
| 				oop.Field = i | ||||
| 				break | ||||
| 			} | ||||
| 			prop.OneofTypes[oop.Prop.OrigName] = oop | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// build required counts | ||||
| 	// build tags | ||||
| 	reqCount := 0 | ||||
| 	prop.decoderOrigNames = make(map[string]int) | ||||
| 	for i, p := range prop.Prop { | ||||
| 		if strings.HasPrefix(p.Name, "XXX_") { | ||||
| 			// Internal fields should not appear in tags/origNames maps. | ||||
| 			// They are handled specially when encoding and decoding. | ||||
| 			continue | ||||
| 		} | ||||
| 		if p.Required { | ||||
| 			reqCount++ | ||||
| 		} | ||||
| 		prop.decoderTags.put(p.Tag, i) | ||||
| 		prop.decoderOrigNames[p.OrigName] = i | ||||
| 	} | ||||
| 	prop.reqCount = reqCount | ||||
|  | ||||
| 	return prop | ||||
| } | ||||
|  | ||||
| // Return the Properties object for the x[0]'th field of the structure. | ||||
| func propByIndex(t reflect.Type, x []int) *Properties { | ||||
| 	if len(x) != 1 { | ||||
| 		fmt.Fprintf(os.Stderr, "proto: field index dimension %d (not 1) for type %s\n", len(x), t) | ||||
| 		return nil | ||||
| 	} | ||||
| 	prop := GetProperties(t) | ||||
| 	return prop.Prop[x[0]] | ||||
| } | ||||
|  | ||||
| // Get the address and type of a pointer to a struct from an interface. | ||||
| func getbase(pb Message) (t reflect.Type, b structPointer, err error) { | ||||
| 	if pb == nil { | ||||
| 		err = ErrNil | ||||
| 		return | ||||
| 	} | ||||
| 	// get the reflect type of the pointer to the struct. | ||||
| 	t = reflect.TypeOf(pb) | ||||
| 	// get the address of the struct. | ||||
| 	value := reflect.ValueOf(pb) | ||||
| 	b = toStructPointer(value) | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // A global registry of enum types. | ||||
| // The generated code will register the generated maps by calling RegisterEnum. | ||||
|  | ||||
| var enumValueMaps = make(map[string]map[string]int32) | ||||
|  | ||||
| // RegisterEnum is called from the generated code to install the enum descriptor | ||||
| // maps into the global table to aid parsing text format protocol buffers. | ||||
| func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { | ||||
| 	if _, ok := enumValueMaps[typeName]; ok { | ||||
| 		panic("proto: duplicate enum registered: " + typeName) | ||||
| 	} | ||||
| 	enumValueMaps[typeName] = valueMap | ||||
| } | ||||
|  | ||||
| // EnumValueMap returns the mapping from names to integers of the | ||||
| // enum type enumType, or a nil if not found. | ||||
| func EnumValueMap(enumType string) map[string]int32 { | ||||
| 	return enumValueMaps[enumType] | ||||
| } | ||||
|  | ||||
| // A registry of all linked message types. | ||||
| // The string is a fully-qualified proto name ("pkg.Message"). | ||||
| var ( | ||||
| 	protoTypes    = make(map[string]reflect.Type) | ||||
| 	revProtoTypes = make(map[reflect.Type]string) | ||||
| ) | ||||
|  | ||||
| // RegisterType is called from generated code and maps from the fully qualified | ||||
| // proto name to the type (pointer to struct) of the protocol buffer. | ||||
| func RegisterType(x Message, name string) { | ||||
| 	if _, ok := protoTypes[name]; ok { | ||||
| 		// TODO: Some day, make this a panic. | ||||
| 		log.Printf("proto: duplicate proto type registered: %s", name) | ||||
| 		return | ||||
| 	} | ||||
| 	t := reflect.TypeOf(x) | ||||
| 	protoTypes[name] = t | ||||
| 	revProtoTypes[t] = name | ||||
| } | ||||
|  | ||||
| // MessageName returns the fully-qualified proto name for the given message type. | ||||
| func MessageName(x Message) string { | ||||
| 	type xname interface { | ||||
| 		XXX_MessageName() string | ||||
| 	} | ||||
| 	if m, ok := x.(xname); ok { | ||||
| 		return m.XXX_MessageName() | ||||
| 	} | ||||
| 	return revProtoTypes[reflect.TypeOf(x)] | ||||
| } | ||||
|  | ||||
| // MessageType returns the message type (pointer to struct) for a named message. | ||||
| func MessageType(name string) reflect.Type { return protoTypes[name] } | ||||
|  | ||||
| // A registry of all linked proto files. | ||||
| var ( | ||||
| 	protoFiles = make(map[string][]byte) // file name => fileDescriptor | ||||
| ) | ||||
|  | ||||
| // RegisterFile is called from generated code and maps from the | ||||
| // full file name of a .proto file to its compressed FileDescriptorProto. | ||||
| func RegisterFile(filename string, fileDescriptor []byte) { | ||||
| 	protoFiles[filename] = fileDescriptor | ||||
| } | ||||
|  | ||||
| // FileDescriptor returns the compressed FileDescriptorProto for a .proto file. | ||||
| func FileDescriptor(filename string) []byte { return protoFiles[filename] } | ||||
							
								
								
									
										219
									
								
								vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,219 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: proto3_proto/proto3.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| /* | ||||
| Package proto3_proto is a generated protocol buffer package. | ||||
|  | ||||
| It is generated from these files: | ||||
| 	proto3_proto/proto3.proto | ||||
|  | ||||
| It has these top-level messages: | ||||
| 	Message | ||||
| 	Nested | ||||
| 	MessageWithMap | ||||
| */ | ||||
| package proto3_proto | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import fmt "fmt" | ||||
| import math "math" | ||||
| import google_protobuf "github.com/golang/protobuf/ptypes/any" | ||||
| import testdata "github.com/golang/protobuf/proto/testdata" | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = fmt.Errorf | ||||
| var _ = math.Inf | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the proto package it is being compiled against. | ||||
| const _ = proto.ProtoPackageIsVersion1 | ||||
|  | ||||
| type Message_Humour int32 | ||||
|  | ||||
| const ( | ||||
| 	Message_UNKNOWN     Message_Humour = 0 | ||||
| 	Message_PUNS        Message_Humour = 1 | ||||
| 	Message_SLAPSTICK   Message_Humour = 2 | ||||
| 	Message_BILL_BAILEY Message_Humour = 3 | ||||
| ) | ||||
|  | ||||
| var Message_Humour_name = map[int32]string{ | ||||
| 	0: "UNKNOWN", | ||||
| 	1: "PUNS", | ||||
| 	2: "SLAPSTICK", | ||||
| 	3: "BILL_BAILEY", | ||||
| } | ||||
| var Message_Humour_value = map[string]int32{ | ||||
| 	"UNKNOWN":     0, | ||||
| 	"PUNS":        1, | ||||
| 	"SLAPSTICK":   2, | ||||
| 	"BILL_BAILEY": 3, | ||||
| } | ||||
|  | ||||
| func (x Message_Humour) String() string { | ||||
| 	return proto.EnumName(Message_Humour_name, int32(x)) | ||||
| } | ||||
| func (Message_Humour) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} } | ||||
|  | ||||
| type Message struct { | ||||
| 	Name         string                           `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` | ||||
| 	Hilarity     Message_Humour                   `protobuf:"varint,2,opt,name=hilarity,enum=proto3_proto.Message_Humour" json:"hilarity,omitempty"` | ||||
| 	HeightInCm   uint32                           `protobuf:"varint,3,opt,name=height_in_cm,json=heightInCm" json:"height_in_cm,omitempty"` | ||||
| 	Data         []byte                           `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` | ||||
| 	ResultCount  int64                            `protobuf:"varint,7,opt,name=result_count,json=resultCount" json:"result_count,omitempty"` | ||||
| 	TrueScotsman bool                             `protobuf:"varint,8,opt,name=true_scotsman,json=trueScotsman" json:"true_scotsman,omitempty"` | ||||
| 	Score        float32                          `protobuf:"fixed32,9,opt,name=score" json:"score,omitempty"` | ||||
| 	Key          []uint64                         `protobuf:"varint,5,rep,name=key" json:"key,omitempty"` | ||||
| 	ShortKey     []int32                          `protobuf:"varint,19,rep,name=short_key,json=shortKey" json:"short_key,omitempty"` | ||||
| 	Nested       *Nested                          `protobuf:"bytes,6,opt,name=nested" json:"nested,omitempty"` | ||||
| 	RFunny       []Message_Humour                 `protobuf:"varint,16,rep,name=r_funny,json=rFunny,enum=proto3_proto.Message_Humour" json:"r_funny,omitempty"` | ||||
| 	Terrain      map[string]*Nested               `protobuf:"bytes,10,rep,name=terrain" json:"terrain,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` | ||||
| 	Proto2Field  *testdata.SubDefaults            `protobuf:"bytes,11,opt,name=proto2_field,json=proto2Field" json:"proto2_field,omitempty"` | ||||
| 	Proto2Value  map[string]*testdata.SubDefaults `protobuf:"bytes,13,rep,name=proto2_value,json=proto2Value" json:"proto2_value,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` | ||||
| 	Anything     *google_protobuf.Any             `protobuf:"bytes,14,opt,name=anything" json:"anything,omitempty"` | ||||
| 	ManyThings   []*google_protobuf.Any           `protobuf:"bytes,15,rep,name=many_things,json=manyThings" json:"many_things,omitempty"` | ||||
| 	Submessage   *Message                         `protobuf:"bytes,17,opt,name=submessage" json:"submessage,omitempty"` | ||||
| 	Children     []*Message                       `protobuf:"bytes,18,rep,name=children" json:"children,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *Message) Reset()                    { *m = Message{} } | ||||
| func (m *Message) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Message) ProtoMessage()               {} | ||||
| func (*Message) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } | ||||
|  | ||||
| func (m *Message) GetNested() *Nested { | ||||
| 	if m != nil { | ||||
| 		return m.Nested | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Message) GetTerrain() map[string]*Nested { | ||||
| 	if m != nil { | ||||
| 		return m.Terrain | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Message) GetProto2Field() *testdata.SubDefaults { | ||||
| 	if m != nil { | ||||
| 		return m.Proto2Field | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Message) GetProto2Value() map[string]*testdata.SubDefaults { | ||||
| 	if m != nil { | ||||
| 		return m.Proto2Value | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Message) GetAnything() *google_protobuf.Any { | ||||
| 	if m != nil { | ||||
| 		return m.Anything | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Message) GetManyThings() []*google_protobuf.Any { | ||||
| 	if m != nil { | ||||
| 		return m.ManyThings | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Message) GetSubmessage() *Message { | ||||
| 	if m != nil { | ||||
| 		return m.Submessage | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Message) GetChildren() []*Message { | ||||
| 	if m != nil { | ||||
| 		return m.Children | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type Nested struct { | ||||
| 	Bunny string `protobuf:"bytes,1,opt,name=bunny" json:"bunny,omitempty"` | ||||
| 	Cute  bool   `protobuf:"varint,2,opt,name=cute" json:"cute,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *Nested) Reset()                    { *m = Nested{} } | ||||
| func (m *Nested) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Nested) ProtoMessage()               {} | ||||
| func (*Nested) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } | ||||
|  | ||||
| type MessageWithMap struct { | ||||
| 	ByteMapping map[bool][]byte `protobuf:"bytes,1,rep,name=byte_mapping,json=byteMapping" json:"byte_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value,proto3"` | ||||
| } | ||||
|  | ||||
| func (m *MessageWithMap) Reset()                    { *m = MessageWithMap{} } | ||||
| func (m *MessageWithMap) String() string            { return proto.CompactTextString(m) } | ||||
| func (*MessageWithMap) ProtoMessage()               {} | ||||
| func (*MessageWithMap) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } | ||||
|  | ||||
| func (m *MessageWithMap) GetByteMapping() map[bool][]byte { | ||||
| 	if m != nil { | ||||
| 		return m.ByteMapping | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterType((*Message)(nil), "proto3_proto.Message") | ||||
| 	proto.RegisterType((*Nested)(nil), "proto3_proto.Nested") | ||||
| 	proto.RegisterType((*MessageWithMap)(nil), "proto3_proto.MessageWithMap") | ||||
| 	proto.RegisterEnum("proto3_proto.Message_Humour", Message_Humour_name, Message_Humour_value) | ||||
| } | ||||
|  | ||||
| var fileDescriptor0 = []byte{ | ||||
| 	// 669 bytes of a gzipped FileDescriptorProto | ||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x53, 0x6d, 0x6f, 0xd3, 0x3a, | ||||
| 	0x18, 0xbd, 0x7d, 0x4f, 0x9f, 0xa4, 0x5b, 0xae, 0xb7, 0x2b, 0x79, 0xbd, 0x7c, 0x18, 0x45, 0x42, | ||||
| 	0x13, 0x2f, 0x19, 0x14, 0x21, 0x4d, 0x08, 0x81, 0xb6, 0xb1, 0x89, 0x6a, 0x5d, 0xa9, 0xdc, 0x8d, | ||||
| 	0x89, 0x4f, 0x51, 0xd2, 0xba, 0x6d, 0x44, 0xe3, 0x54, 0x89, 0x83, 0x94, 0xbf, 0xc3, 0x1f, 0x05, | ||||
| 	0xbf, 0xa4, 0x5d, 0x36, 0x75, 0xf0, 0x29, 0xf6, 0x79, 0xce, 0xf1, 0xf3, 0xe4, 0xf8, 0x18, 0xf6, | ||||
| 	0x96, 0x71, 0xc4, 0xa3, 0x37, 0xae, 0xfa, 0x1c, 0xea, 0x8d, 0xa3, 0x3e, 0xc8, 0x2a, 0x96, 0xda, | ||||
| 	0x7b, 0xb3, 0x28, 0x9a, 0x2d, 0xa8, 0xa6, 0xf8, 0xe9, 0xf4, 0xd0, 0x63, 0x99, 0x26, 0xb6, 0x77, | ||||
| 	0x38, 0x4d, 0xf8, 0xc4, 0xe3, 0xde, 0xa1, 0x5c, 0x68, 0xb0, 0xf3, 0xab, 0x01, 0x8d, 0x4b, 0x9a, | ||||
| 	0x24, 0xde, 0x8c, 0x22, 0x04, 0x55, 0xe6, 0x85, 0x14, 0x97, 0xf6, 0x4b, 0x07, 0x4d, 0xa2, 0xd6, | ||||
| 	0xe8, 0x08, 0x8c, 0x79, 0xb0, 0xf0, 0xe2, 0x80, 0x67, 0xb8, 0x2c, 0xf0, 0xad, 0xee, 0x23, 0xa7, | ||||
| 	0xd8, 0xd0, 0xc9, 0xc5, 0xce, 0xe7, 0x34, 0x8c, 0xd2, 0x98, 0xac, 0xd9, 0x68, 0x1f, 0xac, 0x39, | ||||
| 	0x0d, 0x66, 0x73, 0xee, 0x06, 0xcc, 0x1d, 0x87, 0xb8, 0x22, 0xd4, 0x2d, 0x02, 0x1a, 0xeb, 0xb1, | ||||
| 	0xd3, 0x50, 0xf6, 0x93, 0xe3, 0xe0, 0xaa, 0xa8, 0x58, 0x44, 0xad, 0xd1, 0x63, 0xb0, 0x62, 0x9a, | ||||
| 	0xa4, 0x0b, 0xee, 0x8e, 0xa3, 0x94, 0x71, 0xdc, 0x10, 0xb5, 0x0a, 0x31, 0x35, 0x76, 0x2a, 0x21, | ||||
| 	0xf4, 0x04, 0x5a, 0x3c, 0x4e, 0xa9, 0x9b, 0x8c, 0x23, 0x9e, 0x84, 0x1e, 0xc3, 0x86, 0xe0, 0x18, | ||||
| 	0xc4, 0x92, 0xe0, 0x28, 0xc7, 0xd0, 0x2e, 0xd4, 0x44, 0x3d, 0xa6, 0xb8, 0x29, 0x8a, 0x65, 0xa2, | ||||
| 	0x37, 0xc8, 0x86, 0xca, 0x77, 0x9a, 0xe1, 0xda, 0x7e, 0xe5, 0xa0, 0x4a, 0xe4, 0x12, 0xfd, 0x0f, | ||||
| 	0xcd, 0x64, 0x1e, 0xc5, 0xdc, 0x95, 0xf8, 0x8e, 0xc0, 0x6b, 0xc4, 0x50, 0xc0, 0x85, 0x28, 0xbe, | ||||
| 	0x80, 0x3a, 0x13, 0x56, 0xd1, 0x09, 0xae, 0x8b, 0x53, 0xcc, 0xee, 0xee, 0xdd, 0x5f, 0x1f, 0xa8, | ||||
| 	0x1a, 0xc9, 0x39, 0xe8, 0x2d, 0x34, 0x62, 0x77, 0x9a, 0x32, 0x96, 0x61, 0x5b, 0x1c, 0xf4, 0x37, | ||||
| 	0xa7, 0xea, 0xf1, 0xb9, 0xe4, 0xa2, 0xf7, 0xd0, 0xe0, 0x34, 0x8e, 0xbd, 0x80, 0x61, 0x10, 0x32, | ||||
| 	0xb3, 0xdb, 0xd9, 0x2c, 0xbb, 0xd2, 0xa4, 0x33, 0xc6, 0xe3, 0x8c, 0xac, 0x24, 0xe2, 0x7e, 0xf4, | ||||
| 	0xfd, 0x77, 0xdd, 0x69, 0x40, 0x17, 0x13, 0x6c, 0xaa, 0x41, 0xff, 0x73, 0x56, 0x77, 0xed, 0x8c, | ||||
| 	0x52, 0xff, 0x13, 0x9d, 0x7a, 0xc2, 0xbd, 0x84, 0x98, 0x9a, 0x7a, 0x2e, 0x99, 0xa8, 0xb7, 0x56, | ||||
| 	0xfe, 0xf0, 0x16, 0x29, 0xc5, 0x2d, 0xd5, 0xfc, 0xe9, 0xe6, 0xe6, 0x43, 0xc5, 0xfc, 0x2a, 0x89, | ||||
| 	0x7a, 0x80, 0xfc, 0x28, 0x85, 0xa0, 0x57, 0x60, 0x88, 0x98, 0xf1, 0x79, 0xc0, 0x66, 0x78, 0x2b, | ||||
| 	0x77, 0x4a, 0xe7, 0xd0, 0x59, 0xe5, 0xd0, 0x39, 0x66, 0x19, 0x59, 0xb3, 0x84, 0x57, 0xa6, 0xb8, | ||||
| 	0xa5, 0xcc, 0x55, 0xbb, 0x04, 0x6f, 0xab, 0xde, 0x9b, 0x45, 0x20, 0x89, 0x57, 0x8a, 0x27, 0x64, | ||||
| 	0x90, 0xa4, 0x7e, 0xa8, 0x87, 0xc2, 0xff, 0xe6, 0xff, 0xba, 0x69, 0x62, 0x52, 0x20, 0xa2, 0xd7, | ||||
| 	0x60, 0x8c, 0x45, 0x2e, 0x27, 0x31, 0x65, 0x18, 0xa9, 0x56, 0x0f, 0x88, 0xd6, 0xb4, 0xf6, 0x10, | ||||
| 	0xac, 0xa2, 0xe1, 0xab, 0xe4, 0xe8, 0xa7, 0xa1, 0x92, 0xf3, 0x0c, 0x6a, 0xda, 0xb8, 0xf2, 0x1f, | ||||
| 	0xb2, 0xa1, 0x29, 0xef, 0xca, 0x47, 0xa5, 0xf6, 0x35, 0xd8, 0xf7, 0x5d, 0xdc, 0x70, 0xea, 0xf3, | ||||
| 	0xbb, 0xa7, 0x3e, 0x70, 0x91, 0xb7, 0xc7, 0x76, 0x3e, 0x42, 0x5d, 0x07, 0x0a, 0x99, 0xd0, 0xb8, | ||||
| 	0x1e, 0x5c, 0x0c, 0xbe, 0xdc, 0x0c, 0xec, 0x7f, 0x90, 0x01, 0xd5, 0xe1, 0xf5, 0x60, 0x64, 0x97, | ||||
| 	0x50, 0x0b, 0x9a, 0xa3, 0xfe, 0xf1, 0x70, 0x74, 0xd5, 0x3b, 0xbd, 0xb0, 0xcb, 0x68, 0x1b, 0xcc, | ||||
| 	0x93, 0x5e, 0xbf, 0xef, 0x9e, 0x1c, 0xf7, 0xfa, 0x67, 0xdf, 0xec, 0x4a, 0xa7, 0x0b, 0x75, 0x3d, | ||||
| 	0xac, 0x7c, 0x33, 0xbe, 0x8a, 0xaf, 0x9e, 0x47, 0x6f, 0xe4, 0x2b, 0x1d, 0xa7, 0x5c, 0x0f, 0x64, | ||||
| 	0x10, 0xb5, 0xee, 0xfc, 0x2c, 0xc1, 0x56, 0xee, 0xd9, 0x4d, 0xc0, 0xe7, 0x97, 0xde, 0x12, 0x09, | ||||
| 	0xc3, 0xfc, 0x8c, 0x53, 0x37, 0xf4, 0x96, 0x4b, 0x99, 0x83, 0x92, 0xf2, 0xf9, 0xe5, 0x46, 0x9f, | ||||
| 	0x73, 0x8d, 0x73, 0x22, 0x04, 0x97, 0x9a, 0x9f, 0xa7, 0xca, 0xbf, 0x45, 0xda, 0x1f, 0xc0, 0xbe, | ||||
| 	0x4f, 0x28, 0x1a, 0x66, 0x68, 0xc3, 0x76, 0x8b, 0x86, 0x59, 0x05, 0x67, 0xfc, 0xba, 0x6e, 0xfd, | ||||
| 	0x3b, 0x00, 0x00, 0xff, 0xff, 0x8b, 0x40, 0x3c, 0xbe, 0x3c, 0x05, 0x00, 0x00, | ||||
| } | ||||
							
								
								
									
										78
									
								
								vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								vendor/github.com/golang/protobuf/proto/proto3_proto/proto3.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2014 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto3"; | ||||
|  | ||||
| import "google/protobuf/any.proto"; | ||||
| import "testdata/test.proto"; | ||||
|  | ||||
| package proto3_proto; | ||||
|  | ||||
| message Message { | ||||
|   enum Humour { | ||||
|     UNKNOWN = 0; | ||||
|     PUNS = 1; | ||||
|     SLAPSTICK = 2; | ||||
|     BILL_BAILEY = 3; | ||||
|   } | ||||
|  | ||||
|   string name = 1; | ||||
|   Humour hilarity = 2; | ||||
|   uint32 height_in_cm = 3; | ||||
|   bytes data = 4; | ||||
|   int64 result_count = 7; | ||||
|   bool true_scotsman = 8; | ||||
|   float score = 9; | ||||
|  | ||||
|   repeated uint64 key = 5; | ||||
|   repeated int32 short_key = 19; | ||||
|   Nested nested = 6; | ||||
|   repeated Humour r_funny = 16; | ||||
|  | ||||
|   map<string, Nested> terrain = 10; | ||||
|   testdata.SubDefaults proto2_field = 11; | ||||
|   map<string, testdata.SubDefaults> proto2_value = 13; | ||||
|  | ||||
|   google.protobuf.Any anything = 14; | ||||
|   repeated google.protobuf.Any many_things = 15; | ||||
|  | ||||
|   Message submessage = 17; | ||||
|   repeated Message children = 18; | ||||
| } | ||||
|  | ||||
| message Nested { | ||||
|   string bunny = 1; | ||||
|   bool cute = 2; | ||||
| } | ||||
|  | ||||
| message MessageWithMap { | ||||
|   map<bool, bytes> byte_mapping = 1; | ||||
| } | ||||
							
								
								
									
										125
									
								
								vendor/github.com/golang/protobuf/proto/proto3_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								vendor/github.com/golang/protobuf/proto/proto3_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2014 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto_test | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	pb "github.com/golang/protobuf/proto/proto3_proto" | ||||
| 	tpb "github.com/golang/protobuf/proto/testdata" | ||||
| ) | ||||
|  | ||||
| func TestProto3ZeroValues(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		desc string | ||||
| 		m    proto.Message | ||||
| 	}{ | ||||
| 		{"zero message", &pb.Message{}}, | ||||
| 		{"empty bytes field", &pb.Message{Data: []byte{}}}, | ||||
| 	} | ||||
| 	for _, test := range tests { | ||||
| 		b, err := proto.Marshal(test.m) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("%s: proto.Marshal: %v", test.desc, err) | ||||
| 			continue | ||||
| 		} | ||||
| 		if len(b) > 0 { | ||||
| 			t.Errorf("%s: Encoding is non-empty: %q", test.desc, b) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestRoundTripProto3(t *testing.T) { | ||||
| 	m := &pb.Message{ | ||||
| 		Name:         "David",          // (2 | 1<<3): 0x0a 0x05 "David" | ||||
| 		Hilarity:     pb.Message_PUNS,  // (0 | 2<<3): 0x10 0x01 | ||||
| 		HeightInCm:   178,              // (0 | 3<<3): 0x18 0xb2 0x01 | ||||
| 		Data:         []byte("roboto"), // (2 | 4<<3): 0x20 0x06 "roboto" | ||||
| 		ResultCount:  47,               // (0 | 7<<3): 0x38 0x2f | ||||
| 		TrueScotsman: true,             // (0 | 8<<3): 0x40 0x01 | ||||
| 		Score:        8.1,              // (5 | 9<<3): 0x4d <8.1> | ||||
|  | ||||
| 		Key: []uint64{1, 0xdeadbeef}, | ||||
| 		Nested: &pb.Nested{ | ||||
| 			Bunny: "Monty", | ||||
| 		}, | ||||
| 	} | ||||
| 	t.Logf(" m: %v", m) | ||||
|  | ||||
| 	b, err := proto.Marshal(m) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("proto.Marshal: %v", err) | ||||
| 	} | ||||
| 	t.Logf(" b: %q", b) | ||||
|  | ||||
| 	m2 := new(pb.Message) | ||||
| 	if err := proto.Unmarshal(b, m2); err != nil { | ||||
| 		t.Fatalf("proto.Unmarshal: %v", err) | ||||
| 	} | ||||
| 	t.Logf("m2: %v", m2) | ||||
|  | ||||
| 	if !proto.Equal(m, m2) { | ||||
| 		t.Errorf("proto.Equal returned false:\n m: %v\nm2: %v", m, m2) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestProto3SetDefaults(t *testing.T) { | ||||
| 	in := &pb.Message{ | ||||
| 		Terrain: map[string]*pb.Nested{ | ||||
| 			"meadow": new(pb.Nested), | ||||
| 		}, | ||||
| 		Proto2Field: new(tpb.SubDefaults), | ||||
| 		Proto2Value: map[string]*tpb.SubDefaults{ | ||||
| 			"badlands": new(tpb.SubDefaults), | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	got := proto.Clone(in).(*pb.Message) | ||||
| 	proto.SetDefaults(got) | ||||
|  | ||||
| 	// There are no defaults in proto3.  Everything should be the zero value, but | ||||
| 	// we need to remember to set defaults for nested proto2 messages. | ||||
| 	want := &pb.Message{ | ||||
| 		Terrain: map[string]*pb.Nested{ | ||||
| 			"meadow": new(pb.Nested), | ||||
| 		}, | ||||
| 		Proto2Field: &tpb.SubDefaults{N: proto.Int64(7)}, | ||||
| 		Proto2Value: map[string]*tpb.SubDefaults{ | ||||
| 			"badlands": &tpb.SubDefaults{N: proto.Int64(7)}, | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	if !proto.Equal(got, want) { | ||||
| 		t.Errorf("with in = %v\nproto.SetDefaults(in) =>\ngot %v\nwant %v", in, got, want) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										63
									
								
								vendor/github.com/golang/protobuf/proto/size2_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/golang/protobuf/proto/size2_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2012 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| // This is a separate file and package from size_test.go because that one uses | ||||
| // generated messages and thus may not be in package proto without having a circular | ||||
| // dependency, whereas this file tests unexported details of size.go. | ||||
|  | ||||
| func TestVarintSize(t *testing.T) { | ||||
| 	// Check the edge cases carefully. | ||||
| 	testCases := []struct { | ||||
| 		n    uint64 | ||||
| 		size int | ||||
| 	}{ | ||||
| 		{0, 1}, | ||||
| 		{1, 1}, | ||||
| 		{127, 1}, | ||||
| 		{128, 2}, | ||||
| 		{16383, 2}, | ||||
| 		{16384, 3}, | ||||
| 		{1<<63 - 1, 9}, | ||||
| 		{1 << 63, 10}, | ||||
| 	} | ||||
| 	for _, tc := range testCases { | ||||
| 		size := sizeVarint(tc.n) | ||||
| 		if size != tc.size { | ||||
| 			t.Errorf("sizeVarint(%d) = %d, want %d", tc.n, size, tc.size) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										164
									
								
								vendor/github.com/golang/protobuf/proto/size_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								vendor/github.com/golang/protobuf/proto/size_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,164 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2012 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto_test | ||||
|  | ||||
| import ( | ||||
| 	"log" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	. "github.com/golang/protobuf/proto" | ||||
| 	proto3pb "github.com/golang/protobuf/proto/proto3_proto" | ||||
| 	pb "github.com/golang/protobuf/proto/testdata" | ||||
| ) | ||||
|  | ||||
| var messageWithExtension1 = &pb.MyMessage{Count: Int32(7)} | ||||
|  | ||||
| // messageWithExtension2 is in equal_test.go. | ||||
| var messageWithExtension3 = &pb.MyMessage{Count: Int32(8)} | ||||
|  | ||||
| func init() { | ||||
| 	if err := SetExtension(messageWithExtension1, pb.E_Ext_More, &pb.Ext{Data: String("Abbott")}); err != nil { | ||||
| 		log.Panicf("SetExtension: %v", err) | ||||
| 	} | ||||
| 	if err := SetExtension(messageWithExtension3, pb.E_Ext_More, &pb.Ext{Data: String("Costello")}); err != nil { | ||||
| 		log.Panicf("SetExtension: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	// Force messageWithExtension3 to have the extension encoded. | ||||
| 	Marshal(messageWithExtension3) | ||||
|  | ||||
| } | ||||
|  | ||||
| var SizeTests = []struct { | ||||
| 	desc string | ||||
| 	pb   Message | ||||
| }{ | ||||
| 	{"empty", &pb.OtherMessage{}}, | ||||
| 	// Basic types. | ||||
| 	{"bool", &pb.Defaults{F_Bool: Bool(true)}}, | ||||
| 	{"int32", &pb.Defaults{F_Int32: Int32(12)}}, | ||||
| 	{"negative int32", &pb.Defaults{F_Int32: Int32(-1)}}, | ||||
| 	{"small int64", &pb.Defaults{F_Int64: Int64(1)}}, | ||||
| 	{"big int64", &pb.Defaults{F_Int64: Int64(1 << 20)}}, | ||||
| 	{"negative int64", &pb.Defaults{F_Int64: Int64(-1)}}, | ||||
| 	{"fixed32", &pb.Defaults{F_Fixed32: Uint32(71)}}, | ||||
| 	{"fixed64", &pb.Defaults{F_Fixed64: Uint64(72)}}, | ||||
| 	{"uint32", &pb.Defaults{F_Uint32: Uint32(123)}}, | ||||
| 	{"uint64", &pb.Defaults{F_Uint64: Uint64(124)}}, | ||||
| 	{"float", &pb.Defaults{F_Float: Float32(12.6)}}, | ||||
| 	{"double", &pb.Defaults{F_Double: Float64(13.9)}}, | ||||
| 	{"string", &pb.Defaults{F_String: String("niles")}}, | ||||
| 	{"bytes", &pb.Defaults{F_Bytes: []byte("wowsa")}}, | ||||
| 	{"bytes, empty", &pb.Defaults{F_Bytes: []byte{}}}, | ||||
| 	{"sint32", &pb.Defaults{F_Sint32: Int32(65)}}, | ||||
| 	{"sint64", &pb.Defaults{F_Sint64: Int64(67)}}, | ||||
| 	{"enum", &pb.Defaults{F_Enum: pb.Defaults_BLUE.Enum()}}, | ||||
| 	// Repeated. | ||||
| 	{"empty repeated bool", &pb.MoreRepeated{Bools: []bool{}}}, | ||||
| 	{"repeated bool", &pb.MoreRepeated{Bools: []bool{false, true, true, false}}}, | ||||
| 	{"packed repeated bool", &pb.MoreRepeated{BoolsPacked: []bool{false, true, true, false, true, true, true}}}, | ||||
| 	{"repeated int32", &pb.MoreRepeated{Ints: []int32{1, 12203, 1729, -1}}}, | ||||
| 	{"repeated int32 packed", &pb.MoreRepeated{IntsPacked: []int32{1, 12203, 1729}}}, | ||||
| 	{"repeated int64 packed", &pb.MoreRepeated{Int64SPacked: []int64{ | ||||
| 		// Need enough large numbers to verify that the header is counting the number of bytes | ||||
| 		// for the field, not the number of elements. | ||||
| 		1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, | ||||
| 		1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, 1 << 62, | ||||
| 	}}}, | ||||
| 	{"repeated string", &pb.MoreRepeated{Strings: []string{"r", "ken", "gri"}}}, | ||||
| 	{"repeated fixed", &pb.MoreRepeated{Fixeds: []uint32{1, 2, 3, 4}}}, | ||||
| 	// Nested. | ||||
| 	{"nested", &pb.OldMessage{Nested: &pb.OldMessage_Nested{Name: String("whatever")}}}, | ||||
| 	{"group", &pb.GroupOld{G: &pb.GroupOld_G{X: Int32(12345)}}}, | ||||
| 	// Other things. | ||||
| 	{"unrecognized", &pb.MoreRepeated{XXX_unrecognized: []byte{13<<3 | 0, 4}}}, | ||||
| 	{"extension (unencoded)", messageWithExtension1}, | ||||
| 	{"extension (encoded)", messageWithExtension3}, | ||||
| 	// proto3 message | ||||
| 	{"proto3 empty", &proto3pb.Message{}}, | ||||
| 	{"proto3 bool", &proto3pb.Message{TrueScotsman: true}}, | ||||
| 	{"proto3 int64", &proto3pb.Message{ResultCount: 1}}, | ||||
| 	{"proto3 uint32", &proto3pb.Message{HeightInCm: 123}}, | ||||
| 	{"proto3 float", &proto3pb.Message{Score: 12.6}}, | ||||
| 	{"proto3 string", &proto3pb.Message{Name: "Snezana"}}, | ||||
| 	{"proto3 bytes", &proto3pb.Message{Data: []byte("wowsa")}}, | ||||
| 	{"proto3 bytes, empty", &proto3pb.Message{Data: []byte{}}}, | ||||
| 	{"proto3 enum", &proto3pb.Message{Hilarity: proto3pb.Message_PUNS}}, | ||||
| 	{"proto3 map field with empty bytes", &proto3pb.MessageWithMap{ByteMapping: map[bool][]byte{false: []byte{}}}}, | ||||
|  | ||||
| 	{"map field", &pb.MessageWithMap{NameMapping: map[int32]string{1: "Rob", 7: "Andrew"}}}, | ||||
| 	{"map field with message", &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{0x7001: &pb.FloatingPoint{F: Float64(2.0)}}}}, | ||||
| 	{"map field with bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: []byte("this time for sure")}}}, | ||||
| 	{"map field with empty bytes", &pb.MessageWithMap{ByteMapping: map[bool][]byte{true: []byte{}}}}, | ||||
|  | ||||
| 	{"map field with big entry", &pb.MessageWithMap{NameMapping: map[int32]string{8: strings.Repeat("x", 125)}}}, | ||||
| 	{"map field with big key and val", &pb.MessageWithMap{StrToStr: map[string]string{strings.Repeat("x", 70): strings.Repeat("y", 70)}}}, | ||||
| 	{"map field with big numeric key", &pb.MessageWithMap{NameMapping: map[int32]string{0xf00d: "om nom nom"}}}, | ||||
|  | ||||
| 	{"oneof not set", &pb.Oneof{}}, | ||||
| 	{"oneof bool", &pb.Oneof{Union: &pb.Oneof_F_Bool{true}}}, | ||||
| 	{"oneof zero int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{0}}}, | ||||
| 	{"oneof big int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{1 << 20}}}, | ||||
| 	{"oneof int64", &pb.Oneof{Union: &pb.Oneof_F_Int64{42}}}, | ||||
| 	{"oneof fixed32", &pb.Oneof{Union: &pb.Oneof_F_Fixed32{43}}}, | ||||
| 	{"oneof fixed64", &pb.Oneof{Union: &pb.Oneof_F_Fixed64{44}}}, | ||||
| 	{"oneof uint32", &pb.Oneof{Union: &pb.Oneof_F_Uint32{45}}}, | ||||
| 	{"oneof uint64", &pb.Oneof{Union: &pb.Oneof_F_Uint64{46}}}, | ||||
| 	{"oneof float", &pb.Oneof{Union: &pb.Oneof_F_Float{47.1}}}, | ||||
| 	{"oneof double", &pb.Oneof{Union: &pb.Oneof_F_Double{48.9}}}, | ||||
| 	{"oneof string", &pb.Oneof{Union: &pb.Oneof_F_String{"Rhythmic Fman"}}}, | ||||
| 	{"oneof bytes", &pb.Oneof{Union: &pb.Oneof_F_Bytes{[]byte("let go")}}}, | ||||
| 	{"oneof sint32", &pb.Oneof{Union: &pb.Oneof_F_Sint32{50}}}, | ||||
| 	{"oneof sint64", &pb.Oneof{Union: &pb.Oneof_F_Sint64{51}}}, | ||||
| 	{"oneof enum", &pb.Oneof{Union: &pb.Oneof_F_Enum{pb.MyMessage_BLUE}}}, | ||||
| 	{"message for oneof", &pb.GoTestField{Label: String("k"), Type: String("v")}}, | ||||
| 	{"oneof message", &pb.Oneof{Union: &pb.Oneof_F_Message{&pb.GoTestField{Label: String("k"), Type: String("v")}}}}, | ||||
| 	{"oneof group", &pb.Oneof{Union: &pb.Oneof_FGroup{&pb.Oneof_F_Group{X: Int32(52)}}}}, | ||||
| 	{"oneof largest tag", &pb.Oneof{Union: &pb.Oneof_F_Largest_Tag{1}}}, | ||||
| 	{"multiple oneofs", &pb.Oneof{Union: &pb.Oneof_F_Int32{1}, Tormato: &pb.Oneof_Value{2}}}, | ||||
| } | ||||
|  | ||||
| func TestSize(t *testing.T) { | ||||
| 	for _, tc := range SizeTests { | ||||
| 		size := Size(tc.pb) | ||||
| 		b, err := Marshal(tc.pb) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("%v: Marshal failed: %v", tc.desc, err) | ||||
| 			continue | ||||
| 		} | ||||
| 		if size != len(b) { | ||||
| 			t.Errorf("%v: Size(%v) = %d, want %d", tc.desc, tc.pb, size, len(b)) | ||||
| 			t.Logf("%v: bytes: %#v", tc.desc, b) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										50
									
								
								vendor/github.com/golang/protobuf/proto/testdata/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								vendor/github.com/golang/protobuf/proto/testdata/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| # Go support for Protocol Buffers - Google's data interchange format | ||||
| # | ||||
| # Copyright 2010 The Go Authors.  All rights reserved. | ||||
| # https://github.com/golang/protobuf | ||||
| # | ||||
| # 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. | ||||
|  | ||||
|  | ||||
| include ../../Make.protobuf | ||||
|  | ||||
| all:	regenerate | ||||
|  | ||||
| regenerate: | ||||
| 	rm -f test.pb.go | ||||
| 	make test.pb.go | ||||
|  | ||||
| # The following rules are just aids to development. Not needed for typical testing. | ||||
|  | ||||
| diff:	regenerate | ||||
| 	git diff test.pb.go | ||||
|  | ||||
| restore: | ||||
| 	cp test.pb.go.golden test.pb.go | ||||
|  | ||||
| preserve: | ||||
| 	cp test.pb.go test.pb.go.golden | ||||
							
								
								
									
										86
									
								
								vendor/github.com/golang/protobuf/proto/testdata/golden_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								vendor/github.com/golang/protobuf/proto/testdata/golden_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2012 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| // Verify that the compiler output for test.proto is unchanged. | ||||
|  | ||||
| package testdata | ||||
|  | ||||
| import ( | ||||
| 	"crypto/sha1" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"path/filepath" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| // sum returns in string form (for easy comparison) the SHA-1 hash of the named file. | ||||
| func sum(t *testing.T, name string) string { | ||||
| 	data, err := ioutil.ReadFile(name) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	t.Logf("sum(%q): length is %d", name, len(data)) | ||||
| 	hash := sha1.New() | ||||
| 	_, err = hash.Write(data) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	return fmt.Sprintf("% x", hash.Sum(nil)) | ||||
| } | ||||
|  | ||||
| func run(t *testing.T, name string, args ...string) { | ||||
| 	cmd := exec.Command(name, args...) | ||||
| 	cmd.Stdin = os.Stdin | ||||
| 	cmd.Stdout = os.Stdout | ||||
| 	cmd.Stderr = os.Stderr | ||||
| 	err := cmd.Run() | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestGolden(t *testing.T) { | ||||
| 	// Compute the original checksum. | ||||
| 	goldenSum := sum(t, "test.pb.go") | ||||
| 	// Run the proto compiler. | ||||
| 	run(t, "protoc", "--go_out="+os.TempDir(), "test.proto") | ||||
| 	newFile := filepath.Join(os.TempDir(), "test.pb.go") | ||||
| 	defer os.Remove(newFile) | ||||
| 	// Compute the new checksum. | ||||
| 	newSum := sum(t, newFile) | ||||
| 	// Verify | ||||
| 	if newSum != goldenSum { | ||||
| 		run(t, "diff", "-u", "test.pb.go", newFile) | ||||
| 		t.Fatal("Code generated by protoc-gen-go has changed; update test.pb.go") | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										4061
									
								
								vendor/github.com/golang/protobuf/proto/testdata/test.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4061
									
								
								vendor/github.com/golang/protobuf/proto/testdata/test.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										548
									
								
								vendor/github.com/golang/protobuf/proto/testdata/test.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										548
									
								
								vendor/github.com/golang/protobuf/proto/testdata/test.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,548 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| // A feature-rich test file for the protocol compiler and libraries. | ||||
|  | ||||
| syntax = "proto2"; | ||||
|  | ||||
| package testdata; | ||||
|  | ||||
| enum FOO { FOO1 = 1; }; | ||||
|  | ||||
| message GoEnum { | ||||
|   required FOO foo = 1; | ||||
| } | ||||
|  | ||||
| message GoTestField { | ||||
|   required string Label = 1; | ||||
|   required string Type = 2; | ||||
| } | ||||
|  | ||||
| message GoTest { | ||||
|   // An enum, for completeness. | ||||
|   enum KIND { | ||||
|     VOID = 0; | ||||
|  | ||||
|     // Basic types | ||||
|     BOOL = 1; | ||||
|     BYTES = 2; | ||||
|     FINGERPRINT = 3; | ||||
|     FLOAT = 4; | ||||
|     INT = 5; | ||||
|     STRING = 6; | ||||
|     TIME = 7; | ||||
|  | ||||
|     // Groupings | ||||
|     TUPLE = 8; | ||||
|     ARRAY = 9; | ||||
|     MAP = 10; | ||||
|  | ||||
|     // Table types | ||||
|     TABLE = 11; | ||||
|  | ||||
|     // Functions | ||||
|     FUNCTION = 12;  // last tag | ||||
|   }; | ||||
|  | ||||
|   // Some typical parameters | ||||
|   required KIND Kind = 1; | ||||
|   optional string Table = 2; | ||||
|   optional int32 Param = 3; | ||||
|  | ||||
|   // Required, repeated and optional foreign fields. | ||||
|   required GoTestField RequiredField = 4; | ||||
|   repeated GoTestField RepeatedField = 5; | ||||
|   optional GoTestField OptionalField = 6; | ||||
|  | ||||
|   // Required fields of all basic types | ||||
|   required bool F_Bool_required = 10; | ||||
|   required int32 F_Int32_required = 11; | ||||
|   required int64 F_Int64_required = 12; | ||||
|   required fixed32 F_Fixed32_required = 13; | ||||
|   required fixed64 F_Fixed64_required = 14; | ||||
|   required uint32 F_Uint32_required = 15; | ||||
|   required uint64 F_Uint64_required = 16; | ||||
|   required float F_Float_required = 17; | ||||
|   required double F_Double_required = 18; | ||||
|   required string F_String_required = 19; | ||||
|   required bytes F_Bytes_required = 101; | ||||
|   required sint32 F_Sint32_required = 102; | ||||
|   required sint64 F_Sint64_required = 103; | ||||
|  | ||||
|   // Repeated fields of all basic types | ||||
|   repeated bool F_Bool_repeated = 20; | ||||
|   repeated int32 F_Int32_repeated = 21; | ||||
|   repeated int64 F_Int64_repeated = 22; | ||||
|   repeated fixed32 F_Fixed32_repeated = 23; | ||||
|   repeated fixed64 F_Fixed64_repeated = 24; | ||||
|   repeated uint32 F_Uint32_repeated = 25; | ||||
|   repeated uint64 F_Uint64_repeated = 26; | ||||
|   repeated float F_Float_repeated = 27; | ||||
|   repeated double F_Double_repeated = 28; | ||||
|   repeated string F_String_repeated = 29; | ||||
|   repeated bytes F_Bytes_repeated = 201; | ||||
|   repeated sint32 F_Sint32_repeated = 202; | ||||
|   repeated sint64 F_Sint64_repeated = 203; | ||||
|  | ||||
|   // Optional fields of all basic types | ||||
|   optional bool F_Bool_optional = 30; | ||||
|   optional int32 F_Int32_optional = 31; | ||||
|   optional int64 F_Int64_optional = 32; | ||||
|   optional fixed32 F_Fixed32_optional = 33; | ||||
|   optional fixed64 F_Fixed64_optional = 34; | ||||
|   optional uint32 F_Uint32_optional = 35; | ||||
|   optional uint64 F_Uint64_optional = 36; | ||||
|   optional float F_Float_optional = 37; | ||||
|   optional double F_Double_optional = 38; | ||||
|   optional string F_String_optional = 39; | ||||
|   optional bytes F_Bytes_optional = 301; | ||||
|   optional sint32 F_Sint32_optional = 302; | ||||
|   optional sint64 F_Sint64_optional = 303; | ||||
|  | ||||
|   // Default-valued fields of all basic types | ||||
|   optional bool F_Bool_defaulted = 40 [default=true]; | ||||
|   optional int32 F_Int32_defaulted = 41 [default=32]; | ||||
|   optional int64 F_Int64_defaulted = 42 [default=64]; | ||||
|   optional fixed32 F_Fixed32_defaulted = 43 [default=320]; | ||||
|   optional fixed64 F_Fixed64_defaulted = 44 [default=640]; | ||||
|   optional uint32 F_Uint32_defaulted = 45 [default=3200]; | ||||
|   optional uint64 F_Uint64_defaulted = 46 [default=6400]; | ||||
|   optional float F_Float_defaulted = 47 [default=314159.]; | ||||
|   optional double F_Double_defaulted = 48 [default=271828.]; | ||||
|   optional string F_String_defaulted = 49 [default="hello, \"world!\"\n"]; | ||||
|   optional bytes F_Bytes_defaulted = 401 [default="Bignose"]; | ||||
|   optional sint32 F_Sint32_defaulted = 402 [default = -32]; | ||||
|   optional sint64 F_Sint64_defaulted = 403 [default = -64]; | ||||
|  | ||||
|   // Packed repeated fields (no string or bytes). | ||||
|   repeated bool F_Bool_repeated_packed = 50 [packed=true]; | ||||
|   repeated int32 F_Int32_repeated_packed = 51 [packed=true]; | ||||
|   repeated int64 F_Int64_repeated_packed = 52 [packed=true]; | ||||
|   repeated fixed32 F_Fixed32_repeated_packed = 53 [packed=true]; | ||||
|   repeated fixed64 F_Fixed64_repeated_packed = 54 [packed=true]; | ||||
|   repeated uint32 F_Uint32_repeated_packed = 55 [packed=true]; | ||||
|   repeated uint64 F_Uint64_repeated_packed = 56 [packed=true]; | ||||
|   repeated float F_Float_repeated_packed = 57 [packed=true]; | ||||
|   repeated double F_Double_repeated_packed = 58 [packed=true]; | ||||
|   repeated sint32 F_Sint32_repeated_packed = 502 [packed=true]; | ||||
|   repeated sint64 F_Sint64_repeated_packed = 503 [packed=true]; | ||||
|  | ||||
|   // Required, repeated, and optional groups. | ||||
|   required group RequiredGroup = 70 { | ||||
|     required string RequiredField = 71; | ||||
|   }; | ||||
|  | ||||
|   repeated group RepeatedGroup = 80 { | ||||
|     required string RequiredField = 81; | ||||
|   }; | ||||
|  | ||||
|   optional group OptionalGroup = 90 { | ||||
|     required string RequiredField = 91; | ||||
|   }; | ||||
| } | ||||
|  | ||||
| // For testing a group containing a required field. | ||||
| message GoTestRequiredGroupField { | ||||
|   required group Group = 1 { | ||||
|     required int32 Field = 2; | ||||
|   }; | ||||
| } | ||||
|  | ||||
| // For testing skipping of unrecognized fields. | ||||
| // Numbers are all big, larger than tag numbers in GoTestField, | ||||
| // the message used in the corresponding test. | ||||
| message GoSkipTest { | ||||
|   required int32 skip_int32 = 11; | ||||
|   required fixed32 skip_fixed32 = 12; | ||||
|   required fixed64 skip_fixed64 = 13; | ||||
|   required string skip_string = 14; | ||||
|   required group SkipGroup = 15 { | ||||
|     required int32 group_int32 = 16; | ||||
|     required string group_string = 17; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // For testing packed/non-packed decoder switching. | ||||
| // A serialized instance of one should be deserializable as the other. | ||||
| message NonPackedTest { | ||||
|   repeated int32 a = 1; | ||||
| } | ||||
|  | ||||
| message PackedTest { | ||||
|   repeated int32 b = 1 [packed=true]; | ||||
| } | ||||
|  | ||||
| message MaxTag { | ||||
|   // Maximum possible tag number. | ||||
|   optional string last_field = 536870911; | ||||
| } | ||||
|  | ||||
| message OldMessage { | ||||
|   message Nested { | ||||
|     optional string name = 1; | ||||
|   } | ||||
|   optional Nested nested = 1; | ||||
|  | ||||
|   optional int32 num = 2; | ||||
| } | ||||
|  | ||||
| // NewMessage is wire compatible with OldMessage; | ||||
| // imagine it as a future version. | ||||
| message NewMessage { | ||||
|   message Nested { | ||||
|     optional string name = 1; | ||||
|     optional string food_group = 2; | ||||
|   } | ||||
|   optional Nested nested = 1; | ||||
|  | ||||
|   // This is an int32 in OldMessage. | ||||
|   optional int64 num = 2; | ||||
| } | ||||
|  | ||||
| // Smaller tests for ASCII formatting. | ||||
|  | ||||
| message InnerMessage { | ||||
|   required string host = 1; | ||||
|   optional int32 port = 2 [default=4000]; | ||||
|   optional bool connected = 3; | ||||
| } | ||||
|  | ||||
| message OtherMessage { | ||||
|   optional int64 key = 1; | ||||
|   optional bytes value = 2; | ||||
|   optional float weight = 3; | ||||
|   optional InnerMessage inner = 4; | ||||
|  | ||||
|   extensions 100 to max; | ||||
| } | ||||
|  | ||||
| message RequiredInnerMessage { | ||||
|   required InnerMessage leo_finally_won_an_oscar = 1; | ||||
| } | ||||
|  | ||||
| message MyMessage { | ||||
|   required int32 count = 1; | ||||
|   optional string name = 2; | ||||
|   optional string quote = 3; | ||||
|   repeated string pet = 4; | ||||
|   optional InnerMessage inner = 5; | ||||
|   repeated OtherMessage others = 6; | ||||
|   optional RequiredInnerMessage we_must_go_deeper = 13; | ||||
|   repeated InnerMessage rep_inner = 12; | ||||
|  | ||||
|   enum Color { | ||||
|     RED = 0; | ||||
|     GREEN = 1; | ||||
|     BLUE = 2; | ||||
|   }; | ||||
|   optional Color bikeshed = 7; | ||||
|  | ||||
|   optional group SomeGroup = 8 { | ||||
|     optional int32 group_field = 9; | ||||
|   } | ||||
|  | ||||
|   // This field becomes [][]byte in the generated code. | ||||
|   repeated bytes rep_bytes = 10; | ||||
|  | ||||
|   optional double bigfloat = 11; | ||||
|  | ||||
|   extensions 100 to max; | ||||
| } | ||||
|  | ||||
| message Ext { | ||||
|   extend MyMessage { | ||||
|     optional Ext more = 103; | ||||
|     optional string text = 104; | ||||
|     optional int32 number = 105; | ||||
|   } | ||||
|  | ||||
|   optional string data = 1; | ||||
| } | ||||
|  | ||||
| extend MyMessage { | ||||
|   repeated string greeting = 106; | ||||
| } | ||||
|  | ||||
| message ComplexExtension { | ||||
|   optional int32 first = 1; | ||||
|   optional int32 second = 2; | ||||
|   repeated int32 third = 3; | ||||
| } | ||||
|  | ||||
| extend OtherMessage { | ||||
|   optional ComplexExtension complex = 200; | ||||
|   repeated ComplexExtension r_complex = 201; | ||||
| } | ||||
|  | ||||
| message DefaultsMessage { | ||||
|   enum DefaultsEnum { | ||||
|     ZERO = 0; | ||||
|     ONE = 1; | ||||
|     TWO = 2; | ||||
|   }; | ||||
|   extensions 100 to max; | ||||
| } | ||||
|  | ||||
| extend DefaultsMessage { | ||||
|   optional double no_default_double = 101; | ||||
|   optional float no_default_float = 102; | ||||
|   optional int32 no_default_int32 = 103; | ||||
|   optional int64 no_default_int64 = 104; | ||||
|   optional uint32 no_default_uint32 = 105; | ||||
|   optional uint64 no_default_uint64 = 106; | ||||
|   optional sint32 no_default_sint32 = 107; | ||||
|   optional sint64 no_default_sint64 = 108; | ||||
|   optional fixed32 no_default_fixed32 = 109; | ||||
|   optional fixed64 no_default_fixed64 = 110; | ||||
|   optional sfixed32 no_default_sfixed32 = 111; | ||||
|   optional sfixed64 no_default_sfixed64 = 112; | ||||
|   optional bool no_default_bool = 113; | ||||
|   optional string no_default_string = 114; | ||||
|   optional bytes no_default_bytes = 115; | ||||
|   optional DefaultsMessage.DefaultsEnum no_default_enum = 116; | ||||
|  | ||||
|   optional double default_double = 201 [default = 3.1415]; | ||||
|   optional float default_float = 202 [default = 3.14]; | ||||
|   optional int32 default_int32 = 203 [default = 42]; | ||||
|   optional int64 default_int64 = 204 [default = 43]; | ||||
|   optional uint32 default_uint32 = 205 [default = 44]; | ||||
|   optional uint64 default_uint64 = 206 [default = 45]; | ||||
|   optional sint32 default_sint32 = 207 [default = 46]; | ||||
|   optional sint64 default_sint64 = 208 [default = 47]; | ||||
|   optional fixed32 default_fixed32 = 209 [default = 48]; | ||||
|   optional fixed64 default_fixed64 = 210 [default = 49]; | ||||
|   optional sfixed32 default_sfixed32 = 211 [default = 50]; | ||||
|   optional sfixed64 default_sfixed64 = 212 [default = 51]; | ||||
|   optional bool default_bool = 213 [default = true]; | ||||
|   optional string default_string = 214 [default = "Hello, string"]; | ||||
|   optional bytes default_bytes = 215 [default = "Hello, bytes"]; | ||||
|   optional DefaultsMessage.DefaultsEnum default_enum = 216 [default = ONE]; | ||||
| } | ||||
|  | ||||
| message MyMessageSet { | ||||
|   option message_set_wire_format = true; | ||||
|   extensions 100 to max; | ||||
| } | ||||
|  | ||||
| message Empty { | ||||
| } | ||||
|  | ||||
| extend MyMessageSet { | ||||
|     optional Empty x201 = 201; | ||||
|     optional Empty x202 = 202; | ||||
|     optional Empty x203 = 203; | ||||
|     optional Empty x204 = 204; | ||||
|     optional Empty x205 = 205; | ||||
|     optional Empty x206 = 206; | ||||
|     optional Empty x207 = 207; | ||||
|     optional Empty x208 = 208; | ||||
|     optional Empty x209 = 209; | ||||
|     optional Empty x210 = 210; | ||||
|     optional Empty x211 = 211; | ||||
|     optional Empty x212 = 212; | ||||
|     optional Empty x213 = 213; | ||||
|     optional Empty x214 = 214; | ||||
|     optional Empty x215 = 215; | ||||
|     optional Empty x216 = 216; | ||||
|     optional Empty x217 = 217; | ||||
|     optional Empty x218 = 218; | ||||
|     optional Empty x219 = 219; | ||||
|     optional Empty x220 = 220; | ||||
|     optional Empty x221 = 221; | ||||
|     optional Empty x222 = 222; | ||||
|     optional Empty x223 = 223; | ||||
|     optional Empty x224 = 224; | ||||
|     optional Empty x225 = 225; | ||||
|     optional Empty x226 = 226; | ||||
|     optional Empty x227 = 227; | ||||
|     optional Empty x228 = 228; | ||||
|     optional Empty x229 = 229; | ||||
|     optional Empty x230 = 230; | ||||
|     optional Empty x231 = 231; | ||||
|     optional Empty x232 = 232; | ||||
|     optional Empty x233 = 233; | ||||
|     optional Empty x234 = 234; | ||||
|     optional Empty x235 = 235; | ||||
|     optional Empty x236 = 236; | ||||
|     optional Empty x237 = 237; | ||||
|     optional Empty x238 = 238; | ||||
|     optional Empty x239 = 239; | ||||
|     optional Empty x240 = 240; | ||||
|     optional Empty x241 = 241; | ||||
|     optional Empty x242 = 242; | ||||
|     optional Empty x243 = 243; | ||||
|     optional Empty x244 = 244; | ||||
|     optional Empty x245 = 245; | ||||
|     optional Empty x246 = 246; | ||||
|     optional Empty x247 = 247; | ||||
|     optional Empty x248 = 248; | ||||
|     optional Empty x249 = 249; | ||||
|     optional Empty x250 = 250; | ||||
| } | ||||
|  | ||||
| message MessageList { | ||||
|   repeated group Message = 1 { | ||||
|     required string name = 2; | ||||
|     required int32 count = 3; | ||||
|   } | ||||
| } | ||||
|  | ||||
| message Strings { | ||||
|   optional string string_field = 1; | ||||
|   optional bytes bytes_field = 2; | ||||
| } | ||||
|  | ||||
| message Defaults { | ||||
|   enum Color { | ||||
|     RED = 0; | ||||
|     GREEN = 1; | ||||
|     BLUE = 2; | ||||
|   } | ||||
|  | ||||
|   // Default-valued fields of all basic types. | ||||
|   // Same as GoTest, but copied here to make testing easier. | ||||
|   optional bool F_Bool = 1 [default=true]; | ||||
|   optional int32 F_Int32 = 2 [default=32]; | ||||
|   optional int64 F_Int64 = 3 [default=64]; | ||||
|   optional fixed32 F_Fixed32 = 4 [default=320]; | ||||
|   optional fixed64 F_Fixed64 = 5 [default=640]; | ||||
|   optional uint32 F_Uint32 = 6 [default=3200]; | ||||
|   optional uint64 F_Uint64 = 7 [default=6400]; | ||||
|   optional float F_Float = 8 [default=314159.]; | ||||
|   optional double F_Double = 9 [default=271828.]; | ||||
|   optional string F_String = 10 [default="hello, \"world!\"\n"]; | ||||
|   optional bytes F_Bytes = 11 [default="Bignose"]; | ||||
|   optional sint32 F_Sint32 = 12 [default=-32]; | ||||
|   optional sint64 F_Sint64 = 13 [default=-64]; | ||||
|   optional Color F_Enum = 14 [default=GREEN]; | ||||
|  | ||||
|   // More fields with crazy defaults. | ||||
|   optional float F_Pinf = 15 [default=inf]; | ||||
|   optional float F_Ninf = 16 [default=-inf]; | ||||
|   optional float F_Nan = 17 [default=nan]; | ||||
|  | ||||
|   // Sub-message. | ||||
|   optional SubDefaults sub = 18; | ||||
|  | ||||
|   // Redundant but explicit defaults. | ||||
|   optional string str_zero = 19 [default=""]; | ||||
| } | ||||
|  | ||||
| message SubDefaults { | ||||
|   optional int64 n = 1 [default=7]; | ||||
| } | ||||
|  | ||||
| message RepeatedEnum { | ||||
|   enum Color { | ||||
|     RED = 1; | ||||
|   } | ||||
|   repeated Color color = 1; | ||||
| } | ||||
|  | ||||
| message MoreRepeated { | ||||
|   repeated bool bools = 1; | ||||
|   repeated bool bools_packed = 2 [packed=true]; | ||||
|   repeated int32 ints = 3; | ||||
|   repeated int32 ints_packed = 4 [packed=true]; | ||||
|   repeated int64 int64s_packed = 7 [packed=true]; | ||||
|   repeated string strings = 5; | ||||
|   repeated fixed32 fixeds = 6; | ||||
| } | ||||
|  | ||||
| // GroupOld and GroupNew have the same wire format. | ||||
| // GroupNew has a new field inside a group. | ||||
|  | ||||
| message GroupOld { | ||||
|   optional group G = 101 { | ||||
|     optional int32 x = 2; | ||||
|   } | ||||
| } | ||||
|  | ||||
| message GroupNew { | ||||
|   optional group G = 101 { | ||||
|     optional int32 x = 2; | ||||
|     optional int32 y = 3; | ||||
|   } | ||||
| } | ||||
|  | ||||
| message FloatingPoint { | ||||
|   required double f = 1; | ||||
|   optional bool exact = 2; | ||||
| } | ||||
|  | ||||
| message MessageWithMap { | ||||
|   map<int32, string> name_mapping = 1; | ||||
|   map<sint64, FloatingPoint> msg_mapping = 2; | ||||
|   map<bool, bytes> byte_mapping = 3; | ||||
|   map<string, string> str_to_str = 4; | ||||
| } | ||||
|  | ||||
| message Oneof { | ||||
|   oneof union { | ||||
|     bool F_Bool = 1; | ||||
|     int32 F_Int32 = 2; | ||||
|     int64 F_Int64 = 3; | ||||
|     fixed32 F_Fixed32 = 4; | ||||
|     fixed64 F_Fixed64 = 5; | ||||
|     uint32 F_Uint32 = 6; | ||||
|     uint64 F_Uint64 = 7; | ||||
|     float F_Float = 8; | ||||
|     double F_Double = 9; | ||||
|     string F_String = 10; | ||||
|     bytes F_Bytes = 11; | ||||
|     sint32 F_Sint32 = 12; | ||||
|     sint64 F_Sint64 = 13; | ||||
|     MyMessage.Color F_Enum = 14; | ||||
|     GoTestField F_Message = 15; | ||||
|     group F_Group = 16 { | ||||
|       optional int32 x = 17; | ||||
|     } | ||||
|     int32 F_Largest_Tag = 536870911; | ||||
|   } | ||||
|  | ||||
|   oneof tormato { | ||||
|     int32 value = 100; | ||||
|   } | ||||
| } | ||||
|  | ||||
| message Communique { | ||||
|   optional bool make_me_cry = 1; | ||||
|  | ||||
|   // This is a oneof, called "union". | ||||
|   oneof union { | ||||
|     int32 number = 5; | ||||
|     string name = 6; | ||||
|     bytes data = 7; | ||||
|     double temp_c = 8; | ||||
|     MyMessage.Color col = 9; | ||||
|     Strings msg = 10; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										854
									
								
								vendor/github.com/golang/protobuf/proto/text.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										854
									
								
								vendor/github.com/golang/protobuf/proto/text.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,854 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto | ||||
|  | ||||
| // Functions for writing the text protocol buffer format. | ||||
|  | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"bytes" | ||||
| 	"encoding" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"log" | ||||
| 	"math" | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	newline         = []byte("\n") | ||||
| 	spaces          = []byte("                                        ") | ||||
| 	gtNewline       = []byte(">\n") | ||||
| 	endBraceNewline = []byte("}\n") | ||||
| 	backslashN      = []byte{'\\', 'n'} | ||||
| 	backslashR      = []byte{'\\', 'r'} | ||||
| 	backslashT      = []byte{'\\', 't'} | ||||
| 	backslashDQ     = []byte{'\\', '"'} | ||||
| 	backslashBS     = []byte{'\\', '\\'} | ||||
| 	posInf          = []byte("inf") | ||||
| 	negInf          = []byte("-inf") | ||||
| 	nan             = []byte("nan") | ||||
| ) | ||||
|  | ||||
| type writer interface { | ||||
| 	io.Writer | ||||
| 	WriteByte(byte) error | ||||
| } | ||||
|  | ||||
| // textWriter is an io.Writer that tracks its indentation level. | ||||
| type textWriter struct { | ||||
| 	ind      int | ||||
| 	complete bool // if the current position is a complete line | ||||
| 	compact  bool // whether to write out as a one-liner | ||||
| 	w        writer | ||||
| } | ||||
|  | ||||
| func (w *textWriter) WriteString(s string) (n int, err error) { | ||||
| 	if !strings.Contains(s, "\n") { | ||||
| 		if !w.compact && w.complete { | ||||
| 			w.writeIndent() | ||||
| 		} | ||||
| 		w.complete = false | ||||
| 		return io.WriteString(w.w, s) | ||||
| 	} | ||||
| 	// WriteString is typically called without newlines, so this | ||||
| 	// codepath and its copy are rare.  We copy to avoid | ||||
| 	// duplicating all of Write's logic here. | ||||
| 	return w.Write([]byte(s)) | ||||
| } | ||||
|  | ||||
| func (w *textWriter) Write(p []byte) (n int, err error) { | ||||
| 	newlines := bytes.Count(p, newline) | ||||
| 	if newlines == 0 { | ||||
| 		if !w.compact && w.complete { | ||||
| 			w.writeIndent() | ||||
| 		} | ||||
| 		n, err = w.w.Write(p) | ||||
| 		w.complete = false | ||||
| 		return n, err | ||||
| 	} | ||||
|  | ||||
| 	frags := bytes.SplitN(p, newline, newlines+1) | ||||
| 	if w.compact { | ||||
| 		for i, frag := range frags { | ||||
| 			if i > 0 { | ||||
| 				if err := w.w.WriteByte(' '); err != nil { | ||||
| 					return n, err | ||||
| 				} | ||||
| 				n++ | ||||
| 			} | ||||
| 			nn, err := w.w.Write(frag) | ||||
| 			n += nn | ||||
| 			if err != nil { | ||||
| 				return n, err | ||||
| 			} | ||||
| 		} | ||||
| 		return n, nil | ||||
| 	} | ||||
|  | ||||
| 	for i, frag := range frags { | ||||
| 		if w.complete { | ||||
| 			w.writeIndent() | ||||
| 		} | ||||
| 		nn, err := w.w.Write(frag) | ||||
| 		n += nn | ||||
| 		if err != nil { | ||||
| 			return n, err | ||||
| 		} | ||||
| 		if i+1 < len(frags) { | ||||
| 			if err := w.w.WriteByte('\n'); err != nil { | ||||
| 				return n, err | ||||
| 			} | ||||
| 			n++ | ||||
| 		} | ||||
| 	} | ||||
| 	w.complete = len(frags[len(frags)-1]) == 0 | ||||
| 	return n, nil | ||||
| } | ||||
|  | ||||
| func (w *textWriter) WriteByte(c byte) error { | ||||
| 	if w.compact && c == '\n' { | ||||
| 		c = ' ' | ||||
| 	} | ||||
| 	if !w.compact && w.complete { | ||||
| 		w.writeIndent() | ||||
| 	} | ||||
| 	err := w.w.WriteByte(c) | ||||
| 	w.complete = c == '\n' | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| func (w *textWriter) indent() { w.ind++ } | ||||
|  | ||||
| func (w *textWriter) unindent() { | ||||
| 	if w.ind == 0 { | ||||
| 		log.Print("proto: textWriter unindented too far") | ||||
| 		return | ||||
| 	} | ||||
| 	w.ind-- | ||||
| } | ||||
|  | ||||
| func writeName(w *textWriter, props *Properties) error { | ||||
| 	if _, err := w.WriteString(props.OrigName); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if props.Wire != "group" { | ||||
| 		return w.WriteByte(':') | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // raw is the interface satisfied by RawMessage. | ||||
| type raw interface { | ||||
| 	Bytes() []byte | ||||
| } | ||||
|  | ||||
| func requiresQuotes(u string) bool { | ||||
| 	// When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. | ||||
| 	for _, ch := range u { | ||||
| 		switch { | ||||
| 		case ch == '.' || ch == '/' || ch == '_': | ||||
| 			continue | ||||
| 		case '0' <= ch && ch <= '9': | ||||
| 			continue | ||||
| 		case 'A' <= ch && ch <= 'Z': | ||||
| 			continue | ||||
| 		case 'a' <= ch && ch <= 'z': | ||||
| 			continue | ||||
| 		default: | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // isAny reports whether sv is a google.protobuf.Any message | ||||
| func isAny(sv reflect.Value) bool { | ||||
| 	type wkt interface { | ||||
| 		XXX_WellKnownType() string | ||||
| 	} | ||||
| 	t, ok := sv.Addr().Interface().(wkt) | ||||
| 	return ok && t.XXX_WellKnownType() == "Any" | ||||
| } | ||||
|  | ||||
| // writeProto3Any writes an expanded google.protobuf.Any message. | ||||
| // | ||||
| // It returns (false, nil) if sv value can't be unmarshaled (e.g. because | ||||
| // required messages are not linked in). | ||||
| // | ||||
| // It returns (true, error) when sv was written in expanded format or an error | ||||
| // was encountered. | ||||
| func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { | ||||
| 	turl := sv.FieldByName("TypeUrl") | ||||
| 	val := sv.FieldByName("Value") | ||||
| 	if !turl.IsValid() || !val.IsValid() { | ||||
| 		return true, errors.New("proto: invalid google.protobuf.Any message") | ||||
| 	} | ||||
|  | ||||
| 	b, ok := val.Interface().([]byte) | ||||
| 	if !ok { | ||||
| 		return true, errors.New("proto: invalid google.protobuf.Any message") | ||||
| 	} | ||||
|  | ||||
| 	parts := strings.Split(turl.String(), "/") | ||||
| 	mt := MessageType(parts[len(parts)-1]) | ||||
| 	if mt == nil { | ||||
| 		return false, nil | ||||
| 	} | ||||
| 	m := reflect.New(mt.Elem()) | ||||
| 	if err := Unmarshal(b, m.Interface().(Message)); err != nil { | ||||
| 		return false, nil | ||||
| 	} | ||||
| 	w.Write([]byte("[")) | ||||
| 	u := turl.String() | ||||
| 	if requiresQuotes(u) { | ||||
| 		writeString(w, u) | ||||
| 	} else { | ||||
| 		w.Write([]byte(u)) | ||||
| 	} | ||||
| 	if w.compact { | ||||
| 		w.Write([]byte("]:<")) | ||||
| 	} else { | ||||
| 		w.Write([]byte("]: <\n")) | ||||
| 		w.ind++ | ||||
| 	} | ||||
| 	if err := tm.writeStruct(w, m.Elem()); err != nil { | ||||
| 		return true, err | ||||
| 	} | ||||
| 	if w.compact { | ||||
| 		w.Write([]byte("> ")) | ||||
| 	} else { | ||||
| 		w.ind-- | ||||
| 		w.Write([]byte(">\n")) | ||||
| 	} | ||||
| 	return true, nil | ||||
| } | ||||
|  | ||||
| func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { | ||||
| 	if tm.ExpandAny && isAny(sv) { | ||||
| 		if canExpand, err := tm.writeProto3Any(w, sv); canExpand { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	st := sv.Type() | ||||
| 	sprops := GetProperties(st) | ||||
| 	for i := 0; i < sv.NumField(); i++ { | ||||
| 		fv := sv.Field(i) | ||||
| 		props := sprops.Prop[i] | ||||
| 		name := st.Field(i).Name | ||||
|  | ||||
| 		if strings.HasPrefix(name, "XXX_") { | ||||
| 			// There are two XXX_ fields: | ||||
| 			//   XXX_unrecognized []byte | ||||
| 			//   XXX_extensions   map[int32]proto.Extension | ||||
| 			// The first is handled here; | ||||
| 			// the second is handled at the bottom of this function. | ||||
| 			if name == "XXX_unrecognized" && !fv.IsNil() { | ||||
| 				if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 		if fv.Kind() == reflect.Ptr && fv.IsNil() { | ||||
| 			// Field not filled in. This could be an optional field or | ||||
| 			// a required field that wasn't filled in. Either way, there | ||||
| 			// isn't anything we can show for it. | ||||
| 			continue | ||||
| 		} | ||||
| 		if fv.Kind() == reflect.Slice && fv.IsNil() { | ||||
| 			// Repeated field that is empty, or a bytes field that is unused. | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		if props.Repeated && fv.Kind() == reflect.Slice { | ||||
| 			// Repeated field. | ||||
| 			for j := 0; j < fv.Len(); j++ { | ||||
| 				if err := writeName(w, props); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				if !w.compact { | ||||
| 					if err := w.WriteByte(' '); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} | ||||
| 				v := fv.Index(j) | ||||
| 				if v.Kind() == reflect.Ptr && v.IsNil() { | ||||
| 					// A nil message in a repeated field is not valid, | ||||
| 					// but we can handle that more gracefully than panicking. | ||||
| 					if _, err := w.Write([]byte("<nil>\n")); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					continue | ||||
| 				} | ||||
| 				if err := tm.writeAny(w, v, props); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				if err := w.WriteByte('\n'); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 		if fv.Kind() == reflect.Map { | ||||
| 			// Map fields are rendered as a repeated struct with key/value fields. | ||||
| 			keys := fv.MapKeys() | ||||
| 			sort.Sort(mapKeys(keys)) | ||||
| 			for _, key := range keys { | ||||
| 				val := fv.MapIndex(key) | ||||
| 				if err := writeName(w, props); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				if !w.compact { | ||||
| 					if err := w.WriteByte(' '); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} | ||||
| 				// open struct | ||||
| 				if err := w.WriteByte('<'); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				if !w.compact { | ||||
| 					if err := w.WriteByte('\n'); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} | ||||
| 				w.indent() | ||||
| 				// key | ||||
| 				if _, err := w.WriteString("key:"); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				if !w.compact { | ||||
| 					if err := w.WriteByte(' '); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} | ||||
| 				if err := tm.writeAny(w, key, props.mkeyprop); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				if err := w.WriteByte('\n'); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				// nil values aren't legal, but we can avoid panicking because of them. | ||||
| 				if val.Kind() != reflect.Ptr || !val.IsNil() { | ||||
| 					// value | ||||
| 					if _, err := w.WriteString("value:"); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					if !w.compact { | ||||
| 						if err := w.WriteByte(' '); err != nil { | ||||
| 							return err | ||||
| 						} | ||||
| 					} | ||||
| 					if err := tm.writeAny(w, val, props.mvalprop); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					if err := w.WriteByte('\n'); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} | ||||
| 				// close struct | ||||
| 				w.unindent() | ||||
| 				if err := w.WriteByte('>'); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				if err := w.WriteByte('\n'); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 		if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { | ||||
| 			// empty bytes field | ||||
| 			continue | ||||
| 		} | ||||
| 		if fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { | ||||
| 			// proto3 non-repeated scalar field; skip if zero value | ||||
| 			if isProto3Zero(fv) { | ||||
| 				continue | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if fv.Kind() == reflect.Interface { | ||||
| 			// Check if it is a oneof. | ||||
| 			if st.Field(i).Tag.Get("protobuf_oneof") != "" { | ||||
| 				// fv is nil, or holds a pointer to generated struct. | ||||
| 				// That generated struct has exactly one field, | ||||
| 				// which has a protobuf struct tag. | ||||
| 				if fv.IsNil() { | ||||
| 					continue | ||||
| 				} | ||||
| 				inner := fv.Elem().Elem() // interface -> *T -> T | ||||
| 				tag := inner.Type().Field(0).Tag.Get("protobuf") | ||||
| 				props = new(Properties) // Overwrite the outer props var, but not its pointee. | ||||
| 				props.Parse(tag) | ||||
| 				// Write the value in the oneof, not the oneof itself. | ||||
| 				fv = inner.Field(0) | ||||
|  | ||||
| 				// Special case to cope with malformed messages gracefully: | ||||
| 				// If the value in the oneof is a nil pointer, don't panic | ||||
| 				// in writeAny. | ||||
| 				if fv.Kind() == reflect.Ptr && fv.IsNil() { | ||||
| 					// Use errors.New so writeAny won't render quotes. | ||||
| 					msg := errors.New("/* nil */") | ||||
| 					fv = reflect.ValueOf(&msg).Elem() | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if err := writeName(w, props); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if !w.compact { | ||||
| 			if err := w.WriteByte(' '); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		if b, ok := fv.Interface().(raw); ok { | ||||
| 			if err := writeRaw(w, b.Bytes()); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// Enums have a String method, so writeAny will work fine. | ||||
| 		if err := tm.writeAny(w, fv, props); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		if err := w.WriteByte('\n'); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Extensions (the XXX_extensions field). | ||||
| 	pv := sv.Addr() | ||||
| 	if _, ok := extendable(pv.Interface()); ok { | ||||
| 		if err := tm.writeExtensions(w, pv); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // writeRaw writes an uninterpreted raw message. | ||||
| func writeRaw(w *textWriter, b []byte) error { | ||||
| 	if err := w.WriteByte('<'); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if !w.compact { | ||||
| 		if err := w.WriteByte('\n'); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	w.indent() | ||||
| 	if err := writeUnknownStruct(w, b); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	w.unindent() | ||||
| 	if err := w.WriteByte('>'); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // writeAny writes an arbitrary field. | ||||
| func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { | ||||
| 	v = reflect.Indirect(v) | ||||
|  | ||||
| 	// Floats have special cases. | ||||
| 	if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { | ||||
| 		x := v.Float() | ||||
| 		var b []byte | ||||
| 		switch { | ||||
| 		case math.IsInf(x, 1): | ||||
| 			b = posInf | ||||
| 		case math.IsInf(x, -1): | ||||
| 			b = negInf | ||||
| 		case math.IsNaN(x): | ||||
| 			b = nan | ||||
| 		} | ||||
| 		if b != nil { | ||||
| 			_, err := w.Write(b) | ||||
| 			return err | ||||
| 		} | ||||
| 		// Other values are handled below. | ||||
| 	} | ||||
|  | ||||
| 	// We don't attempt to serialise every possible value type; only those | ||||
| 	// that can occur in protocol buffers. | ||||
| 	switch v.Kind() { | ||||
| 	case reflect.Slice: | ||||
| 		// Should only be a []byte; repeated fields are handled in writeStruct. | ||||
| 		if err := writeString(w, string(v.Bytes())); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	case reflect.String: | ||||
| 		if err := writeString(w, v.String()); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	case reflect.Struct: | ||||
| 		// Required/optional group/message. | ||||
| 		var bra, ket byte = '<', '>' | ||||
| 		if props != nil && props.Wire == "group" { | ||||
| 			bra, ket = '{', '}' | ||||
| 		} | ||||
| 		if err := w.WriteByte(bra); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if !w.compact { | ||||
| 			if err := w.WriteByte('\n'); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		w.indent() | ||||
| 		if etm, ok := v.Interface().(encoding.TextMarshaler); ok { | ||||
| 			text, err := etm.MarshalText() | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			if _, err = w.Write(text); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} else if err := tm.writeStruct(w, v); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		w.unindent() | ||||
| 		if err := w.WriteByte(ket); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	default: | ||||
| 		_, err := fmt.Fprint(w, v.Interface()) | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // equivalent to C's isprint. | ||||
| func isprint(c byte) bool { | ||||
| 	return c >= 0x20 && c < 0x7f | ||||
| } | ||||
|  | ||||
| // writeString writes a string in the protocol buffer text format. | ||||
| // It is similar to strconv.Quote except we don't use Go escape sequences, | ||||
| // we treat the string as a byte sequence, and we use octal escapes. | ||||
| // These differences are to maintain interoperability with the other | ||||
| // languages' implementations of the text format. | ||||
| func writeString(w *textWriter, s string) error { | ||||
| 	// use WriteByte here to get any needed indent | ||||
| 	if err := w.WriteByte('"'); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	// Loop over the bytes, not the runes. | ||||
| 	for i := 0; i < len(s); i++ { | ||||
| 		var err error | ||||
| 		// Divergence from C++: we don't escape apostrophes. | ||||
| 		// There's no need to escape them, and the C++ parser | ||||
| 		// copes with a naked apostrophe. | ||||
| 		switch c := s[i]; c { | ||||
| 		case '\n': | ||||
| 			_, err = w.w.Write(backslashN) | ||||
| 		case '\r': | ||||
| 			_, err = w.w.Write(backslashR) | ||||
| 		case '\t': | ||||
| 			_, err = w.w.Write(backslashT) | ||||
| 		case '"': | ||||
| 			_, err = w.w.Write(backslashDQ) | ||||
| 		case '\\': | ||||
| 			_, err = w.w.Write(backslashBS) | ||||
| 		default: | ||||
| 			if isprint(c) { | ||||
| 				err = w.w.WriteByte(c) | ||||
| 			} else { | ||||
| 				_, err = fmt.Fprintf(w.w, "\\%03o", c) | ||||
| 			} | ||||
| 		} | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return w.WriteByte('"') | ||||
| } | ||||
|  | ||||
| func writeUnknownStruct(w *textWriter, data []byte) (err error) { | ||||
| 	if !w.compact { | ||||
| 		if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	b := NewBuffer(data) | ||||
| 	for b.index < len(b.buf) { | ||||
| 		x, err := b.DecodeVarint() | ||||
| 		if err != nil { | ||||
| 			_, err := fmt.Fprintf(w, "/* %v */\n", err) | ||||
| 			return err | ||||
| 		} | ||||
| 		wire, tag := x&7, x>>3 | ||||
| 		if wire == WireEndGroup { | ||||
| 			w.unindent() | ||||
| 			if _, err := w.Write(endBraceNewline); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 		if _, err := fmt.Fprint(w, tag); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if wire != WireStartGroup { | ||||
| 			if err := w.WriteByte(':'); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		if !w.compact || wire == WireStartGroup { | ||||
| 			if err := w.WriteByte(' '); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		switch wire { | ||||
| 		case WireBytes: | ||||
| 			buf, e := b.DecodeRawBytes(false) | ||||
| 			if e == nil { | ||||
| 				_, err = fmt.Fprintf(w, "%q", buf) | ||||
| 			} else { | ||||
| 				_, err = fmt.Fprintf(w, "/* %v */", e) | ||||
| 			} | ||||
| 		case WireFixed32: | ||||
| 			x, err = b.DecodeFixed32() | ||||
| 			err = writeUnknownInt(w, x, err) | ||||
| 		case WireFixed64: | ||||
| 			x, err = b.DecodeFixed64() | ||||
| 			err = writeUnknownInt(w, x, err) | ||||
| 		case WireStartGroup: | ||||
| 			err = w.WriteByte('{') | ||||
| 			w.indent() | ||||
| 		case WireVarint: | ||||
| 			x, err = b.DecodeVarint() | ||||
| 			err = writeUnknownInt(w, x, err) | ||||
| 		default: | ||||
| 			_, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) | ||||
| 		} | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if err = w.WriteByte('\n'); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func writeUnknownInt(w *textWriter, x uint64, err error) error { | ||||
| 	if err == nil { | ||||
| 		_, err = fmt.Fprint(w, x) | ||||
| 	} else { | ||||
| 		_, err = fmt.Fprintf(w, "/* %v */", err) | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| type int32Slice []int32 | ||||
|  | ||||
| func (s int32Slice) Len() int           { return len(s) } | ||||
| func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } | ||||
| func (s int32Slice) Swap(i, j int)      { s[i], s[j] = s[j], s[i] } | ||||
|  | ||||
| // writeExtensions writes all the extensions in pv. | ||||
| // pv is assumed to be a pointer to a protocol message struct that is extendable. | ||||
| func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { | ||||
| 	emap := extensionMaps[pv.Type().Elem()] | ||||
| 	ep, _ := extendable(pv.Interface()) | ||||
|  | ||||
| 	// Order the extensions by ID. | ||||
| 	// This isn't strictly necessary, but it will give us | ||||
| 	// canonical output, which will also make testing easier. | ||||
| 	m, mu := ep.extensionsRead() | ||||
| 	if m == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	mu.Lock() | ||||
| 	ids := make([]int32, 0, len(m)) | ||||
| 	for id := range m { | ||||
| 		ids = append(ids, id) | ||||
| 	} | ||||
| 	sort.Sort(int32Slice(ids)) | ||||
| 	mu.Unlock() | ||||
|  | ||||
| 	for _, extNum := range ids { | ||||
| 		ext := m[extNum] | ||||
| 		var desc *ExtensionDesc | ||||
| 		if emap != nil { | ||||
| 			desc = emap[extNum] | ||||
| 		} | ||||
| 		if desc == nil { | ||||
| 			// Unknown extension. | ||||
| 			if err := writeUnknownStruct(w, ext.enc); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		pb, err := GetExtension(ep, desc) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("failed getting extension: %v", err) | ||||
| 		} | ||||
|  | ||||
| 		// Repeated extensions will appear as a slice. | ||||
| 		if !desc.repeated() { | ||||
| 			if err := tm.writeExtension(w, desc.Name, pb); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} else { | ||||
| 			v := reflect.ValueOf(pb) | ||||
| 			for i := 0; i < v.Len(); i++ { | ||||
| 				if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { | ||||
| 	if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if !w.compact { | ||||
| 		if err := w.WriteByte(' '); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := w.WriteByte('\n'); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (w *textWriter) writeIndent() { | ||||
| 	if !w.complete { | ||||
| 		return | ||||
| 	} | ||||
| 	remain := w.ind * 2 | ||||
| 	for remain > 0 { | ||||
| 		n := remain | ||||
| 		if n > len(spaces) { | ||||
| 			n = len(spaces) | ||||
| 		} | ||||
| 		w.w.Write(spaces[:n]) | ||||
| 		remain -= n | ||||
| 	} | ||||
| 	w.complete = false | ||||
| } | ||||
|  | ||||
| // TextMarshaler is a configurable text format marshaler. | ||||
| type TextMarshaler struct { | ||||
| 	Compact   bool // use compact text format (one line). | ||||
| 	ExpandAny bool // expand google.protobuf.Any messages of known types | ||||
| } | ||||
|  | ||||
| // Marshal writes a given protocol buffer in text format. | ||||
| // The only errors returned are from w. | ||||
| func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { | ||||
| 	val := reflect.ValueOf(pb) | ||||
| 	if pb == nil || val.IsNil() { | ||||
| 		w.Write([]byte("<nil>")) | ||||
| 		return nil | ||||
| 	} | ||||
| 	var bw *bufio.Writer | ||||
| 	ww, ok := w.(writer) | ||||
| 	if !ok { | ||||
| 		bw = bufio.NewWriter(w) | ||||
| 		ww = bw | ||||
| 	} | ||||
| 	aw := &textWriter{ | ||||
| 		w:        ww, | ||||
| 		complete: true, | ||||
| 		compact:  tm.Compact, | ||||
| 	} | ||||
|  | ||||
| 	if etm, ok := pb.(encoding.TextMarshaler); ok { | ||||
| 		text, err := etm.MarshalText() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if _, err = aw.Write(text); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if bw != nil { | ||||
| 			return bw.Flush() | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
| 	// Dereference the received pointer so we don't have outer < and >. | ||||
| 	v := reflect.Indirect(val) | ||||
| 	if err := tm.writeStruct(aw, v); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if bw != nil { | ||||
| 		return bw.Flush() | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Text is the same as Marshal, but returns the string directly. | ||||
| func (tm *TextMarshaler) Text(pb Message) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	tm.Marshal(&buf, pb) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	defaultTextMarshaler = TextMarshaler{} | ||||
| 	compactTextMarshaler = TextMarshaler{Compact: true} | ||||
| ) | ||||
|  | ||||
| // TODO: consider removing some of the Marshal functions below. | ||||
|  | ||||
| // MarshalText writes a given protocol buffer in text format. | ||||
| // The only errors returned are from w. | ||||
| func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } | ||||
|  | ||||
| // MarshalTextString is the same as MarshalText, but returns the string directly. | ||||
| func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } | ||||
|  | ||||
| // CompactText writes a given protocol buffer in compact text format (one line). | ||||
| func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } | ||||
|  | ||||
| // CompactTextString is the same as CompactText, but returns the string directly. | ||||
| func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } | ||||
							
								
								
									
										891
									
								
								vendor/github.com/golang/protobuf/proto/text_parser.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										891
									
								
								vendor/github.com/golang/protobuf/proto/text_parser.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,891 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto | ||||
|  | ||||
| // Functions for parsing the Text protocol buffer format. | ||||
| // TODO: message sets. | ||||
|  | ||||
| import ( | ||||
| 	"encoding" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"unicode/utf8" | ||||
| ) | ||||
|  | ||||
| // Error string emitted when deserializing Any and fields are already set | ||||
| const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" | ||||
|  | ||||
| type ParseError struct { | ||||
| 	Message string | ||||
| 	Line    int // 1-based line number | ||||
| 	Offset  int // 0-based byte offset from start of input | ||||
| } | ||||
|  | ||||
| func (p *ParseError) Error() string { | ||||
| 	if p.Line == 1 { | ||||
| 		// show offset only for first line | ||||
| 		return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) | ||||
| 	} | ||||
| 	return fmt.Sprintf("line %d: %v", p.Line, p.Message) | ||||
| } | ||||
|  | ||||
| type token struct { | ||||
| 	value    string | ||||
| 	err      *ParseError | ||||
| 	line     int    // line number | ||||
| 	offset   int    // byte number from start of input, not start of line | ||||
| 	unquoted string // the unquoted version of value, if it was a quoted string | ||||
| } | ||||
|  | ||||
| func (t *token) String() string { | ||||
| 	if t.err == nil { | ||||
| 		return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) | ||||
| 	} | ||||
| 	return fmt.Sprintf("parse error: %v", t.err) | ||||
| } | ||||
|  | ||||
| type textParser struct { | ||||
| 	s            string // remaining input | ||||
| 	done         bool   // whether the parsing is finished (success or error) | ||||
| 	backed       bool   // whether back() was called | ||||
| 	offset, line int | ||||
| 	cur          token | ||||
| } | ||||
|  | ||||
| func newTextParser(s string) *textParser { | ||||
| 	p := new(textParser) | ||||
| 	p.s = s | ||||
| 	p.line = 1 | ||||
| 	p.cur.line = 1 | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| func (p *textParser) errorf(format string, a ...interface{}) *ParseError { | ||||
| 	pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} | ||||
| 	p.cur.err = pe | ||||
| 	p.done = true | ||||
| 	return pe | ||||
| } | ||||
|  | ||||
| // Numbers and identifiers are matched by [-+._A-Za-z0-9] | ||||
| func isIdentOrNumberChar(c byte) bool { | ||||
| 	switch { | ||||
| 	case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': | ||||
| 		return true | ||||
| 	case '0' <= c && c <= '9': | ||||
| 		return true | ||||
| 	} | ||||
| 	switch c { | ||||
| 	case '-', '+', '.', '_': | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func isWhitespace(c byte) bool { | ||||
| 	switch c { | ||||
| 	case ' ', '\t', '\n', '\r': | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func isQuote(c byte) bool { | ||||
| 	switch c { | ||||
| 	case '"', '\'': | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (p *textParser) skipWhitespace() { | ||||
| 	i := 0 | ||||
| 	for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { | ||||
| 		if p.s[i] == '#' { | ||||
| 			// comment; skip to end of line or input | ||||
| 			for i < len(p.s) && p.s[i] != '\n' { | ||||
| 				i++ | ||||
| 			} | ||||
| 			if i == len(p.s) { | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 		if p.s[i] == '\n' { | ||||
| 			p.line++ | ||||
| 		} | ||||
| 		i++ | ||||
| 	} | ||||
| 	p.offset += i | ||||
| 	p.s = p.s[i:len(p.s)] | ||||
| 	if len(p.s) == 0 { | ||||
| 		p.done = true | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (p *textParser) advance() { | ||||
| 	// Skip whitespace | ||||
| 	p.skipWhitespace() | ||||
| 	if p.done { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// Start of non-whitespace | ||||
| 	p.cur.err = nil | ||||
| 	p.cur.offset, p.cur.line = p.offset, p.line | ||||
| 	p.cur.unquoted = "" | ||||
| 	switch p.s[0] { | ||||
| 	case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': | ||||
| 		// Single symbol | ||||
| 		p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] | ||||
| 	case '"', '\'': | ||||
| 		// Quoted string | ||||
| 		i := 1 | ||||
| 		for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { | ||||
| 			if p.s[i] == '\\' && i+1 < len(p.s) { | ||||
| 				// skip escaped char | ||||
| 				i++ | ||||
| 			} | ||||
| 			i++ | ||||
| 		} | ||||
| 		if i >= len(p.s) || p.s[i] != p.s[0] { | ||||
| 			p.errorf("unmatched quote") | ||||
| 			return | ||||
| 		} | ||||
| 		unq, err := unquoteC(p.s[1:i], rune(p.s[0])) | ||||
| 		if err != nil { | ||||
| 			p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) | ||||
| 			return | ||||
| 		} | ||||
| 		p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] | ||||
| 		p.cur.unquoted = unq | ||||
| 	default: | ||||
| 		i := 0 | ||||
| 		for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { | ||||
| 			i++ | ||||
| 		} | ||||
| 		if i == 0 { | ||||
| 			p.errorf("unexpected byte %#x", p.s[0]) | ||||
| 			return | ||||
| 		} | ||||
| 		p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] | ||||
| 	} | ||||
| 	p.offset += len(p.cur.value) | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	errBadUTF8 = errors.New("proto: bad UTF-8") | ||||
| 	errBadHex  = errors.New("proto: bad hexadecimal") | ||||
| ) | ||||
|  | ||||
| func unquoteC(s string, quote rune) (string, error) { | ||||
| 	// This is based on C++'s tokenizer.cc. | ||||
| 	// Despite its name, this is *not* parsing C syntax. | ||||
| 	// For instance, "\0" is an invalid quoted string. | ||||
|  | ||||
| 	// Avoid allocation in trivial cases. | ||||
| 	simple := true | ||||
| 	for _, r := range s { | ||||
| 		if r == '\\' || r == quote { | ||||
| 			simple = false | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	if simple { | ||||
| 		return s, nil | ||||
| 	} | ||||
|  | ||||
| 	buf := make([]byte, 0, 3*len(s)/2) | ||||
| 	for len(s) > 0 { | ||||
| 		r, n := utf8.DecodeRuneInString(s) | ||||
| 		if r == utf8.RuneError && n == 1 { | ||||
| 			return "", errBadUTF8 | ||||
| 		} | ||||
| 		s = s[n:] | ||||
| 		if r != '\\' { | ||||
| 			if r < utf8.RuneSelf { | ||||
| 				buf = append(buf, byte(r)) | ||||
| 			} else { | ||||
| 				buf = append(buf, string(r)...) | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		ch, tail, err := unescape(s) | ||||
| 		if err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
| 		buf = append(buf, ch...) | ||||
| 		s = tail | ||||
| 	} | ||||
| 	return string(buf), nil | ||||
| } | ||||
|  | ||||
| func unescape(s string) (ch string, tail string, err error) { | ||||
| 	r, n := utf8.DecodeRuneInString(s) | ||||
| 	if r == utf8.RuneError && n == 1 { | ||||
| 		return "", "", errBadUTF8 | ||||
| 	} | ||||
| 	s = s[n:] | ||||
| 	switch r { | ||||
| 	case 'a': | ||||
| 		return "\a", s, nil | ||||
| 	case 'b': | ||||
| 		return "\b", s, nil | ||||
| 	case 'f': | ||||
| 		return "\f", s, nil | ||||
| 	case 'n': | ||||
| 		return "\n", s, nil | ||||
| 	case 'r': | ||||
| 		return "\r", s, nil | ||||
| 	case 't': | ||||
| 		return "\t", s, nil | ||||
| 	case 'v': | ||||
| 		return "\v", s, nil | ||||
| 	case '?': | ||||
| 		return "?", s, nil // trigraph workaround | ||||
| 	case '\'', '"', '\\': | ||||
| 		return string(r), s, nil | ||||
| 	case '0', '1', '2', '3', '4', '5', '6', '7', 'x', 'X': | ||||
| 		if len(s) < 2 { | ||||
| 			return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) | ||||
| 		} | ||||
| 		base := 8 | ||||
| 		ss := s[:2] | ||||
| 		s = s[2:] | ||||
| 		if r == 'x' || r == 'X' { | ||||
| 			base = 16 | ||||
| 		} else { | ||||
| 			ss = string(r) + ss | ||||
| 		} | ||||
| 		i, err := strconv.ParseUint(ss, base, 8) | ||||
| 		if err != nil { | ||||
| 			return "", "", err | ||||
| 		} | ||||
| 		return string([]byte{byte(i)}), s, nil | ||||
| 	case 'u', 'U': | ||||
| 		n := 4 | ||||
| 		if r == 'U' { | ||||
| 			n = 8 | ||||
| 		} | ||||
| 		if len(s) < n { | ||||
| 			return "", "", fmt.Errorf(`\%c requires %d digits`, r, n) | ||||
| 		} | ||||
|  | ||||
| 		bs := make([]byte, n/2) | ||||
| 		for i := 0; i < n; i += 2 { | ||||
| 			a, ok1 := unhex(s[i]) | ||||
| 			b, ok2 := unhex(s[i+1]) | ||||
| 			if !ok1 || !ok2 { | ||||
| 				return "", "", errBadHex | ||||
| 			} | ||||
| 			bs[i/2] = a<<4 | b | ||||
| 		} | ||||
| 		s = s[n:] | ||||
| 		return string(bs), s, nil | ||||
| 	} | ||||
| 	return "", "", fmt.Errorf(`unknown escape \%c`, r) | ||||
| } | ||||
|  | ||||
| // Adapted from src/pkg/strconv/quote.go. | ||||
| func unhex(b byte) (v byte, ok bool) { | ||||
| 	switch { | ||||
| 	case '0' <= b && b <= '9': | ||||
| 		return b - '0', true | ||||
| 	case 'a' <= b && b <= 'f': | ||||
| 		return b - 'a' + 10, true | ||||
| 	case 'A' <= b && b <= 'F': | ||||
| 		return b - 'A' + 10, true | ||||
| 	} | ||||
| 	return 0, false | ||||
| } | ||||
|  | ||||
| // Back off the parser by one token. Can only be done between calls to next(). | ||||
| // It makes the next advance() a no-op. | ||||
| func (p *textParser) back() { p.backed = true } | ||||
|  | ||||
| // Advances the parser and returns the new current token. | ||||
| func (p *textParser) next() *token { | ||||
| 	if p.backed || p.done { | ||||
| 		p.backed = false | ||||
| 		return &p.cur | ||||
| 	} | ||||
| 	p.advance() | ||||
| 	if p.done { | ||||
| 		p.cur.value = "" | ||||
| 	} else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { | ||||
| 		// Look for multiple quoted strings separated by whitespace, | ||||
| 		// and concatenate them. | ||||
| 		cat := p.cur | ||||
| 		for { | ||||
| 			p.skipWhitespace() | ||||
| 			if p.done || !isQuote(p.s[0]) { | ||||
| 				break | ||||
| 			} | ||||
| 			p.advance() | ||||
| 			if p.cur.err != nil { | ||||
| 				return &p.cur | ||||
| 			} | ||||
| 			cat.value += " " + p.cur.value | ||||
| 			cat.unquoted += p.cur.unquoted | ||||
| 		} | ||||
| 		p.done = false // parser may have seen EOF, but we want to return cat | ||||
| 		p.cur = cat | ||||
| 	} | ||||
| 	return &p.cur | ||||
| } | ||||
|  | ||||
| func (p *textParser) consumeToken(s string) error { | ||||
| 	tok := p.next() | ||||
| 	if tok.err != nil { | ||||
| 		return tok.err | ||||
| 	} | ||||
| 	if tok.value != s { | ||||
| 		p.back() | ||||
| 		return p.errorf("expected %q, found %q", s, tok.value) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Return a RequiredNotSetError indicating which required field was not set. | ||||
| func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { | ||||
| 	st := sv.Type() | ||||
| 	sprops := GetProperties(st) | ||||
| 	for i := 0; i < st.NumField(); i++ { | ||||
| 		if !isNil(sv.Field(i)) { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		props := sprops.Prop[i] | ||||
| 		if props.Required { | ||||
| 			return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} | ||||
| 		} | ||||
| 	} | ||||
| 	return &RequiredNotSetError{fmt.Sprintf("%v.<unknown field name>", st)} // should not happen | ||||
| } | ||||
|  | ||||
| // Returns the index in the struct for the named field, as well as the parsed tag properties. | ||||
| func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { | ||||
| 	i, ok := sprops.decoderOrigNames[name] | ||||
| 	if ok { | ||||
| 		return i, sprops.Prop[i], true | ||||
| 	} | ||||
| 	return -1, nil, false | ||||
| } | ||||
|  | ||||
| // Consume a ':' from the input stream (if the next token is a colon), | ||||
| // returning an error if a colon is needed but not present. | ||||
| func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { | ||||
| 	tok := p.next() | ||||
| 	if tok.err != nil { | ||||
| 		return tok.err | ||||
| 	} | ||||
| 	if tok.value != ":" { | ||||
| 		// Colon is optional when the field is a group or message. | ||||
| 		needColon := true | ||||
| 		switch props.Wire { | ||||
| 		case "group": | ||||
| 			needColon = false | ||||
| 		case "bytes": | ||||
| 			// A "bytes" field is either a message, a string, or a repeated field; | ||||
| 			// those three become *T, *string and []T respectively, so we can check for | ||||
| 			// this field being a pointer to a non-string. | ||||
| 			if typ.Kind() == reflect.Ptr { | ||||
| 				// *T or *string | ||||
| 				if typ.Elem().Kind() == reflect.String { | ||||
| 					break | ||||
| 				} | ||||
| 			} else if typ.Kind() == reflect.Slice { | ||||
| 				// []T or []*T | ||||
| 				if typ.Elem().Kind() != reflect.Ptr { | ||||
| 					break | ||||
| 				} | ||||
| 			} else if typ.Kind() == reflect.String { | ||||
| 				// The proto3 exception is for a string field, | ||||
| 				// which requires a colon. | ||||
| 				break | ||||
| 			} | ||||
| 			needColon = false | ||||
| 		} | ||||
| 		if needColon { | ||||
| 			return p.errorf("expected ':', found %q", tok.value) | ||||
| 		} | ||||
| 		p.back() | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (p *textParser) readStruct(sv reflect.Value, terminator string) error { | ||||
| 	st := sv.Type() | ||||
| 	sprops := GetProperties(st) | ||||
| 	reqCount := sprops.reqCount | ||||
| 	var reqFieldErr error | ||||
| 	fieldSet := make(map[string]bool) | ||||
| 	// A struct is a sequence of "name: value", terminated by one of | ||||
| 	// '>' or '}', or the end of the input.  A name may also be | ||||
| 	// "[extension]" or "[type/url]". | ||||
| 	// | ||||
| 	// The whole struct can also be an expanded Any message, like: | ||||
| 	// [type/url] < ... struct contents ... > | ||||
| 	for { | ||||
| 		tok := p.next() | ||||
| 		if tok.err != nil { | ||||
| 			return tok.err | ||||
| 		} | ||||
| 		if tok.value == terminator { | ||||
| 			break | ||||
| 		} | ||||
| 		if tok.value == "[" { | ||||
| 			// Looks like an extension or an Any. | ||||
| 			// | ||||
| 			// TODO: Check whether we need to handle | ||||
| 			// namespace rooted names (e.g. ".something.Foo"). | ||||
| 			extName, err := p.consumeExtName() | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 			if s := strings.LastIndex(extName, "/"); s >= 0 { | ||||
| 				// If it contains a slash, it's an Any type URL. | ||||
| 				messageName := extName[s+1:] | ||||
| 				mt := MessageType(messageName) | ||||
| 				if mt == nil { | ||||
| 					return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) | ||||
| 				} | ||||
| 				tok = p.next() | ||||
| 				if tok.err != nil { | ||||
| 					return tok.err | ||||
| 				} | ||||
| 				// consume an optional colon | ||||
| 				if tok.value == ":" { | ||||
| 					tok = p.next() | ||||
| 					if tok.err != nil { | ||||
| 						return tok.err | ||||
| 					} | ||||
| 				} | ||||
| 				var terminator string | ||||
| 				switch tok.value { | ||||
| 				case "<": | ||||
| 					terminator = ">" | ||||
| 				case "{": | ||||
| 					terminator = "}" | ||||
| 				default: | ||||
| 					return p.errorf("expected '{' or '<', found %q", tok.value) | ||||
| 				} | ||||
| 				v := reflect.New(mt.Elem()) | ||||
| 				if pe := p.readStruct(v.Elem(), terminator); pe != nil { | ||||
| 					return pe | ||||
| 				} | ||||
| 				b, err := Marshal(v.Interface().(Message)) | ||||
| 				if err != nil { | ||||
| 					return p.errorf("failed to marshal message of type %q: %v", messageName, err) | ||||
| 				} | ||||
| 				if fieldSet["type_url"] { | ||||
| 					return p.errorf(anyRepeatedlyUnpacked, "type_url") | ||||
| 				} | ||||
| 				if fieldSet["value"] { | ||||
| 					return p.errorf(anyRepeatedlyUnpacked, "value") | ||||
| 				} | ||||
| 				sv.FieldByName("TypeUrl").SetString(extName) | ||||
| 				sv.FieldByName("Value").SetBytes(b) | ||||
| 				fieldSet["type_url"] = true | ||||
| 				fieldSet["value"] = true | ||||
| 				continue | ||||
| 			} | ||||
|  | ||||
| 			var desc *ExtensionDesc | ||||
| 			// This could be faster, but it's functional. | ||||
| 			// TODO: Do something smarter than a linear scan. | ||||
| 			for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { | ||||
| 				if d.Name == extName { | ||||
| 					desc = d | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			if desc == nil { | ||||
| 				return p.errorf("unrecognized extension %q", extName) | ||||
| 			} | ||||
|  | ||||
| 			props := &Properties{} | ||||
| 			props.Parse(desc.Tag) | ||||
|  | ||||
| 			typ := reflect.TypeOf(desc.ExtensionType) | ||||
| 			if err := p.checkForColon(props, typ); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 			rep := desc.repeated() | ||||
|  | ||||
| 			// Read the extension structure, and set it in | ||||
| 			// the value we're constructing. | ||||
| 			var ext reflect.Value | ||||
| 			if !rep { | ||||
| 				ext = reflect.New(typ).Elem() | ||||
| 			} else { | ||||
| 				ext = reflect.New(typ.Elem()).Elem() | ||||
| 			} | ||||
| 			if err := p.readAny(ext, props); err != nil { | ||||
| 				if _, ok := err.(*RequiredNotSetError); !ok { | ||||
| 					return err | ||||
| 				} | ||||
| 				reqFieldErr = err | ||||
| 			} | ||||
| 			ep := sv.Addr().Interface().(Message) | ||||
| 			if !rep { | ||||
| 				SetExtension(ep, desc, ext.Interface()) | ||||
| 			} else { | ||||
| 				old, err := GetExtension(ep, desc) | ||||
| 				var sl reflect.Value | ||||
| 				if err == nil { | ||||
| 					sl = reflect.ValueOf(old) // existing slice | ||||
| 				} else { | ||||
| 					sl = reflect.MakeSlice(typ, 0, 1) | ||||
| 				} | ||||
| 				sl = reflect.Append(sl, ext) | ||||
| 				SetExtension(ep, desc, sl.Interface()) | ||||
| 			} | ||||
| 			if err := p.consumeOptionalSeparator(); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// This is a normal, non-extension field. | ||||
| 		name := tok.value | ||||
| 		var dst reflect.Value | ||||
| 		fi, props, ok := structFieldByName(sprops, name) | ||||
| 		if ok { | ||||
| 			dst = sv.Field(fi) | ||||
| 		} else if oop, ok := sprops.OneofTypes[name]; ok { | ||||
| 			// It is a oneof. | ||||
| 			props = oop.Prop | ||||
| 			nv := reflect.New(oop.Type.Elem()) | ||||
| 			dst = nv.Elem().Field(0) | ||||
| 			sv.Field(oop.Field).Set(nv) | ||||
| 		} | ||||
| 		if !dst.IsValid() { | ||||
| 			return p.errorf("unknown field name %q in %v", name, st) | ||||
| 		} | ||||
|  | ||||
| 		if dst.Kind() == reflect.Map { | ||||
| 			// Consume any colon. | ||||
| 			if err := p.checkForColon(props, dst.Type()); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 			// Construct the map if it doesn't already exist. | ||||
| 			if dst.IsNil() { | ||||
| 				dst.Set(reflect.MakeMap(dst.Type())) | ||||
| 			} | ||||
| 			key := reflect.New(dst.Type().Key()).Elem() | ||||
| 			val := reflect.New(dst.Type().Elem()).Elem() | ||||
|  | ||||
| 			// The map entry should be this sequence of tokens: | ||||
| 			//	< key : KEY value : VALUE > | ||||
| 			// However, implementations may omit key or value, and technically | ||||
| 			// we should support them in any order.  See b/28924776 for a time | ||||
| 			// this went wrong. | ||||
|  | ||||
| 			tok := p.next() | ||||
| 			var terminator string | ||||
| 			switch tok.value { | ||||
| 			case "<": | ||||
| 				terminator = ">" | ||||
| 			case "{": | ||||
| 				terminator = "}" | ||||
| 			default: | ||||
| 				return p.errorf("expected '{' or '<', found %q", tok.value) | ||||
| 			} | ||||
| 			for { | ||||
| 				tok := p.next() | ||||
| 				if tok.err != nil { | ||||
| 					return tok.err | ||||
| 				} | ||||
| 				if tok.value == terminator { | ||||
| 					break | ||||
| 				} | ||||
| 				switch tok.value { | ||||
| 				case "key": | ||||
| 					if err := p.consumeToken(":"); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					if err := p.readAny(key, props.mkeyprop); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					if err := p.consumeOptionalSeparator(); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				case "value": | ||||
| 					if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					if err := p.readAny(val, props.mvalprop); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					if err := p.consumeOptionalSeparator(); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				default: | ||||
| 					p.back() | ||||
| 					return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			dst.SetMapIndex(key, val) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// Check that it's not already set if it's not a repeated field. | ||||
| 		if !props.Repeated && fieldSet[name] { | ||||
| 			return p.errorf("non-repeated field %q was repeated", name) | ||||
| 		} | ||||
|  | ||||
| 		if err := p.checkForColon(props, dst.Type()); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		// Parse into the field. | ||||
| 		fieldSet[name] = true | ||||
| 		if err := p.readAny(dst, props); err != nil { | ||||
| 			if _, ok := err.(*RequiredNotSetError); !ok { | ||||
| 				return err | ||||
| 			} | ||||
| 			reqFieldErr = err | ||||
| 		} | ||||
| 		if props.Required { | ||||
| 			reqCount-- | ||||
| 		} | ||||
|  | ||||
| 		if err := p.consumeOptionalSeparator(); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	if reqCount > 0 { | ||||
| 		return p.missingRequiredFieldError(sv) | ||||
| 	} | ||||
| 	return reqFieldErr | ||||
| } | ||||
|  | ||||
| // consumeExtName consumes extension name or expanded Any type URL and the | ||||
| // following ']'. It returns the name or URL consumed. | ||||
| func (p *textParser) consumeExtName() (string, error) { | ||||
| 	tok := p.next() | ||||
| 	if tok.err != nil { | ||||
| 		return "", tok.err | ||||
| 	} | ||||
|  | ||||
| 	// If extension name or type url is quoted, it's a single token. | ||||
| 	if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { | ||||
| 		name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) | ||||
| 		if err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
| 		return name, p.consumeToken("]") | ||||
| 	} | ||||
|  | ||||
| 	// Consume everything up to "]" | ||||
| 	var parts []string | ||||
| 	for tok.value != "]" { | ||||
| 		parts = append(parts, tok.value) | ||||
| 		tok = p.next() | ||||
| 		if tok.err != nil { | ||||
| 			return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) | ||||
| 		} | ||||
| 	} | ||||
| 	return strings.Join(parts, ""), nil | ||||
| } | ||||
|  | ||||
| // consumeOptionalSeparator consumes an optional semicolon or comma. | ||||
| // It is used in readStruct to provide backward compatibility. | ||||
| func (p *textParser) consumeOptionalSeparator() error { | ||||
| 	tok := p.next() | ||||
| 	if tok.err != nil { | ||||
| 		return tok.err | ||||
| 	} | ||||
| 	if tok.value != ";" && tok.value != "," { | ||||
| 		p.back() | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (p *textParser) readAny(v reflect.Value, props *Properties) error { | ||||
| 	tok := p.next() | ||||
| 	if tok.err != nil { | ||||
| 		return tok.err | ||||
| 	} | ||||
| 	if tok.value == "" { | ||||
| 		return p.errorf("unexpected EOF") | ||||
| 	} | ||||
|  | ||||
| 	switch fv := v; fv.Kind() { | ||||
| 	case reflect.Slice: | ||||
| 		at := v.Type() | ||||
| 		if at.Elem().Kind() == reflect.Uint8 { | ||||
| 			// Special case for []byte | ||||
| 			if tok.value[0] != '"' && tok.value[0] != '\'' { | ||||
| 				// Deliberately written out here, as the error after | ||||
| 				// this switch statement would write "invalid []byte: ...", | ||||
| 				// which is not as user-friendly. | ||||
| 				return p.errorf("invalid string: %v", tok.value) | ||||
| 			} | ||||
| 			bytes := []byte(tok.unquoted) | ||||
| 			fv.Set(reflect.ValueOf(bytes)) | ||||
| 			return nil | ||||
| 		} | ||||
| 		// Repeated field. | ||||
| 		if tok.value == "[" { | ||||
| 			// Repeated field with list notation, like [1,2,3]. | ||||
| 			for { | ||||
| 				fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) | ||||
| 				err := p.readAny(fv.Index(fv.Len()-1), props) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				tok := p.next() | ||||
| 				if tok.err != nil { | ||||
| 					return tok.err | ||||
| 				} | ||||
| 				if tok.value == "]" { | ||||
| 					break | ||||
| 				} | ||||
| 				if tok.value != "," { | ||||
| 					return p.errorf("Expected ']' or ',' found %q", tok.value) | ||||
| 				} | ||||
| 			} | ||||
| 			return nil | ||||
| 		} | ||||
| 		// One value of the repeated field. | ||||
| 		p.back() | ||||
| 		fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) | ||||
| 		return p.readAny(fv.Index(fv.Len()-1), props) | ||||
| 	case reflect.Bool: | ||||
| 		// true/1/t/True or false/f/0/False. | ||||
| 		switch tok.value { | ||||
| 		case "true", "1", "t", "True": | ||||
| 			fv.SetBool(true) | ||||
| 			return nil | ||||
| 		case "false", "0", "f", "False": | ||||
| 			fv.SetBool(false) | ||||
| 			return nil | ||||
| 		} | ||||
| 	case reflect.Float32, reflect.Float64: | ||||
| 		v := tok.value | ||||
| 		// Ignore 'f' for compatibility with output generated by C++, but don't | ||||
| 		// remove 'f' when the value is "-inf" or "inf". | ||||
| 		if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { | ||||
| 			v = v[:len(v)-1] | ||||
| 		} | ||||
| 		if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { | ||||
| 			fv.SetFloat(f) | ||||
| 			return nil | ||||
| 		} | ||||
| 	case reflect.Int32: | ||||
| 		if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { | ||||
| 			fv.SetInt(x) | ||||
| 			return nil | ||||
| 		} | ||||
|  | ||||
| 		if len(props.Enum) == 0 { | ||||
| 			break | ||||
| 		} | ||||
| 		m, ok := enumValueMaps[props.Enum] | ||||
| 		if !ok { | ||||
| 			break | ||||
| 		} | ||||
| 		x, ok := m[tok.value] | ||||
| 		if !ok { | ||||
| 			break | ||||
| 		} | ||||
| 		fv.SetInt(int64(x)) | ||||
| 		return nil | ||||
| 	case reflect.Int64: | ||||
| 		if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { | ||||
| 			fv.SetInt(x) | ||||
| 			return nil | ||||
| 		} | ||||
|  | ||||
| 	case reflect.Ptr: | ||||
| 		// A basic field (indirected through pointer), or a repeated message/group | ||||
| 		p.back() | ||||
| 		fv.Set(reflect.New(fv.Type().Elem())) | ||||
| 		return p.readAny(fv.Elem(), props) | ||||
| 	case reflect.String: | ||||
| 		if tok.value[0] == '"' || tok.value[0] == '\'' { | ||||
| 			fv.SetString(tok.unquoted) | ||||
| 			return nil | ||||
| 		} | ||||
| 	case reflect.Struct: | ||||
| 		var terminator string | ||||
| 		switch tok.value { | ||||
| 		case "{": | ||||
| 			terminator = "}" | ||||
| 		case "<": | ||||
| 			terminator = ">" | ||||
| 		default: | ||||
| 			return p.errorf("expected '{' or '<', found %q", tok.value) | ||||
| 		} | ||||
| 		// TODO: Handle nested messages which implement encoding.TextUnmarshaler. | ||||
| 		return p.readStruct(fv, terminator) | ||||
| 	case reflect.Uint32: | ||||
| 		if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { | ||||
| 			fv.SetUint(uint64(x)) | ||||
| 			return nil | ||||
| 		} | ||||
| 	case reflect.Uint64: | ||||
| 		if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { | ||||
| 			fv.SetUint(x) | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
| 	return p.errorf("invalid %v: %v", v.Type(), tok.value) | ||||
| } | ||||
|  | ||||
| // UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb | ||||
| // before starting to unmarshal, so any existing data in pb is always removed. | ||||
| // If a required field is not set and no other error occurs, | ||||
| // UnmarshalText returns *RequiredNotSetError. | ||||
| func UnmarshalText(s string, pb Message) error { | ||||
| 	if um, ok := pb.(encoding.TextUnmarshaler); ok { | ||||
| 		err := um.UnmarshalText([]byte(s)) | ||||
| 		return err | ||||
| 	} | ||||
| 	pb.Reset() | ||||
| 	v := reflect.ValueOf(pb) | ||||
| 	if pe := newTextParser(s).readStruct(v.Elem(), ""); pe != nil { | ||||
| 		return pe | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										662
									
								
								vendor/github.com/golang/protobuf/proto/text_parser_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										662
									
								
								vendor/github.com/golang/protobuf/proto/text_parser_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,662 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto_test | ||||
|  | ||||
| import ( | ||||
| 	"math" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
|  | ||||
| 	. "github.com/golang/protobuf/proto" | ||||
| 	proto3pb "github.com/golang/protobuf/proto/proto3_proto" | ||||
| 	. "github.com/golang/protobuf/proto/testdata" | ||||
| ) | ||||
|  | ||||
| type UnmarshalTextTest struct { | ||||
| 	in  string | ||||
| 	err string // if "", no error expected | ||||
| 	out *MyMessage | ||||
| } | ||||
|  | ||||
| func buildExtStructTest(text string) UnmarshalTextTest { | ||||
| 	msg := &MyMessage{ | ||||
| 		Count: Int32(42), | ||||
| 	} | ||||
| 	SetExtension(msg, E_Ext_More, &Ext{ | ||||
| 		Data: String("Hello, world!"), | ||||
| 	}) | ||||
| 	return UnmarshalTextTest{in: text, out: msg} | ||||
| } | ||||
|  | ||||
| func buildExtDataTest(text string) UnmarshalTextTest { | ||||
| 	msg := &MyMessage{ | ||||
| 		Count: Int32(42), | ||||
| 	} | ||||
| 	SetExtension(msg, E_Ext_Text, String("Hello, world!")) | ||||
| 	SetExtension(msg, E_Ext_Number, Int32(1729)) | ||||
| 	return UnmarshalTextTest{in: text, out: msg} | ||||
| } | ||||
|  | ||||
| func buildExtRepStringTest(text string) UnmarshalTextTest { | ||||
| 	msg := &MyMessage{ | ||||
| 		Count: Int32(42), | ||||
| 	} | ||||
| 	if err := SetExtension(msg, E_Greeting, []string{"bula", "hola"}); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return UnmarshalTextTest{in: text, out: msg} | ||||
| } | ||||
|  | ||||
| var unMarshalTextTests = []UnmarshalTextTest{ | ||||
| 	// Basic | ||||
| 	{ | ||||
| 		in: " count:42\n  name:\"Dave\" ", | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Name:  String("Dave"), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Empty quoted string | ||||
| 	{ | ||||
| 		in: `count:42 name:""`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Name:  String(""), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Quoted string concatenation with double quotes | ||||
| 	{ | ||||
| 		in: `count:42 name: "My name is "` + "\n" + `"elsewhere"`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Name:  String("My name is elsewhere"), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Quoted string concatenation with single quotes | ||||
| 	{ | ||||
| 		in: "count:42 name: 'My name is '\n'elsewhere'", | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Name:  String("My name is elsewhere"), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Quoted string concatenations with mixed quotes | ||||
| 	{ | ||||
| 		in: "count:42 name: 'My name is '\n\"elsewhere\"", | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Name:  String("My name is elsewhere"), | ||||
| 		}, | ||||
| 	}, | ||||
| 	{ | ||||
| 		in: "count:42 name: \"My name is \"\n'elsewhere'", | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Name:  String("My name is elsewhere"), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Quoted string with escaped apostrophe | ||||
| 	{ | ||||
| 		in: `count:42 name: "HOLIDAY - New Year\'s Day"`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Name:  String("HOLIDAY - New Year's Day"), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Quoted string with single quote | ||||
| 	{ | ||||
| 		in: `count:42 name: 'Roger "The Ramster" Ramjet'`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Name:  String(`Roger "The Ramster" Ramjet`), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Quoted string with all the accepted special characters from the C++ test | ||||
| 	{ | ||||
| 		in: `count:42 name: ` + "\"\\\"A string with \\' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and  multiple   spaces\"", | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Name:  String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and  multiple   spaces"), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Quoted string with quoted backslash | ||||
| 	{ | ||||
| 		in: `count:42 name: "\\'xyz"`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Name:  String(`\'xyz`), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Quoted string with UTF-8 bytes. | ||||
| 	{ | ||||
| 		in: "count:42 name: '\303\277\302\201\xAB'", | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Name:  String("\303\277\302\201\xAB"), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Bad quoted string | ||||
| 	{ | ||||
| 		in:  `inner: < host: "\0" >` + "\n", | ||||
| 		err: `line 1.15: invalid quoted string "\0": \0 requires 2 following digits`, | ||||
| 	}, | ||||
|  | ||||
| 	// Number too large for int64 | ||||
| 	{ | ||||
| 		in:  "count: 1 others { key: 123456789012345678901 }", | ||||
| 		err: "line 1.23: invalid int64: 123456789012345678901", | ||||
| 	}, | ||||
|  | ||||
| 	// Number too large for int32 | ||||
| 	{ | ||||
| 		in:  "count: 1234567890123", | ||||
| 		err: "line 1.7: invalid int32: 1234567890123", | ||||
| 	}, | ||||
|  | ||||
| 	// Number in hexadecimal | ||||
| 	{ | ||||
| 		in: "count: 0x2beef", | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(0x2beef), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Number in octal | ||||
| 	{ | ||||
| 		in: "count: 024601", | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(024601), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Floating point number with "f" suffix | ||||
| 	{ | ||||
| 		in: "count: 4 others:< weight: 17.0f >", | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(4), | ||||
| 			Others: []*OtherMessage{ | ||||
| 				{ | ||||
| 					Weight: Float32(17), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Floating point positive infinity | ||||
| 	{ | ||||
| 		in: "count: 4 bigfloat: inf", | ||||
| 		out: &MyMessage{ | ||||
| 			Count:    Int32(4), | ||||
| 			Bigfloat: Float64(math.Inf(1)), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Floating point negative infinity | ||||
| 	{ | ||||
| 		in: "count: 4 bigfloat: -inf", | ||||
| 		out: &MyMessage{ | ||||
| 			Count:    Int32(4), | ||||
| 			Bigfloat: Float64(math.Inf(-1)), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Number too large for float32 | ||||
| 	{ | ||||
| 		in:  "others:< weight: 12345678901234567890123456789012345678901234567890 >", | ||||
| 		err: "line 1.17: invalid float32: 12345678901234567890123456789012345678901234567890", | ||||
| 	}, | ||||
|  | ||||
| 	// Number posing as a quoted string | ||||
| 	{ | ||||
| 		in:  `inner: < host: 12 >` + "\n", | ||||
| 		err: `line 1.15: invalid string: 12`, | ||||
| 	}, | ||||
|  | ||||
| 	// Quoted string posing as int32 | ||||
| 	{ | ||||
| 		in:  `count: "12"`, | ||||
| 		err: `line 1.7: invalid int32: "12"`, | ||||
| 	}, | ||||
|  | ||||
| 	// Quoted string posing a float32 | ||||
| 	{ | ||||
| 		in:  `others:< weight: "17.4" >`, | ||||
| 		err: `line 1.17: invalid float32: "17.4"`, | ||||
| 	}, | ||||
|  | ||||
| 	// Enum | ||||
| 	{ | ||||
| 		in: `count:42 bikeshed: BLUE`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count:    Int32(42), | ||||
| 			Bikeshed: MyMessage_BLUE.Enum(), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Repeated field | ||||
| 	{ | ||||
| 		in: `count:42 pet: "horsey" pet:"bunny"`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Pet:   []string{"horsey", "bunny"}, | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Repeated field with list notation | ||||
| 	{ | ||||
| 		in: `count:42 pet: ["horsey", "bunny"]`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Pet:   []string{"horsey", "bunny"}, | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Repeated message with/without colon and <>/{} | ||||
| 	{ | ||||
| 		in: `count:42 others:{} others{} others:<> others:{}`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Others: []*OtherMessage{ | ||||
| 				{}, | ||||
| 				{}, | ||||
| 				{}, | ||||
| 				{}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Missing colon for inner message | ||||
| 	{ | ||||
| 		in: `count:42 inner < host: "cauchy.syd" >`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Inner: &InnerMessage{ | ||||
| 				Host: String("cauchy.syd"), | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Missing colon for string field | ||||
| 	{ | ||||
| 		in:  `name "Dave"`, | ||||
| 		err: `line 1.5: expected ':', found "\"Dave\""`, | ||||
| 	}, | ||||
|  | ||||
| 	// Missing colon for int32 field | ||||
| 	{ | ||||
| 		in:  `count 42`, | ||||
| 		err: `line 1.6: expected ':', found "42"`, | ||||
| 	}, | ||||
|  | ||||
| 	// Missing required field | ||||
| 	{ | ||||
| 		in:  `name: "Pawel"`, | ||||
| 		err: `proto: required field "testdata.MyMessage.count" not set`, | ||||
| 		out: &MyMessage{ | ||||
| 			Name: String("Pawel"), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Missing required field in a required submessage | ||||
| 	{ | ||||
| 		in:  `count: 42 we_must_go_deeper < leo_finally_won_an_oscar <> >`, | ||||
| 		err: `proto: required field "testdata.InnerMessage.host" not set`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count:          Int32(42), | ||||
| 			WeMustGoDeeper: &RequiredInnerMessage{LeoFinallyWonAnOscar: &InnerMessage{}}, | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Repeated non-repeated field | ||||
| 	{ | ||||
| 		in:  `name: "Rob" name: "Russ"`, | ||||
| 		err: `line 1.12: non-repeated field "name" was repeated`, | ||||
| 	}, | ||||
|  | ||||
| 	// Group | ||||
| 	{ | ||||
| 		in: `count: 17 SomeGroup { group_field: 12 }`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(17), | ||||
| 			Somegroup: &MyMessage_SomeGroup{ | ||||
| 				GroupField: Int32(12), | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Semicolon between fields | ||||
| 	{ | ||||
| 		in: `count:3;name:"Calvin"`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(3), | ||||
| 			Name:  String("Calvin"), | ||||
| 		}, | ||||
| 	}, | ||||
| 	// Comma between fields | ||||
| 	{ | ||||
| 		in: `count:4,name:"Ezekiel"`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(4), | ||||
| 			Name:  String("Ezekiel"), | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Boolean false | ||||
| 	{ | ||||
| 		in: `count:42 inner { host: "example.com" connected: false }`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Inner: &InnerMessage{ | ||||
| 				Host:      String("example.com"), | ||||
| 				Connected: Bool(false), | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	// Boolean true | ||||
| 	{ | ||||
| 		in: `count:42 inner { host: "example.com" connected: true }`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Inner: &InnerMessage{ | ||||
| 				Host:      String("example.com"), | ||||
| 				Connected: Bool(true), | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	// Boolean 0 | ||||
| 	{ | ||||
| 		in: `count:42 inner { host: "example.com" connected: 0 }`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Inner: &InnerMessage{ | ||||
| 				Host:      String("example.com"), | ||||
| 				Connected: Bool(false), | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	// Boolean 1 | ||||
| 	{ | ||||
| 		in: `count:42 inner { host: "example.com" connected: 1 }`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Inner: &InnerMessage{ | ||||
| 				Host:      String("example.com"), | ||||
| 				Connected: Bool(true), | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	// Boolean f | ||||
| 	{ | ||||
| 		in: `count:42 inner { host: "example.com" connected: f }`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Inner: &InnerMessage{ | ||||
| 				Host:      String("example.com"), | ||||
| 				Connected: Bool(false), | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	// Boolean t | ||||
| 	{ | ||||
| 		in: `count:42 inner { host: "example.com" connected: t }`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Inner: &InnerMessage{ | ||||
| 				Host:      String("example.com"), | ||||
| 				Connected: Bool(true), | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	// Boolean False | ||||
| 	{ | ||||
| 		in: `count:42 inner { host: "example.com" connected: False }`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Inner: &InnerMessage{ | ||||
| 				Host:      String("example.com"), | ||||
| 				Connected: Bool(false), | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
| 	// Boolean True | ||||
| 	{ | ||||
| 		in: `count:42 inner { host: "example.com" connected: True }`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Inner: &InnerMessage{ | ||||
| 				Host:      String("example.com"), | ||||
| 				Connected: Bool(true), | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	// Extension | ||||
| 	buildExtStructTest(`count: 42 [testdata.Ext.more]:<data:"Hello, world!" >`), | ||||
| 	buildExtStructTest(`count: 42 [testdata.Ext.more] {data:"Hello, world!"}`), | ||||
| 	buildExtDataTest(`count: 42 [testdata.Ext.text]:"Hello, world!" [testdata.Ext.number]:1729`), | ||||
| 	buildExtRepStringTest(`count: 42 [testdata.greeting]:"bula" [testdata.greeting]:"hola"`), | ||||
|  | ||||
| 	// Big all-in-one | ||||
| 	{ | ||||
| 		in: "count:42  # Meaning\n" + | ||||
| 			`name:"Dave" ` + | ||||
| 			`quote:"\"I didn't want to go.\"" ` + | ||||
| 			`pet:"bunny" ` + | ||||
| 			`pet:"kitty" ` + | ||||
| 			`pet:"horsey" ` + | ||||
| 			`inner:<` + | ||||
| 			`  host:"footrest.syd" ` + | ||||
| 			`  port:7001 ` + | ||||
| 			`  connected:true ` + | ||||
| 			`> ` + | ||||
| 			`others:<` + | ||||
| 			`  key:3735928559 ` + | ||||
| 			`  value:"\x01A\a\f" ` + | ||||
| 			`> ` + | ||||
| 			`others:<` + | ||||
| 			"  weight:58.9  # Atomic weight of Co\n" + | ||||
| 			`  inner:<` + | ||||
| 			`    host:"lesha.mtv" ` + | ||||
| 			`    port:8002 ` + | ||||
| 			`  >` + | ||||
| 			`>`, | ||||
| 		out: &MyMessage{ | ||||
| 			Count: Int32(42), | ||||
| 			Name:  String("Dave"), | ||||
| 			Quote: String(`"I didn't want to go."`), | ||||
| 			Pet:   []string{"bunny", "kitty", "horsey"}, | ||||
| 			Inner: &InnerMessage{ | ||||
| 				Host:      String("footrest.syd"), | ||||
| 				Port:      Int32(7001), | ||||
| 				Connected: Bool(true), | ||||
| 			}, | ||||
| 			Others: []*OtherMessage{ | ||||
| 				{ | ||||
| 					Key:   Int64(3735928559), | ||||
| 					Value: []byte{0x1, 'A', '\a', '\f'}, | ||||
| 				}, | ||||
| 				{ | ||||
| 					Weight: Float32(58.9), | ||||
| 					Inner: &InnerMessage{ | ||||
| 						Host: String("lesha.mtv"), | ||||
| 						Port: Int32(8002), | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| func TestUnmarshalText(t *testing.T) { | ||||
| 	for i, test := range unMarshalTextTests { | ||||
| 		pb := new(MyMessage) | ||||
| 		err := UnmarshalText(test.in, pb) | ||||
| 		if test.err == "" { | ||||
| 			// We don't expect failure. | ||||
| 			if err != nil { | ||||
| 				t.Errorf("Test %d: Unexpected error: %v", i, err) | ||||
| 			} else if !reflect.DeepEqual(pb, test.out) { | ||||
| 				t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", | ||||
| 					i, pb, test.out) | ||||
| 			} | ||||
| 		} else { | ||||
| 			// We do expect failure. | ||||
| 			if err == nil { | ||||
| 				t.Errorf("Test %d: Didn't get expected error: %v", i, test.err) | ||||
| 			} else if err.Error() != test.err { | ||||
| 				t.Errorf("Test %d: Incorrect error.\nHave: %v\nWant: %v", | ||||
| 					i, err.Error(), test.err) | ||||
| 			} else if _, ok := err.(*RequiredNotSetError); ok && test.out != nil && !reflect.DeepEqual(pb, test.out) { | ||||
| 				t.Errorf("Test %d: Incorrect populated \nHave: %v\nWant: %v", | ||||
| 					i, pb, test.out) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestUnmarshalTextCustomMessage(t *testing.T) { | ||||
| 	msg := &textMessage{} | ||||
| 	if err := UnmarshalText("custom", msg); err != nil { | ||||
| 		t.Errorf("Unexpected error from custom unmarshal: %v", err) | ||||
| 	} | ||||
| 	if UnmarshalText("not custom", msg) == nil { | ||||
| 		t.Errorf("Didn't get expected error from custom unmarshal") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Regression test; this caused a panic. | ||||
| func TestRepeatedEnum(t *testing.T) { | ||||
| 	pb := new(RepeatedEnum) | ||||
| 	if err := UnmarshalText("color: RED", pb); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	exp := &RepeatedEnum{ | ||||
| 		Color: []RepeatedEnum_Color{RepeatedEnum_RED}, | ||||
| 	} | ||||
| 	if !Equal(pb, exp) { | ||||
| 		t.Errorf("Incorrect populated \nHave: %v\nWant: %v", pb, exp) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestProto3TextParsing(t *testing.T) { | ||||
| 	m := new(proto3pb.Message) | ||||
| 	const in = `name: "Wallace" true_scotsman: true` | ||||
| 	want := &proto3pb.Message{ | ||||
| 		Name:         "Wallace", | ||||
| 		TrueScotsman: true, | ||||
| 	} | ||||
| 	if err := UnmarshalText(in, m); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	if !Equal(m, want) { | ||||
| 		t.Errorf("\n got %v\nwant %v", m, want) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestMapParsing(t *testing.T) { | ||||
| 	m := new(MessageWithMap) | ||||
| 	const in = `name_mapping:<key:1234 value:"Feist"> name_mapping:<key:1 value:"Beatles">` + | ||||
| 		`msg_mapping:<key:-4, value:<f: 2.0>,>` + // separating commas are okay | ||||
| 		`msg_mapping<key:-2 value<f: 4.0>>` + // no colon after "value" | ||||
| 		`msg_mapping:<value:<f: 5.0>>` + // omitted key | ||||
| 		`msg_mapping:<key:1>` + // omitted value | ||||
| 		`byte_mapping:<key:true value:"so be it">` + | ||||
| 		`byte_mapping:<>` // omitted key and value | ||||
| 	want := &MessageWithMap{ | ||||
| 		NameMapping: map[int32]string{ | ||||
| 			1:    "Beatles", | ||||
| 			1234: "Feist", | ||||
| 		}, | ||||
| 		MsgMapping: map[int64]*FloatingPoint{ | ||||
| 			-4: {F: Float64(2.0)}, | ||||
| 			-2: {F: Float64(4.0)}, | ||||
| 			0:  {F: Float64(5.0)}, | ||||
| 			1:  nil, | ||||
| 		}, | ||||
| 		ByteMapping: map[bool][]byte{ | ||||
| 			false: nil, | ||||
| 			true:  []byte("so be it"), | ||||
| 		}, | ||||
| 	} | ||||
| 	if err := UnmarshalText(in, m); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	if !Equal(m, want) { | ||||
| 		t.Errorf("\n got %v\nwant %v", m, want) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestOneofParsing(t *testing.T) { | ||||
| 	const in = `name:"Shrek"` | ||||
| 	m := new(Communique) | ||||
| 	want := &Communique{Union: &Communique_Name{"Shrek"}} | ||||
| 	if err := UnmarshalText(in, m); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	if !Equal(m, want) { | ||||
| 		t.Errorf("\n got %v\nwant %v", m, want) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var benchInput string | ||||
|  | ||||
| func init() { | ||||
| 	benchInput = "count: 4\n" | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		benchInput += "pet: \"fido\"\n" | ||||
| 	} | ||||
|  | ||||
| 	// Check it is valid input. | ||||
| 	pb := new(MyMessage) | ||||
| 	err := UnmarshalText(benchInput, pb) | ||||
| 	if err != nil { | ||||
| 		panic("Bad benchmark input: " + err.Error()) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkUnmarshalText(b *testing.B) { | ||||
| 	pb := new(MyMessage) | ||||
| 	for i := 0; i < b.N; i++ { | ||||
| 		UnmarshalText(benchInput, pb) | ||||
| 	} | ||||
| 	b.SetBytes(int64(len(benchInput))) | ||||
| } | ||||
							
								
								
									
										474
									
								
								vendor/github.com/golang/protobuf/proto/text_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										474
									
								
								vendor/github.com/golang/protobuf/proto/text_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,474 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package proto_test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"errors" | ||||
| 	"io/ioutil" | ||||
| 	"math" | ||||
| 	"strings" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
|  | ||||
| 	proto3pb "github.com/golang/protobuf/proto/proto3_proto" | ||||
| 	pb "github.com/golang/protobuf/proto/testdata" | ||||
| ) | ||||
|  | ||||
| // textMessage implements the methods that allow it to marshal and unmarshal | ||||
| // itself as text. | ||||
| type textMessage struct { | ||||
| } | ||||
|  | ||||
| func (*textMessage) MarshalText() ([]byte, error) { | ||||
| 	return []byte("custom"), nil | ||||
| } | ||||
|  | ||||
| func (*textMessage) UnmarshalText(bytes []byte) error { | ||||
| 	if string(bytes) != "custom" { | ||||
| 		return errors.New("expected 'custom'") | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (*textMessage) Reset()         {} | ||||
| func (*textMessage) String() string { return "" } | ||||
| func (*textMessage) ProtoMessage()  {} | ||||
|  | ||||
| func newTestMessage() *pb.MyMessage { | ||||
| 	msg := &pb.MyMessage{ | ||||
| 		Count: proto.Int32(42), | ||||
| 		Name:  proto.String("Dave"), | ||||
| 		Quote: proto.String(`"I didn't want to go."`), | ||||
| 		Pet:   []string{"bunny", "kitty", "horsey"}, | ||||
| 		Inner: &pb.InnerMessage{ | ||||
| 			Host:      proto.String("footrest.syd"), | ||||
| 			Port:      proto.Int32(7001), | ||||
| 			Connected: proto.Bool(true), | ||||
| 		}, | ||||
| 		Others: []*pb.OtherMessage{ | ||||
| 			{ | ||||
| 				Key:   proto.Int64(0xdeadbeef), | ||||
| 				Value: []byte{1, 65, 7, 12}, | ||||
| 			}, | ||||
| 			{ | ||||
| 				Weight: proto.Float32(6.022), | ||||
| 				Inner: &pb.InnerMessage{ | ||||
| 					Host: proto.String("lesha.mtv"), | ||||
| 					Port: proto.Int32(8002), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		Bikeshed: pb.MyMessage_BLUE.Enum(), | ||||
| 		Somegroup: &pb.MyMessage_SomeGroup{ | ||||
| 			GroupField: proto.Int32(8), | ||||
| 		}, | ||||
| 		// One normally wouldn't do this. | ||||
| 		// This is an undeclared tag 13, as a varint (wire type 0) with value 4. | ||||
| 		XXX_unrecognized: []byte{13<<3 | 0, 4}, | ||||
| 	} | ||||
| 	ext := &pb.Ext{ | ||||
| 		Data: proto.String("Big gobs for big rats"), | ||||
| 	} | ||||
| 	if err := proto.SetExtension(msg, pb.E_Ext_More, ext); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	greetings := []string{"adg", "easy", "cow"} | ||||
| 	if err := proto.SetExtension(msg, pb.E_Greeting, greetings); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | ||||
| 	// Add an unknown extension. We marshal a pb.Ext, and fake the ID. | ||||
| 	b, err := proto.Marshal(&pb.Ext{Data: proto.String("3G skiing")}) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	b = append(proto.EncodeVarint(201<<3|proto.WireBytes), b...) | ||||
| 	proto.SetRawExtension(msg, 201, b) | ||||
|  | ||||
| 	// Extensions can be plain fields, too, so let's test that. | ||||
| 	b = append(proto.EncodeVarint(202<<3|proto.WireVarint), 19) | ||||
| 	proto.SetRawExtension(msg, 202, b) | ||||
|  | ||||
| 	return msg | ||||
| } | ||||
|  | ||||
| const text = `count: 42 | ||||
| name: "Dave" | ||||
| quote: "\"I didn't want to go.\"" | ||||
| pet: "bunny" | ||||
| pet: "kitty" | ||||
| pet: "horsey" | ||||
| inner: < | ||||
|   host: "footrest.syd" | ||||
|   port: 7001 | ||||
|   connected: true | ||||
| > | ||||
| others: < | ||||
|   key: 3735928559 | ||||
|   value: "\001A\007\014" | ||||
| > | ||||
| others: < | ||||
|   weight: 6.022 | ||||
|   inner: < | ||||
|     host: "lesha.mtv" | ||||
|     port: 8002 | ||||
|   > | ||||
| > | ||||
| bikeshed: BLUE | ||||
| SomeGroup { | ||||
|   group_field: 8 | ||||
| } | ||||
| /* 2 unknown bytes */ | ||||
| 13: 4 | ||||
| [testdata.Ext.more]: < | ||||
|   data: "Big gobs for big rats" | ||||
| > | ||||
| [testdata.greeting]: "adg" | ||||
| [testdata.greeting]: "easy" | ||||
| [testdata.greeting]: "cow" | ||||
| /* 13 unknown bytes */ | ||||
| 201: "\t3G skiing" | ||||
| /* 3 unknown bytes */ | ||||
| 202: 19 | ||||
| ` | ||||
|  | ||||
| func TestMarshalText(t *testing.T) { | ||||
| 	buf := new(bytes.Buffer) | ||||
| 	if err := proto.MarshalText(buf, newTestMessage()); err != nil { | ||||
| 		t.Fatalf("proto.MarshalText: %v", err) | ||||
| 	} | ||||
| 	s := buf.String() | ||||
| 	if s != text { | ||||
| 		t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, text) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestMarshalTextCustomMessage(t *testing.T) { | ||||
| 	buf := new(bytes.Buffer) | ||||
| 	if err := proto.MarshalText(buf, &textMessage{}); err != nil { | ||||
| 		t.Fatalf("proto.MarshalText: %v", err) | ||||
| 	} | ||||
| 	s := buf.String() | ||||
| 	if s != "custom" { | ||||
| 		t.Errorf("Got %q, expected %q", s, "custom") | ||||
| 	} | ||||
| } | ||||
| func TestMarshalTextNil(t *testing.T) { | ||||
| 	want := "<nil>" | ||||
| 	tests := []proto.Message{nil, (*pb.MyMessage)(nil)} | ||||
| 	for i, test := range tests { | ||||
| 		buf := new(bytes.Buffer) | ||||
| 		if err := proto.MarshalText(buf, test); err != nil { | ||||
| 			t.Fatal(err) | ||||
| 		} | ||||
| 		if got := buf.String(); got != want { | ||||
| 			t.Errorf("%d: got %q want %q", i, got, want) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestMarshalTextUnknownEnum(t *testing.T) { | ||||
| 	// The Color enum only specifies values 0-2. | ||||
| 	m := &pb.MyMessage{Bikeshed: pb.MyMessage_Color(3).Enum()} | ||||
| 	got := m.String() | ||||
| 	const want = `bikeshed:3 ` | ||||
| 	if got != want { | ||||
| 		t.Errorf("\n got %q\nwant %q", got, want) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestTextOneof(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		m    proto.Message | ||||
| 		want string | ||||
| 	}{ | ||||
| 		// zero message | ||||
| 		{&pb.Communique{}, ``}, | ||||
| 		// scalar field | ||||
| 		{&pb.Communique{Union: &pb.Communique_Number{4}}, `number:4`}, | ||||
| 		// message field | ||||
| 		{&pb.Communique{Union: &pb.Communique_Msg{ | ||||
| 			&pb.Strings{StringField: proto.String("why hello!")}, | ||||
| 		}}, `msg:<string_field:"why hello!" >`}, | ||||
| 		// bad oneof (should not panic) | ||||
| 		{&pb.Communique{Union: &pb.Communique_Msg{nil}}, `msg:/* nil */`}, | ||||
| 	} | ||||
| 	for _, test := range tests { | ||||
| 		got := strings.TrimSpace(test.m.String()) | ||||
| 		if got != test.want { | ||||
| 			t.Errorf("\n got %s\nwant %s", got, test.want) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkMarshalTextBuffered(b *testing.B) { | ||||
| 	buf := new(bytes.Buffer) | ||||
| 	m := newTestMessage() | ||||
| 	for i := 0; i < b.N; i++ { | ||||
| 		buf.Reset() | ||||
| 		proto.MarshalText(buf, m) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkMarshalTextUnbuffered(b *testing.B) { | ||||
| 	w := ioutil.Discard | ||||
| 	m := newTestMessage() | ||||
| 	for i := 0; i < b.N; i++ { | ||||
| 		proto.MarshalText(w, m) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func compact(src string) string { | ||||
| 	// s/[ \n]+/ /g; s/ $//; | ||||
| 	dst := make([]byte, len(src)) | ||||
| 	space, comment := false, false | ||||
| 	j := 0 | ||||
| 	for i := 0; i < len(src); i++ { | ||||
| 		if strings.HasPrefix(src[i:], "/*") { | ||||
| 			comment = true | ||||
| 			i++ | ||||
| 			continue | ||||
| 		} | ||||
| 		if comment && strings.HasPrefix(src[i:], "*/") { | ||||
| 			comment = false | ||||
| 			i++ | ||||
| 			continue | ||||
| 		} | ||||
| 		if comment { | ||||
| 			continue | ||||
| 		} | ||||
| 		c := src[i] | ||||
| 		if c == ' ' || c == '\n' { | ||||
| 			space = true | ||||
| 			continue | ||||
| 		} | ||||
| 		if j > 0 && (dst[j-1] == ':' || dst[j-1] == '<' || dst[j-1] == '{') { | ||||
| 			space = false | ||||
| 		} | ||||
| 		if c == '{' { | ||||
| 			space = false | ||||
| 		} | ||||
| 		if space { | ||||
| 			dst[j] = ' ' | ||||
| 			j++ | ||||
| 			space = false | ||||
| 		} | ||||
| 		dst[j] = c | ||||
| 		j++ | ||||
| 	} | ||||
| 	if space { | ||||
| 		dst[j] = ' ' | ||||
| 		j++ | ||||
| 	} | ||||
| 	return string(dst[0:j]) | ||||
| } | ||||
|  | ||||
| var compactText = compact(text) | ||||
|  | ||||
| func TestCompactText(t *testing.T) { | ||||
| 	s := proto.CompactTextString(newTestMessage()) | ||||
| 	if s != compactText { | ||||
| 		t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v\n===\n", s, compactText) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestStringEscaping(t *testing.T) { | ||||
| 	testCases := []struct { | ||||
| 		in  *pb.Strings | ||||
| 		out string | ||||
| 	}{ | ||||
| 		{ | ||||
| 			// Test data from C++ test (TextFormatTest.StringEscape). | ||||
| 			// Single divergence: we don't escape apostrophes. | ||||
| 			&pb.Strings{StringField: proto.String("\"A string with ' characters \n and \r newlines and \t tabs and \001 slashes \\ and  multiple   spaces")}, | ||||
| 			"string_field: \"\\\"A string with ' characters \\n and \\r newlines and \\t tabs and \\001 slashes \\\\ and  multiple   spaces\"\n", | ||||
| 		}, | ||||
| 		{ | ||||
| 			// Test data from the same C++ test. | ||||
| 			&pb.Strings{StringField: proto.String("\350\260\267\346\255\214")}, | ||||
| 			"string_field: \"\\350\\260\\267\\346\\255\\214\"\n", | ||||
| 		}, | ||||
| 		{ | ||||
| 			// Some UTF-8. | ||||
| 			&pb.Strings{StringField: proto.String("\x00\x01\xff\x81")}, | ||||
| 			`string_field: "\000\001\377\201"` + "\n", | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	for i, tc := range testCases { | ||||
| 		var buf bytes.Buffer | ||||
| 		if err := proto.MarshalText(&buf, tc.in); err != nil { | ||||
| 			t.Errorf("proto.MarsalText: %v", err) | ||||
| 			continue | ||||
| 		} | ||||
| 		s := buf.String() | ||||
| 		if s != tc.out { | ||||
| 			t.Errorf("#%d: Got:\n%s\nExpected:\n%s\n", i, s, tc.out) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// Check round-trip. | ||||
| 		pb := new(pb.Strings) | ||||
| 		if err := proto.UnmarshalText(s, pb); err != nil { | ||||
| 			t.Errorf("#%d: UnmarshalText: %v", i, err) | ||||
| 			continue | ||||
| 		} | ||||
| 		if !proto.Equal(pb, tc.in) { | ||||
| 			t.Errorf("#%d: Round-trip failed:\nstart: %v\n  end: %v", i, tc.in, pb) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // A limitedWriter accepts some output before it fails. | ||||
| // This is a proxy for something like a nearly-full or imminently-failing disk, | ||||
| // or a network connection that is about to die. | ||||
| type limitedWriter struct { | ||||
| 	b     bytes.Buffer | ||||
| 	limit int | ||||
| } | ||||
|  | ||||
| var outOfSpace = errors.New("proto: insufficient space") | ||||
|  | ||||
| func (w *limitedWriter) Write(p []byte) (n int, err error) { | ||||
| 	var avail = w.limit - w.b.Len() | ||||
| 	if avail <= 0 { | ||||
| 		return 0, outOfSpace | ||||
| 	} | ||||
| 	if len(p) <= avail { | ||||
| 		return w.b.Write(p) | ||||
| 	} | ||||
| 	n, _ = w.b.Write(p[:avail]) | ||||
| 	return n, outOfSpace | ||||
| } | ||||
|  | ||||
| func TestMarshalTextFailing(t *testing.T) { | ||||
| 	// Try lots of different sizes to exercise more error code-paths. | ||||
| 	for lim := 0; lim < len(text); lim++ { | ||||
| 		buf := new(limitedWriter) | ||||
| 		buf.limit = lim | ||||
| 		err := proto.MarshalText(buf, newTestMessage()) | ||||
| 		// We expect a certain error, but also some partial results in the buffer. | ||||
| 		if err != outOfSpace { | ||||
| 			t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", err, outOfSpace) | ||||
| 		} | ||||
| 		s := buf.b.String() | ||||
| 		x := text[:buf.limit] | ||||
| 		if s != x { | ||||
| 			t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, x) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestFloats(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		f    float64 | ||||
| 		want string | ||||
| 	}{ | ||||
| 		{0, "0"}, | ||||
| 		{4.7, "4.7"}, | ||||
| 		{math.Inf(1), "inf"}, | ||||
| 		{math.Inf(-1), "-inf"}, | ||||
| 		{math.NaN(), "nan"}, | ||||
| 	} | ||||
| 	for _, test := range tests { | ||||
| 		msg := &pb.FloatingPoint{F: &test.f} | ||||
| 		got := strings.TrimSpace(msg.String()) | ||||
| 		want := `f:` + test.want | ||||
| 		if got != want { | ||||
| 			t.Errorf("f=%f: got %q, want %q", test.f, got, want) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestRepeatedNilText(t *testing.T) { | ||||
| 	m := &pb.MessageList{ | ||||
| 		Message: []*pb.MessageList_Message{ | ||||
| 			nil, | ||||
| 			&pb.MessageList_Message{ | ||||
| 				Name: proto.String("Horse"), | ||||
| 			}, | ||||
| 			nil, | ||||
| 		}, | ||||
| 	} | ||||
| 	want := `Message <nil> | ||||
| Message { | ||||
|   name: "Horse" | ||||
| } | ||||
| Message <nil> | ||||
| ` | ||||
| 	if s := proto.MarshalTextString(m); s != want { | ||||
| 		t.Errorf(" got: %s\nwant: %s", s, want) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestProto3Text(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		m    proto.Message | ||||
| 		want string | ||||
| 	}{ | ||||
| 		// zero message | ||||
| 		{&proto3pb.Message{}, ``}, | ||||
| 		// zero message except for an empty byte slice | ||||
| 		{&proto3pb.Message{Data: []byte{}}, ``}, | ||||
| 		// trivial case | ||||
| 		{&proto3pb.Message{Name: "Rob", HeightInCm: 175}, `name:"Rob" height_in_cm:175`}, | ||||
| 		// empty map | ||||
| 		{&pb.MessageWithMap{}, ``}, | ||||
| 		// non-empty map; map format is the same as a repeated struct, | ||||
| 		// and they are sorted by key (numerically for numeric keys). | ||||
| 		{ | ||||
| 			&pb.MessageWithMap{NameMapping: map[int32]string{ | ||||
| 				-1:      "Negatory", | ||||
| 				7:       "Lucky", | ||||
| 				1234:    "Feist", | ||||
| 				6345789: "Otis", | ||||
| 			}}, | ||||
| 			`name_mapping:<key:-1 value:"Negatory" > ` + | ||||
| 				`name_mapping:<key:7 value:"Lucky" > ` + | ||||
| 				`name_mapping:<key:1234 value:"Feist" > ` + | ||||
| 				`name_mapping:<key:6345789 value:"Otis" >`, | ||||
| 		}, | ||||
| 		// map with nil value; not well-defined, but we shouldn't crash | ||||
| 		{ | ||||
| 			&pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{7: nil}}, | ||||
| 			`msg_mapping:<key:7 >`, | ||||
| 		}, | ||||
| 	} | ||||
| 	for _, test := range tests { | ||||
| 		got := strings.TrimSpace(test.m.String()) | ||||
| 		if got != test.want { | ||||
| 			t.Errorf("\n got %s\nwant %s", got, test.want) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										33
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| # Go support for Protocol Buffers - Google's data interchange format | ||||
| # | ||||
| # Copyright 2010 The Go Authors.  All rights reserved. | ||||
| # https://github.com/golang/protobuf | ||||
| # | ||||
| # 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. | ||||
|  | ||||
| test: | ||||
| 	cd testdata && make test | ||||
							
								
								
									
										39
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| # Go support for Protocol Buffers - Google's data interchange format | ||||
| # | ||||
| # Copyright 2010 The Go Authors.  All rights reserved. | ||||
| # https://github.com/golang/protobuf | ||||
| # | ||||
| # 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. | ||||
|  | ||||
| # Not stored here, but descriptor.proto is in https://github.com/google/protobuf/ | ||||
| # at src/google/protobuf/descriptor.proto | ||||
| regenerate: | ||||
| 	echo WARNING! THIS RULE IS PROBABLY NOT RIGHT FOR YOUR INSTALLATION | ||||
| 	protoc --go_out=. -I$(HOME)/src/protobuf/src $(HOME)/src/protobuf/src/google/protobuf/descriptor.proto && \ | ||||
| 		sed 's,^package google_protobuf,package descriptor,' google/protobuf/descriptor.pb.go > \ | ||||
| 		$(GOPATH)/src/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go && \ | ||||
| 		rm -f google/protobuf/descriptor.pb.go | ||||
							
								
								
									
										2076
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2076
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										51
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| /* | ||||
| 	A plugin for the Google protocol buffer compiler to generate Go code. | ||||
| 	Run it by building this program and putting it in your path with the name | ||||
| 		protoc-gen-go | ||||
| 	That word 'go' at the end becomes part of the option string set for the | ||||
| 	protocol compiler, so once the protocol compiler (protoc) is installed | ||||
| 	you can run | ||||
| 		protoc --go_out=output_directory input_directory/file.proto | ||||
| 	to generate Go bindings for the protocol defined by file.proto. | ||||
| 	With that input, the output will be written to | ||||
| 		output_directory/file.pb.go | ||||
|  | ||||
| 	The generated code is documented in the package comment for | ||||
| 	the library. | ||||
|  | ||||
| 	See the README and documentation for protocol buffers to learn more: | ||||
| 		https://developers.google.com/protocol-buffers/ | ||||
|  | ||||
| */ | ||||
| package documentation | ||||
							
								
								
									
										40
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/generator/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/generator/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| # Go support for Protocol Buffers - Google's data interchange format | ||||
| # | ||||
| # Copyright 2010 The Go Authors.  All rights reserved. | ||||
| # https://github.com/golang/protobuf | ||||
| # | ||||
| # 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. | ||||
|  | ||||
| include $(GOROOT)/src/Make.inc | ||||
|  | ||||
| TARG=github.com/golang/protobuf/compiler/generator | ||||
| GOFILES=\ | ||||
| 	generator.go\ | ||||
|  | ||||
| DEPS=../descriptor ../plugin ../../proto | ||||
|  | ||||
| include $(GOROOT)/src/Make.pkg | ||||
							
								
								
									
										2808
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/generator/generator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2808
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/generator/generator.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										85
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/generator/name_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/generator/name_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2013 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package generator | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/protobuf/protoc-gen-go/descriptor" | ||||
| ) | ||||
|  | ||||
| func TestCamelCase(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		in, want string | ||||
| 	}{ | ||||
| 		{"one", "One"}, | ||||
| 		{"one_two", "OneTwo"}, | ||||
| 		{"_my_field_name_2", "XMyFieldName_2"}, | ||||
| 		{"Something_Capped", "Something_Capped"}, | ||||
| 		{"my_Name", "My_Name"}, | ||||
| 		{"OneTwo", "OneTwo"}, | ||||
| 		{"_", "X"}, | ||||
| 		{"_a_", "XA_"}, | ||||
| 	} | ||||
| 	for _, tc := range tests { | ||||
| 		if got := CamelCase(tc.in); got != tc.want { | ||||
| 			t.Errorf("CamelCase(%q) = %q, want %q", tc.in, got, tc.want) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestGoPackageOption(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		in           string | ||||
| 		impPath, pkg string | ||||
| 		ok           bool | ||||
| 	}{ | ||||
| 		{"", "", "", false}, | ||||
| 		{"foo", "", "foo", true}, | ||||
| 		{"github.com/golang/bar", "github.com/golang/bar", "bar", true}, | ||||
| 		{"github.com/golang/bar;baz", "github.com/golang/bar", "baz", true}, | ||||
| 	} | ||||
| 	for _, tc := range tests { | ||||
| 		d := &FileDescriptor{ | ||||
| 			FileDescriptorProto: &descriptor.FileDescriptorProto{ | ||||
| 				Options: &descriptor.FileOptions{ | ||||
| 					GoPackage: &tc.in, | ||||
| 				}, | ||||
| 			}, | ||||
| 		} | ||||
| 		impPath, pkg, ok := d.goPackageOption() | ||||
| 		if impPath != tc.impPath || pkg != tc.pkg || ok != tc.ok { | ||||
| 			t.Errorf("go_package = %q => (%q, %q, %t), want (%q, %q, %t)", tc.in, | ||||
| 				impPath, pkg, ok, tc.impPath, tc.pkg, tc.ok) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										463
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/grpc/grpc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										463
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/grpc/grpc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,463 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2015 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| // Package grpc outputs gRPC service descriptions in Go code. | ||||
| // It runs as a plugin for the Go protocol buffer compiler plugin. | ||||
| // It is linked in to protoc-gen-go. | ||||
| package grpc | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"path" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
|  | ||||
| 	pb "github.com/golang/protobuf/protoc-gen-go/descriptor" | ||||
| 	"github.com/golang/protobuf/protoc-gen-go/generator" | ||||
| ) | ||||
|  | ||||
| // generatedCodeVersion indicates a version of the generated code. | ||||
| // It is incremented whenever an incompatibility between the generated code and | ||||
| // the grpc package is introduced; the generated code references | ||||
| // a constant, grpc.SupportPackageIsVersionN (where N is generatedCodeVersion). | ||||
| const generatedCodeVersion = 3 | ||||
|  | ||||
| // Paths for packages used by code generated in this file, | ||||
| // relative to the import_prefix of the generator.Generator. | ||||
| const ( | ||||
| 	contextPkgPath = "golang.org/x/net/context" | ||||
| 	grpcPkgPath    = "google.golang.org/grpc" | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	generator.RegisterPlugin(new(grpc)) | ||||
| } | ||||
|  | ||||
| // grpc is an implementation of the Go protocol buffer compiler's | ||||
| // plugin architecture.  It generates bindings for gRPC support. | ||||
| type grpc struct { | ||||
| 	gen *generator.Generator | ||||
| } | ||||
|  | ||||
| // Name returns the name of this plugin, "grpc". | ||||
| func (g *grpc) Name() string { | ||||
| 	return "grpc" | ||||
| } | ||||
|  | ||||
| // The names for packages imported in the generated code. | ||||
| // They may vary from the final path component of the import path | ||||
| // if the name is used by other packages. | ||||
| var ( | ||||
| 	contextPkg string | ||||
| 	grpcPkg    string | ||||
| ) | ||||
|  | ||||
| // Init initializes the plugin. | ||||
| func (g *grpc) Init(gen *generator.Generator) { | ||||
| 	g.gen = gen | ||||
| 	contextPkg = generator.RegisterUniquePackageName("context", nil) | ||||
| 	grpcPkg = generator.RegisterUniquePackageName("grpc", nil) | ||||
| } | ||||
|  | ||||
| // Given a type name defined in a .proto, return its object. | ||||
| // Also record that we're using it, to guarantee the associated import. | ||||
| func (g *grpc) objectNamed(name string) generator.Object { | ||||
| 	g.gen.RecordTypeUse(name) | ||||
| 	return g.gen.ObjectNamed(name) | ||||
| } | ||||
|  | ||||
| // Given a type name defined in a .proto, return its name as we will print it. | ||||
| func (g *grpc) typeName(str string) string { | ||||
| 	return g.gen.TypeName(g.objectNamed(str)) | ||||
| } | ||||
|  | ||||
| // P forwards to g.gen.P. | ||||
| func (g *grpc) P(args ...interface{}) { g.gen.P(args...) } | ||||
|  | ||||
| // Generate generates code for the services in the given file. | ||||
| func (g *grpc) Generate(file *generator.FileDescriptor) { | ||||
| 	if len(file.FileDescriptorProto.Service) == 0 { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	g.P("// Reference imports to suppress errors if they are not otherwise used.") | ||||
| 	g.P("var _ ", contextPkg, ".Context") | ||||
| 	g.P("var _ ", grpcPkg, ".ClientConn") | ||||
| 	g.P() | ||||
|  | ||||
| 	// Assert version compatibility. | ||||
| 	g.P("// This is a compile-time assertion to ensure that this generated file") | ||||
| 	g.P("// is compatible with the grpc package it is being compiled against.") | ||||
| 	g.P("const _ = ", grpcPkg, ".SupportPackageIsVersion", generatedCodeVersion) | ||||
| 	g.P() | ||||
|  | ||||
| 	for i, service := range file.FileDescriptorProto.Service { | ||||
| 		g.generateService(file, service, i) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // GenerateImports generates the import declaration for this file. | ||||
| func (g *grpc) GenerateImports(file *generator.FileDescriptor) { | ||||
| 	if len(file.FileDescriptorProto.Service) == 0 { | ||||
| 		return | ||||
| 	} | ||||
| 	g.P("import (") | ||||
| 	g.P(contextPkg, " ", strconv.Quote(path.Join(g.gen.ImportPrefix, contextPkgPath))) | ||||
| 	g.P(grpcPkg, " ", strconv.Quote(path.Join(g.gen.ImportPrefix, grpcPkgPath))) | ||||
| 	g.P(")") | ||||
| 	g.P() | ||||
| } | ||||
|  | ||||
| // reservedClientName records whether a client name is reserved on the client side. | ||||
| var reservedClientName = map[string]bool{ | ||||
| // TODO: do we need any in gRPC? | ||||
| } | ||||
|  | ||||
| func unexport(s string) string { return strings.ToLower(s[:1]) + s[1:] } | ||||
|  | ||||
| // generateService generates all the code for the named service. | ||||
| func (g *grpc) generateService(file *generator.FileDescriptor, service *pb.ServiceDescriptorProto, index int) { | ||||
| 	path := fmt.Sprintf("6,%d", index) // 6 means service. | ||||
|  | ||||
| 	origServName := service.GetName() | ||||
| 	fullServName := origServName | ||||
| 	if pkg := file.GetPackage(); pkg != "" { | ||||
| 		fullServName = pkg + "." + fullServName | ||||
| 	} | ||||
| 	servName := generator.CamelCase(origServName) | ||||
|  | ||||
| 	g.P() | ||||
| 	g.P("// Client API for ", servName, " service") | ||||
| 	g.P() | ||||
|  | ||||
| 	// Client interface. | ||||
| 	g.P("type ", servName, "Client interface {") | ||||
| 	for i, method := range service.Method { | ||||
| 		g.gen.PrintComments(fmt.Sprintf("%s,2,%d", path, i)) // 2 means method in a service. | ||||
| 		g.P(g.generateClientSignature(servName, method)) | ||||
| 	} | ||||
| 	g.P("}") | ||||
| 	g.P() | ||||
|  | ||||
| 	// Client structure. | ||||
| 	g.P("type ", unexport(servName), "Client struct {") | ||||
| 	g.P("cc *", grpcPkg, ".ClientConn") | ||||
| 	g.P("}") | ||||
| 	g.P() | ||||
|  | ||||
| 	// NewClient factory. | ||||
| 	g.P("func New", servName, "Client (cc *", grpcPkg, ".ClientConn) ", servName, "Client {") | ||||
| 	g.P("return &", unexport(servName), "Client{cc}") | ||||
| 	g.P("}") | ||||
| 	g.P() | ||||
|  | ||||
| 	var methodIndex, streamIndex int | ||||
| 	serviceDescVar := "_" + servName + "_serviceDesc" | ||||
| 	// Client method implementations. | ||||
| 	for _, method := range service.Method { | ||||
| 		var descExpr string | ||||
| 		if !method.GetServerStreaming() && !method.GetClientStreaming() { | ||||
| 			// Unary RPC method | ||||
| 			descExpr = fmt.Sprintf("&%s.Methods[%d]", serviceDescVar, methodIndex) | ||||
| 			methodIndex++ | ||||
| 		} else { | ||||
| 			// Streaming RPC method | ||||
| 			descExpr = fmt.Sprintf("&%s.Streams[%d]", serviceDescVar, streamIndex) | ||||
| 			streamIndex++ | ||||
| 		} | ||||
| 		g.generateClientMethod(servName, fullServName, serviceDescVar, method, descExpr) | ||||
| 	} | ||||
|  | ||||
| 	g.P("// Server API for ", servName, " service") | ||||
| 	g.P() | ||||
|  | ||||
| 	// Server interface. | ||||
| 	serverType := servName + "Server" | ||||
| 	g.P("type ", serverType, " interface {") | ||||
| 	for i, method := range service.Method { | ||||
| 		g.gen.PrintComments(fmt.Sprintf("%s,2,%d", path, i)) // 2 means method in a service. | ||||
| 		g.P(g.generateServerSignature(servName, method)) | ||||
| 	} | ||||
| 	g.P("}") | ||||
| 	g.P() | ||||
|  | ||||
| 	// Server registration. | ||||
| 	g.P("func Register", servName, "Server(s *", grpcPkg, ".Server, srv ", serverType, ") {") | ||||
| 	g.P("s.RegisterService(&", serviceDescVar, `, srv)`) | ||||
| 	g.P("}") | ||||
| 	g.P() | ||||
|  | ||||
| 	// Server handler implementations. | ||||
| 	var handlerNames []string | ||||
| 	for _, method := range service.Method { | ||||
| 		hname := g.generateServerMethod(servName, fullServName, method) | ||||
| 		handlerNames = append(handlerNames, hname) | ||||
| 	} | ||||
|  | ||||
| 	// Service descriptor. | ||||
| 	g.P("var ", serviceDescVar, " = ", grpcPkg, ".ServiceDesc {") | ||||
| 	g.P("ServiceName: ", strconv.Quote(fullServName), ",") | ||||
| 	g.P("HandlerType: (*", serverType, ")(nil),") | ||||
| 	g.P("Methods: []", grpcPkg, ".MethodDesc{") | ||||
| 	for i, method := range service.Method { | ||||
| 		if method.GetServerStreaming() || method.GetClientStreaming() { | ||||
| 			continue | ||||
| 		} | ||||
| 		g.P("{") | ||||
| 		g.P("MethodName: ", strconv.Quote(method.GetName()), ",") | ||||
| 		g.P("Handler: ", handlerNames[i], ",") | ||||
| 		g.P("},") | ||||
| 	} | ||||
| 	g.P("},") | ||||
| 	g.P("Streams: []", grpcPkg, ".StreamDesc{") | ||||
| 	for i, method := range service.Method { | ||||
| 		if !method.GetServerStreaming() && !method.GetClientStreaming() { | ||||
| 			continue | ||||
| 		} | ||||
| 		g.P("{") | ||||
| 		g.P("StreamName: ", strconv.Quote(method.GetName()), ",") | ||||
| 		g.P("Handler: ", handlerNames[i], ",") | ||||
| 		if method.GetServerStreaming() { | ||||
| 			g.P("ServerStreams: true,") | ||||
| 		} | ||||
| 		if method.GetClientStreaming() { | ||||
| 			g.P("ClientStreams: true,") | ||||
| 		} | ||||
| 		g.P("},") | ||||
| 	} | ||||
| 	g.P("},") | ||||
| 	g.P("Metadata: ", file.VarName(), ",") | ||||
| 	g.P("}") | ||||
| 	g.P() | ||||
| } | ||||
|  | ||||
| // generateClientSignature returns the client-side signature for a method. | ||||
| func (g *grpc) generateClientSignature(servName string, method *pb.MethodDescriptorProto) string { | ||||
| 	origMethName := method.GetName() | ||||
| 	methName := generator.CamelCase(origMethName) | ||||
| 	if reservedClientName[methName] { | ||||
| 		methName += "_" | ||||
| 	} | ||||
| 	reqArg := ", in *" + g.typeName(method.GetInputType()) | ||||
| 	if method.GetClientStreaming() { | ||||
| 		reqArg = "" | ||||
| 	} | ||||
| 	respName := "*" + g.typeName(method.GetOutputType()) | ||||
| 	if method.GetServerStreaming() || method.GetClientStreaming() { | ||||
| 		respName = servName + "_" + generator.CamelCase(origMethName) + "Client" | ||||
| 	} | ||||
| 	return fmt.Sprintf("%s(ctx %s.Context%s, opts ...%s.CallOption) (%s, error)", methName, contextPkg, reqArg, grpcPkg, respName) | ||||
| } | ||||
|  | ||||
| func (g *grpc) generateClientMethod(servName, fullServName, serviceDescVar string, method *pb.MethodDescriptorProto, descExpr string) { | ||||
| 	sname := fmt.Sprintf("/%s/%s", fullServName, method.GetName()) | ||||
| 	methName := generator.CamelCase(method.GetName()) | ||||
| 	inType := g.typeName(method.GetInputType()) | ||||
| 	outType := g.typeName(method.GetOutputType()) | ||||
|  | ||||
| 	g.P("func (c *", unexport(servName), "Client) ", g.generateClientSignature(servName, method), "{") | ||||
| 	if !method.GetServerStreaming() && !method.GetClientStreaming() { | ||||
| 		g.P("out := new(", outType, ")") | ||||
| 		// TODO: Pass descExpr to Invoke. | ||||
| 		g.P("err := ", grpcPkg, `.Invoke(ctx, "`, sname, `", in, out, c.cc, opts...)`) | ||||
| 		g.P("if err != nil { return nil, err }") | ||||
| 		g.P("return out, nil") | ||||
| 		g.P("}") | ||||
| 		g.P() | ||||
| 		return | ||||
| 	} | ||||
| 	streamType := unexport(servName) + methName + "Client" | ||||
| 	g.P("stream, err := ", grpcPkg, ".NewClientStream(ctx, ", descExpr, `, c.cc, "`, sname, `", opts...)`) | ||||
| 	g.P("if err != nil { return nil, err }") | ||||
| 	g.P("x := &", streamType, "{stream}") | ||||
| 	if !method.GetClientStreaming() { | ||||
| 		g.P("if err := x.ClientStream.SendMsg(in); err != nil { return nil, err }") | ||||
| 		g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }") | ||||
| 	} | ||||
| 	g.P("return x, nil") | ||||
| 	g.P("}") | ||||
| 	g.P() | ||||
|  | ||||
| 	genSend := method.GetClientStreaming() | ||||
| 	genRecv := method.GetServerStreaming() | ||||
| 	genCloseAndRecv := !method.GetServerStreaming() | ||||
|  | ||||
| 	// Stream auxiliary types and methods. | ||||
| 	g.P("type ", servName, "_", methName, "Client interface {") | ||||
| 	if genSend { | ||||
| 		g.P("Send(*", inType, ") error") | ||||
| 	} | ||||
| 	if genRecv { | ||||
| 		g.P("Recv() (*", outType, ", error)") | ||||
| 	} | ||||
| 	if genCloseAndRecv { | ||||
| 		g.P("CloseAndRecv() (*", outType, ", error)") | ||||
| 	} | ||||
| 	g.P(grpcPkg, ".ClientStream") | ||||
| 	g.P("}") | ||||
| 	g.P() | ||||
|  | ||||
| 	g.P("type ", streamType, " struct {") | ||||
| 	g.P(grpcPkg, ".ClientStream") | ||||
| 	g.P("}") | ||||
| 	g.P() | ||||
|  | ||||
| 	if genSend { | ||||
| 		g.P("func (x *", streamType, ") Send(m *", inType, ") error {") | ||||
| 		g.P("return x.ClientStream.SendMsg(m)") | ||||
| 		g.P("}") | ||||
| 		g.P() | ||||
| 	} | ||||
| 	if genRecv { | ||||
| 		g.P("func (x *", streamType, ") Recv() (*", outType, ", error) {") | ||||
| 		g.P("m := new(", outType, ")") | ||||
| 		g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }") | ||||
| 		g.P("return m, nil") | ||||
| 		g.P("}") | ||||
| 		g.P() | ||||
| 	} | ||||
| 	if genCloseAndRecv { | ||||
| 		g.P("func (x *", streamType, ") CloseAndRecv() (*", outType, ", error) {") | ||||
| 		g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }") | ||||
| 		g.P("m := new(", outType, ")") | ||||
| 		g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }") | ||||
| 		g.P("return m, nil") | ||||
| 		g.P("}") | ||||
| 		g.P() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // generateServerSignature returns the server-side signature for a method. | ||||
| func (g *grpc) generateServerSignature(servName string, method *pb.MethodDescriptorProto) string { | ||||
| 	origMethName := method.GetName() | ||||
| 	methName := generator.CamelCase(origMethName) | ||||
| 	if reservedClientName[methName] { | ||||
| 		methName += "_" | ||||
| 	} | ||||
|  | ||||
| 	var reqArgs []string | ||||
| 	ret := "error" | ||||
| 	if !method.GetServerStreaming() && !method.GetClientStreaming() { | ||||
| 		reqArgs = append(reqArgs, contextPkg+".Context") | ||||
| 		ret = "(*" + g.typeName(method.GetOutputType()) + ", error)" | ||||
| 	} | ||||
| 	if !method.GetClientStreaming() { | ||||
| 		reqArgs = append(reqArgs, "*"+g.typeName(method.GetInputType())) | ||||
| 	} | ||||
| 	if method.GetServerStreaming() || method.GetClientStreaming() { | ||||
| 		reqArgs = append(reqArgs, servName+"_"+generator.CamelCase(origMethName)+"Server") | ||||
| 	} | ||||
|  | ||||
| 	return methName + "(" + strings.Join(reqArgs, ", ") + ") " + ret | ||||
| } | ||||
|  | ||||
| func (g *grpc) generateServerMethod(servName, fullServName string, method *pb.MethodDescriptorProto) string { | ||||
| 	methName := generator.CamelCase(method.GetName()) | ||||
| 	hname := fmt.Sprintf("_%s_%s_Handler", servName, methName) | ||||
| 	inType := g.typeName(method.GetInputType()) | ||||
| 	outType := g.typeName(method.GetOutputType()) | ||||
|  | ||||
| 	if !method.GetServerStreaming() && !method.GetClientStreaming() { | ||||
| 		g.P("func ", hname, "(srv interface{}, ctx ", contextPkg, ".Context, dec func(interface{}) error, interceptor ", grpcPkg, ".UnaryServerInterceptor) (interface{}, error) {") | ||||
| 		g.P("in := new(", inType, ")") | ||||
| 		g.P("if err := dec(in); err != nil { return nil, err }") | ||||
| 		g.P("if interceptor == nil { return srv.(", servName, "Server).", methName, "(ctx, in) }") | ||||
| 		g.P("info := &", grpcPkg, ".UnaryServerInfo{") | ||||
| 		g.P("Server: srv,") | ||||
| 		g.P("FullMethod: ", strconv.Quote(fmt.Sprintf("/%s/%s", fullServName, methName)), ",") | ||||
| 		g.P("}") | ||||
| 		g.P("handler := func(ctx ", contextPkg, ".Context, req interface{}) (interface{}, error) {") | ||||
| 		g.P("return srv.(", servName, "Server).", methName, "(ctx, req.(*", inType, "))") | ||||
| 		g.P("}") | ||||
| 		g.P("return interceptor(ctx, in, info, handler)") | ||||
| 		g.P("}") | ||||
| 		g.P() | ||||
| 		return hname | ||||
| 	} | ||||
| 	streamType := unexport(servName) + methName + "Server" | ||||
| 	g.P("func ", hname, "(srv interface{}, stream ", grpcPkg, ".ServerStream) error {") | ||||
| 	if !method.GetClientStreaming() { | ||||
| 		g.P("m := new(", inType, ")") | ||||
| 		g.P("if err := stream.RecvMsg(m); err != nil { return err }") | ||||
| 		g.P("return srv.(", servName, "Server).", methName, "(m, &", streamType, "{stream})") | ||||
| 	} else { | ||||
| 		g.P("return srv.(", servName, "Server).", methName, "(&", streamType, "{stream})") | ||||
| 	} | ||||
| 	g.P("}") | ||||
| 	g.P() | ||||
|  | ||||
| 	genSend := method.GetServerStreaming() | ||||
| 	genSendAndClose := !method.GetServerStreaming() | ||||
| 	genRecv := method.GetClientStreaming() | ||||
|  | ||||
| 	// Stream auxiliary types and methods. | ||||
| 	g.P("type ", servName, "_", methName, "Server interface {") | ||||
| 	if genSend { | ||||
| 		g.P("Send(*", outType, ") error") | ||||
| 	} | ||||
| 	if genSendAndClose { | ||||
| 		g.P("SendAndClose(*", outType, ") error") | ||||
| 	} | ||||
| 	if genRecv { | ||||
| 		g.P("Recv() (*", inType, ", error)") | ||||
| 	} | ||||
| 	g.P(grpcPkg, ".ServerStream") | ||||
| 	g.P("}") | ||||
| 	g.P() | ||||
|  | ||||
| 	g.P("type ", streamType, " struct {") | ||||
| 	g.P(grpcPkg, ".ServerStream") | ||||
| 	g.P("}") | ||||
| 	g.P() | ||||
|  | ||||
| 	if genSend { | ||||
| 		g.P("func (x *", streamType, ") Send(m *", outType, ") error {") | ||||
| 		g.P("return x.ServerStream.SendMsg(m)") | ||||
| 		g.P("}") | ||||
| 		g.P() | ||||
| 	} | ||||
| 	if genSendAndClose { | ||||
| 		g.P("func (x *", streamType, ") SendAndClose(m *", outType, ") error {") | ||||
| 		g.P("return x.ServerStream.SendMsg(m)") | ||||
| 		g.P("}") | ||||
| 		g.P() | ||||
| 	} | ||||
| 	if genRecv { | ||||
| 		g.P("func (x *", streamType, ") Recv() (*", inType, ", error) {") | ||||
| 		g.P("m := new(", inType, ")") | ||||
| 		g.P("if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err }") | ||||
| 		g.P("return m, nil") | ||||
| 		g.P("}") | ||||
| 		g.P() | ||||
| 	} | ||||
|  | ||||
| 	return hname | ||||
| } | ||||
							
								
								
									
										34
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/link_grpc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/link_grpc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2015 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package main | ||||
|  | ||||
| import _ "github.com/golang/protobuf/protoc-gen-go/grpc" | ||||
							
								
								
									
										98
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/main.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/main.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| // protoc-gen-go is a plugin for the Google protocol buffer compiler to generate | ||||
| // Go code.  Run it by building this program and putting it in your path with | ||||
| // the name | ||||
| // 	protoc-gen-go | ||||
| // That word 'go' at the end becomes part of the option string set for the | ||||
| // protocol compiler, so once the protocol compiler (protoc) is installed | ||||
| // you can run | ||||
| // 	protoc --go_out=output_directory input_directory/file.proto | ||||
| // to generate Go bindings for the protocol defined by file.proto. | ||||
| // With that input, the output will be written to | ||||
| // 	output_directory/file.pb.go | ||||
| // | ||||
| // The generated code is documented in the package comment for | ||||
| // the library. | ||||
| // | ||||
| // See the README and documentation for protocol buffers to learn more: | ||||
| // 	https://developers.google.com/protocol-buffers/ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"github.com/golang/protobuf/protoc-gen-go/generator" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
| 	// Begin by allocating a generator. The request and response structures are stored there | ||||
| 	// so we can do error handling easily - the response structure contains the field to | ||||
| 	// report failure. | ||||
| 	g := generator.New() | ||||
|  | ||||
| 	data, err := ioutil.ReadAll(os.Stdin) | ||||
| 	if err != nil { | ||||
| 		g.Error(err, "reading input") | ||||
| 	} | ||||
|  | ||||
| 	if err := proto.Unmarshal(data, g.Request); err != nil { | ||||
| 		g.Error(err, "parsing input proto") | ||||
| 	} | ||||
|  | ||||
| 	if len(g.Request.FileToGenerate) == 0 { | ||||
| 		g.Fail("no files to generate") | ||||
| 	} | ||||
|  | ||||
| 	g.CommandLineParameters(g.Request.GetParameter()) | ||||
|  | ||||
| 	// Create a wrapped version of the Descriptors and EnumDescriptors that | ||||
| 	// point to the file that defines them. | ||||
| 	g.WrapTypes() | ||||
|  | ||||
| 	g.SetPackageNames() | ||||
| 	g.BuildTypeNameMap() | ||||
|  | ||||
| 	g.GenerateAllFiles() | ||||
|  | ||||
| 	// Send back the results. | ||||
| 	data, err = proto.Marshal(g.Response) | ||||
| 	if err != nil { | ||||
| 		g.Error(err, "failed to marshal output proto") | ||||
| 	} | ||||
| 	_, err = os.Stdout.Write(data) | ||||
| 	if err != nil { | ||||
| 		g.Error(err, "failed to write output proto") | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										45
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/plugin/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/plugin/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| # Go support for Protocol Buffers - Google's data interchange format | ||||
| # | ||||
| # Copyright 2010 The Go Authors.  All rights reserved. | ||||
| # https://github.com/golang/protobuf | ||||
| # | ||||
| # 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. | ||||
|  | ||||
| # Not stored here, but plugin.proto is in https://github.com/google/protobuf/ | ||||
| # at src/google/protobuf/compiler/plugin.proto | ||||
| # Also we need to fix an import. | ||||
| regenerate: | ||||
| 	echo WARNING! THIS RULE IS PROBABLY NOT RIGHT FOR YOUR INSTALLATION | ||||
| 	protoc --go_out=Mgoogle/protobuf/descriptor.proto=github.com/golang/protobuf/protoc-gen-go/descriptor:. \ | ||||
| 		-I$(HOME)/src/protobuf/src $(HOME)/src/protobuf/src/google/protobuf/compiler/plugin.proto && \ | ||||
| 		mv google/protobuf/compiler/plugin.pb.go $(GOPATH)/src/github.com/golang/protobuf/protoc-gen-go/plugin | ||||
|  | ||||
| restore: | ||||
| 	cp plugin.pb.golden plugin.pb.go | ||||
|  | ||||
| preserve: | ||||
| 	cp plugin.pb.go plugin.pb.golden | ||||
							
								
								
									
										229
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										229
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,229 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: google/protobuf/compiler/plugin.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| /* | ||||
| Package plugin_go is a generated protocol buffer package. | ||||
|  | ||||
| It is generated from these files: | ||||
| 	google/protobuf/compiler/plugin.proto | ||||
|  | ||||
| It has these top-level messages: | ||||
| 	CodeGeneratorRequest | ||||
| 	CodeGeneratorResponse | ||||
| */ | ||||
| package plugin_go | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import fmt "fmt" | ||||
| import math "math" | ||||
| import google_protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = fmt.Errorf | ||||
| var _ = math.Inf | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the proto package it is being compiled against. | ||||
| // A compilation error at this line likely means your copy of the | ||||
| // proto package needs to be updated. | ||||
| const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package | ||||
|  | ||||
| // An encoded CodeGeneratorRequest is written to the plugin's stdin. | ||||
| type CodeGeneratorRequest struct { | ||||
| 	// The .proto files that were explicitly listed on the command-line.  The | ||||
| 	// code generator should generate code only for these files.  Each file's | ||||
| 	// descriptor will be included in proto_file, below. | ||||
| 	FileToGenerate []string `protobuf:"bytes,1,rep,name=file_to_generate,json=fileToGenerate" json:"file_to_generate,omitempty"` | ||||
| 	// The generator parameter passed on the command-line. | ||||
| 	Parameter *string `protobuf:"bytes,2,opt,name=parameter" json:"parameter,omitempty"` | ||||
| 	// FileDescriptorProtos for all files in files_to_generate and everything | ||||
| 	// they import.  The files will appear in topological order, so each file | ||||
| 	// appears before any file that imports it. | ||||
| 	// | ||||
| 	// protoc guarantees that all proto_files will be written after | ||||
| 	// the fields above, even though this is not technically guaranteed by the | ||||
| 	// protobuf wire format.  This theoretically could allow a plugin to stream | ||||
| 	// in the FileDescriptorProtos and handle them one by one rather than read | ||||
| 	// the entire set into memory at once.  However, as of this writing, this | ||||
| 	// is not similarly optimized on protoc's end -- it will store all fields in | ||||
| 	// memory at once before sending them to the plugin. | ||||
| 	ProtoFile        []*google_protobuf.FileDescriptorProto `protobuf:"bytes,15,rep,name=proto_file,json=protoFile" json:"proto_file,omitempty"` | ||||
| 	XXX_unrecognized []byte                                 `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *CodeGeneratorRequest) Reset()                    { *m = CodeGeneratorRequest{} } | ||||
| func (m *CodeGeneratorRequest) String() string            { return proto.CompactTextString(m) } | ||||
| func (*CodeGeneratorRequest) ProtoMessage()               {} | ||||
| func (*CodeGeneratorRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } | ||||
|  | ||||
| func (m *CodeGeneratorRequest) GetFileToGenerate() []string { | ||||
| 	if m != nil { | ||||
| 		return m.FileToGenerate | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *CodeGeneratorRequest) GetParameter() string { | ||||
| 	if m != nil && m.Parameter != nil { | ||||
| 		return *m.Parameter | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *CodeGeneratorRequest) GetProtoFile() []*google_protobuf.FileDescriptorProto { | ||||
| 	if m != nil { | ||||
| 		return m.ProtoFile | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // The plugin writes an encoded CodeGeneratorResponse to stdout. | ||||
| type CodeGeneratorResponse struct { | ||||
| 	// Error message.  If non-empty, code generation failed.  The plugin process | ||||
| 	// should exit with status code zero even if it reports an error in this way. | ||||
| 	// | ||||
| 	// This should be used to indicate errors in .proto files which prevent the | ||||
| 	// code generator from generating correct code.  Errors which indicate a | ||||
| 	// problem in protoc itself -- such as the input CodeGeneratorRequest being | ||||
| 	// unparseable -- should be reported by writing a message to stderr and | ||||
| 	// exiting with a non-zero status code. | ||||
| 	Error            *string                       `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"` | ||||
| 	File             []*CodeGeneratorResponse_File `protobuf:"bytes,15,rep,name=file" json:"file,omitempty"` | ||||
| 	XXX_unrecognized []byte                        `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *CodeGeneratorResponse) Reset()                    { *m = CodeGeneratorResponse{} } | ||||
| func (m *CodeGeneratorResponse) String() string            { return proto.CompactTextString(m) } | ||||
| func (*CodeGeneratorResponse) ProtoMessage()               {} | ||||
| func (*CodeGeneratorResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } | ||||
|  | ||||
| func (m *CodeGeneratorResponse) GetError() string { | ||||
| 	if m != nil && m.Error != nil { | ||||
| 		return *m.Error | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *CodeGeneratorResponse) GetFile() []*CodeGeneratorResponse_File { | ||||
| 	if m != nil { | ||||
| 		return m.File | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Represents a single generated file. | ||||
| type CodeGeneratorResponse_File struct { | ||||
| 	// The file name, relative to the output directory.  The name must not | ||||
| 	// contain "." or ".." components and must be relative, not be absolute (so, | ||||
| 	// the file cannot lie outside the output directory).  "/" must be used as | ||||
| 	// the path separator, not "\". | ||||
| 	// | ||||
| 	// If the name is omitted, the content will be appended to the previous | ||||
| 	// file.  This allows the generator to break large files into small chunks, | ||||
| 	// and allows the generated text to be streamed back to protoc so that large | ||||
| 	// files need not reside completely in memory at one time.  Note that as of | ||||
| 	// this writing protoc does not optimize for this -- it will read the entire | ||||
| 	// CodeGeneratorResponse before writing files to disk. | ||||
| 	Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` | ||||
| 	// If non-empty, indicates that the named file should already exist, and the | ||||
| 	// content here is to be inserted into that file at a defined insertion | ||||
| 	// point.  This feature allows a code generator to extend the output | ||||
| 	// produced by another code generator.  The original generator may provide | ||||
| 	// insertion points by placing special annotations in the file that look | ||||
| 	// like: | ||||
| 	//   @@protoc_insertion_point(NAME) | ||||
| 	// The annotation can have arbitrary text before and after it on the line, | ||||
| 	// which allows it to be placed in a comment.  NAME should be replaced with | ||||
| 	// an identifier naming the point -- this is what other generators will use | ||||
| 	// as the insertion_point.  Code inserted at this point will be placed | ||||
| 	// immediately above the line containing the insertion point (thus multiple | ||||
| 	// insertions to the same point will come out in the order they were added). | ||||
| 	// The double-@ is intended to make it unlikely that the generated code | ||||
| 	// could contain things that look like insertion points by accident. | ||||
| 	// | ||||
| 	// For example, the C++ code generator places the following line in the | ||||
| 	// .pb.h files that it generates: | ||||
| 	//   // @@protoc_insertion_point(namespace_scope) | ||||
| 	// This line appears within the scope of the file's package namespace, but | ||||
| 	// outside of any particular class.  Another plugin can then specify the | ||||
| 	// insertion_point "namespace_scope" to generate additional classes or | ||||
| 	// other declarations that should be placed in this scope. | ||||
| 	// | ||||
| 	// Note that if the line containing the insertion point begins with | ||||
| 	// whitespace, the same whitespace will be added to every line of the | ||||
| 	// inserted text.  This is useful for languages like Python, where | ||||
| 	// indentation matters.  In these languages, the insertion point comment | ||||
| 	// should be indented the same amount as any inserted code will need to be | ||||
| 	// in order to work correctly in that context. | ||||
| 	// | ||||
| 	// The code generator that generates the initial file and the one which | ||||
| 	// inserts into it must both run as part of a single invocation of protoc. | ||||
| 	// Code generators are executed in the order in which they appear on the | ||||
| 	// command line. | ||||
| 	// | ||||
| 	// If |insertion_point| is present, |name| must also be present. | ||||
| 	InsertionPoint *string `protobuf:"bytes,2,opt,name=insertion_point,json=insertionPoint" json:"insertion_point,omitempty"` | ||||
| 	// The file contents. | ||||
| 	Content          *string `protobuf:"bytes,15,opt,name=content" json:"content,omitempty"` | ||||
| 	XXX_unrecognized []byte  `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *CodeGeneratorResponse_File) Reset()                    { *m = CodeGeneratorResponse_File{} } | ||||
| func (m *CodeGeneratorResponse_File) String() string            { return proto.CompactTextString(m) } | ||||
| func (*CodeGeneratorResponse_File) ProtoMessage()               {} | ||||
| func (*CodeGeneratorResponse_File) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 0} } | ||||
|  | ||||
| func (m *CodeGeneratorResponse_File) GetName() string { | ||||
| 	if m != nil && m.Name != nil { | ||||
| 		return *m.Name | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *CodeGeneratorResponse_File) GetInsertionPoint() string { | ||||
| 	if m != nil && m.InsertionPoint != nil { | ||||
| 		return *m.InsertionPoint | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *CodeGeneratorResponse_File) GetContent() string { | ||||
| 	if m != nil && m.Content != nil { | ||||
| 		return *m.Content | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterType((*CodeGeneratorRequest)(nil), "google.protobuf.compiler.CodeGeneratorRequest") | ||||
| 	proto.RegisterType((*CodeGeneratorResponse)(nil), "google.protobuf.compiler.CodeGeneratorResponse") | ||||
| 	proto.RegisterType((*CodeGeneratorResponse_File)(nil), "google.protobuf.compiler.CodeGeneratorResponse.File") | ||||
| } | ||||
|  | ||||
| func init() { proto.RegisterFile("google/protobuf/compiler/plugin.proto", fileDescriptor0) } | ||||
|  | ||||
| var fileDescriptor0 = []byte{ | ||||
| 	// 310 bytes of a gzipped FileDescriptorProto | ||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x51, 0xc1, 0x4a, 0xc3, 0x40, | ||||
| 	0x10, 0x25, 0xb6, 0x22, 0x19, 0xa5, 0x95, 0xa5, 0xc2, 0x52, 0x7a, 0x08, 0x45, 0x31, 0xa7, 0x14, | ||||
| 	0x44, 0xf0, 0xde, 0x8a, 0x7a, 0x2c, 0xc1, 0x93, 0x20, 0x21, 0xa6, 0xd3, 0xb0, 0x90, 0xec, 0xac, | ||||
| 	0xb3, 0xdb, 0x2f, 0xf2, 0x9f, 0xfc, 0x1e, 0xd9, 0x4d, 0x5b, 0xa5, 0xd8, 0xdb, 0xce, 0x7b, 0x6f, | ||||
| 	0xe6, 0xbd, 0x9d, 0x81, 0x9b, 0x9a, 0xa8, 0x6e, 0x70, 0x66, 0x98, 0x1c, 0x7d, 0x6c, 0xd6, 0xb3, | ||||
| 	0x8a, 0x5a, 0xa3, 0x1a, 0xe4, 0x99, 0x69, 0x36, 0xb5, 0xd2, 0x59, 0x20, 0x84, 0xec, 0x64, 0xd9, | ||||
| 	0x4e, 0x96, 0xed, 0x64, 0xe3, 0xe4, 0x70, 0xc0, 0x0a, 0x6d, 0xc5, 0xca, 0x38, 0xe2, 0x4e, 0x3d, | ||||
| 	0xfd, 0x8a, 0x60, 0xb4, 0xa0, 0x15, 0x3e, 0xa3, 0x46, 0x2e, 0x1d, 0x71, 0x8e, 0x9f, 0x1b, 0xb4, | ||||
| 	0x4e, 0xa4, 0x70, 0xb9, 0x56, 0x0d, 0x16, 0x8e, 0x8a, 0xba, 0xe3, 0x50, 0x46, 0x49, 0x2f, 0x8d, | ||||
| 	0xf3, 0x81, 0xc7, 0x5f, 0x69, 0xdb, 0x81, 0x62, 0x02, 0xb1, 0x29, 0xb9, 0x6c, 0xd1, 0x21, 0xcb, | ||||
| 	0x93, 0x24, 0x4a, 0xe3, 0xfc, 0x17, 0x10, 0x0b, 0x80, 0xe0, 0x54, 0xf8, 0x2e, 0x39, 0x4c, 0x7a, | ||||
| 	0xe9, 0xf9, 0xdd, 0x75, 0x76, 0x98, 0xf8, 0x49, 0x35, 0xf8, 0xb8, 0xcf, 0xb6, 0xf4, 0x70, 0x1e, | ||||
| 	0x07, 0xd6, 0x33, 0xd3, 0xef, 0x08, 0xae, 0x0e, 0x52, 0x5a, 0x43, 0xda, 0xa2, 0x18, 0xc1, 0x29, | ||||
| 	0x32, 0x13, 0xcb, 0x28, 0x18, 0x77, 0x85, 0x78, 0x81, 0xfe, 0x1f, 0xbb, 0xfb, 0xec, 0xd8, 0x82, | ||||
| 	0xb2, 0x7f, 0x87, 0x86, 0x34, 0x79, 0x98, 0x30, 0x7e, 0x87, 0xbe, 0xaf, 0x84, 0x80, 0xbe, 0x2e, | ||||
| 	0x5b, 0xdc, 0xda, 0x84, 0xb7, 0xb8, 0x85, 0xa1, 0xd2, 0x16, 0xd9, 0x29, 0xd2, 0x85, 0x21, 0xa5, | ||||
| 	0xdd, 0xf6, 0xfb, 0x83, 0x3d, 0xbc, 0xf4, 0xa8, 0x90, 0x70, 0x56, 0x91, 0x76, 0xa8, 0x9d, 0x1c, | ||||
| 	0x06, 0xc1, 0xae, 0x9c, 0x3f, 0xc0, 0xa4, 0xa2, 0xf6, 0x68, 0xbe, 0xf9, 0xc5, 0x32, 0x1c, 0x3a, | ||||
| 	0x2c, 0xc4, 0xbe, 0xc5, 0xdd, 0xd9, 0x8b, 0x9a, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0x83, 0x7b, | ||||
| 	0x5c, 0x7c, 0x1b, 0x02, 0x00, 0x00, | ||||
| } | ||||
							
								
								
									
										83
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/plugin/plugin.pb.golden
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: google/protobuf/compiler/plugin.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| package google_protobuf_compiler | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import "math" | ||||
| import google_protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" | ||||
|  | ||||
| // Reference proto and math imports to suppress error if they are not otherwise used. | ||||
| var _ = proto.GetString | ||||
| var _ = math.Inf | ||||
|  | ||||
| type CodeGeneratorRequest struct { | ||||
| 	FileToGenerate   []string                               `protobuf:"bytes,1,rep,name=file_to_generate" json:"file_to_generate,omitempty"` | ||||
| 	Parameter        *string                                `protobuf:"bytes,2,opt,name=parameter" json:"parameter,omitempty"` | ||||
| 	ProtoFile        []*google_protobuf.FileDescriptorProto `protobuf:"bytes,15,rep,name=proto_file" json:"proto_file,omitempty"` | ||||
| 	XXX_unrecognized []byte                                 `json:"-"` | ||||
| } | ||||
|  | ||||
| func (this *CodeGeneratorRequest) Reset()         { *this = CodeGeneratorRequest{} } | ||||
| func (this *CodeGeneratorRequest) String() string { return proto.CompactTextString(this) } | ||||
| func (*CodeGeneratorRequest) ProtoMessage()       {} | ||||
|  | ||||
| func (this *CodeGeneratorRequest) GetParameter() string { | ||||
| 	if this != nil && this.Parameter != nil { | ||||
| 		return *this.Parameter | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type CodeGeneratorResponse struct { | ||||
| 	Error            *string                       `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"` | ||||
| 	File             []*CodeGeneratorResponse_File `protobuf:"bytes,15,rep,name=file" json:"file,omitempty"` | ||||
| 	XXX_unrecognized []byte                        `json:"-"` | ||||
| } | ||||
|  | ||||
| func (this *CodeGeneratorResponse) Reset()         { *this = CodeGeneratorResponse{} } | ||||
| func (this *CodeGeneratorResponse) String() string { return proto.CompactTextString(this) } | ||||
| func (*CodeGeneratorResponse) ProtoMessage()       {} | ||||
|  | ||||
| func (this *CodeGeneratorResponse) GetError() string { | ||||
| 	if this != nil && this.Error != nil { | ||||
| 		return *this.Error | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type CodeGeneratorResponse_File struct { | ||||
| 	Name             *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` | ||||
| 	InsertionPoint   *string `protobuf:"bytes,2,opt,name=insertion_point" json:"insertion_point,omitempty"` | ||||
| 	Content          *string `protobuf:"bytes,15,opt,name=content" json:"content,omitempty"` | ||||
| 	XXX_unrecognized []byte  `json:"-"` | ||||
| } | ||||
|  | ||||
| func (this *CodeGeneratorResponse_File) Reset()         { *this = CodeGeneratorResponse_File{} } | ||||
| func (this *CodeGeneratorResponse_File) String() string { return proto.CompactTextString(this) } | ||||
| func (*CodeGeneratorResponse_File) ProtoMessage()       {} | ||||
|  | ||||
| func (this *CodeGeneratorResponse_File) GetName() string { | ||||
| 	if this != nil && this.Name != nil { | ||||
| 		return *this.Name | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (this *CodeGeneratorResponse_File) GetInsertionPoint() string { | ||||
| 	if this != nil && this.InsertionPoint != nil { | ||||
| 		return *this.InsertionPoint | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (this *CodeGeneratorResponse_File) GetContent() string { | ||||
| 	if this != nil && this.Content != nil { | ||||
| 		return *this.Content | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| } | ||||
							
								
								
									
										73
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| # Go support for Protocol Buffers - Google's data interchange format | ||||
| # | ||||
| # Copyright 2010 The Go Authors.  All rights reserved. | ||||
| # https://github.com/golang/protobuf | ||||
| # | ||||
| # 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. | ||||
|  | ||||
| all: | ||||
| 	@echo run make test | ||||
|  | ||||
| include ../../Make.protobuf | ||||
|  | ||||
| test:	golden testbuild | ||||
|  | ||||
| #test:	golden testbuild extension_test | ||||
| #	./extension_test | ||||
| #	@echo PASS | ||||
|  | ||||
| my_test/test.pb.go: my_test/test.proto | ||||
| 	protoc --go_out=Mmulti/multi1.proto=github.com/golang/protobuf/protoc-gen-go/testdata/multi:. $< | ||||
|  | ||||
| golden: | ||||
| 	make -B my_test/test.pb.go | ||||
| 	sed -i '/return.*fileDescriptor/d' my_test/test.pb.go | ||||
| 	sed -i '/^var fileDescriptor/,/^}/d' my_test/test.pb.go | ||||
| 	sed -i '/proto.RegisterFile.*fileDescriptor/d' my_test/test.pb.go | ||||
| 	gofmt -w my_test/test.pb.go | ||||
| 	diff -w my_test/test.pb.go my_test/test.pb.go.golden | ||||
|  | ||||
| nuke:	clean | ||||
|  | ||||
| testbuild:	regenerate | ||||
| 	go test | ||||
|  | ||||
| regenerate: | ||||
| 	# Invoke protoc once to generate three independent .pb.go files in the same package. | ||||
| 	protoc --go_out=. multi/multi{1,2,3}.proto | ||||
|  | ||||
| #extension_test:	extension_test.$O | ||||
| #	$(LD) -L. -o $@ $< | ||||
|  | ||||
| #multi.a: multi3.pb.$O multi2.pb.$O multi1.pb.$O | ||||
| #	rm -f multi.a | ||||
| #	$(QUOTED_GOBIN)/gopack grc $@ $< | ||||
|  | ||||
| #test.pb.go:	imp.pb.go | ||||
| #multi1.pb.go:	multi2.pb.go multi3.pb.go | ||||
| #main.$O: imp.pb.$O test.pb.$O multi.a | ||||
| #extension_test.$O: extension_base.pb.$O extension_extra.pb.$O extension_user.pb.$O | ||||
							
								
								
									
										46
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_base.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto2"; | ||||
|  | ||||
| package extension_base; | ||||
|  | ||||
| message BaseMessage { | ||||
|   optional int32 height = 1; | ||||
|   extensions 4 to 9; | ||||
|   extensions 16 to max; | ||||
| } | ||||
|  | ||||
| // Another message that may be extended, using message_set_wire_format. | ||||
| message OldStyleMessage { | ||||
|   option message_set_wire_format = true; | ||||
|   extensions 100 to max; | ||||
| } | ||||
							
								
								
									
										38
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_extra.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2011 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto2"; | ||||
|  | ||||
| package extension_extra; | ||||
|  | ||||
| message ExtraMessage { | ||||
|   optional int32 width = 1; | ||||
| } | ||||
							
								
								
									
										210
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,210 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| // Test that we can use protocol buffers that use extensions. | ||||
|  | ||||
| package testdata | ||||
|  | ||||
| /* | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"regexp" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	base "extension_base.pb" | ||||
| 	user "extension_user.pb" | ||||
| ) | ||||
|  | ||||
| func TestSingleFieldExtension(t *testing.T) { | ||||
| 	bm := &base.BaseMessage{ | ||||
| 		Height: proto.Int32(178), | ||||
| 	} | ||||
|  | ||||
| 	// Use extension within scope of another type. | ||||
| 	vol := proto.Uint32(11) | ||||
| 	err := proto.SetExtension(bm, user.E_LoudMessage_Volume, vol) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Failed setting extension:", err) | ||||
| 	} | ||||
| 	buf, err := proto.Marshal(bm) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Failed encoding message with extension:", err) | ||||
| 	} | ||||
| 	bm_new := new(base.BaseMessage) | ||||
| 	if err := proto.Unmarshal(buf, bm_new); err != nil { | ||||
| 		t.Fatal("Failed decoding message with extension:", err) | ||||
| 	} | ||||
| 	if !proto.HasExtension(bm_new, user.E_LoudMessage_Volume) { | ||||
| 		t.Fatal("Decoded message didn't contain extension.") | ||||
| 	} | ||||
| 	vol_out, err := proto.GetExtension(bm_new, user.E_LoudMessage_Volume) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Failed getting extension:", err) | ||||
| 	} | ||||
| 	if v := vol_out.(*uint32); *v != *vol { | ||||
| 		t.Errorf("vol_out = %v, expected %v", *v, *vol) | ||||
| 	} | ||||
| 	proto.ClearExtension(bm_new, user.E_LoudMessage_Volume) | ||||
| 	if proto.HasExtension(bm_new, user.E_LoudMessage_Volume) { | ||||
| 		t.Fatal("Failed clearing extension.") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestMessageExtension(t *testing.T) { | ||||
| 	bm := &base.BaseMessage{ | ||||
| 		Height: proto.Int32(179), | ||||
| 	} | ||||
|  | ||||
| 	// Use extension that is itself a message. | ||||
| 	um := &user.UserMessage{ | ||||
| 		Name: proto.String("Dave"), | ||||
| 		Rank: proto.String("Major"), | ||||
| 	} | ||||
| 	err := proto.SetExtension(bm, user.E_LoginMessage_UserMessage, um) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Failed setting extension:", err) | ||||
| 	} | ||||
| 	buf, err := proto.Marshal(bm) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Failed encoding message with extension:", err) | ||||
| 	} | ||||
| 	bm_new := new(base.BaseMessage) | ||||
| 	if err := proto.Unmarshal(buf, bm_new); err != nil { | ||||
| 		t.Fatal("Failed decoding message with extension:", err) | ||||
| 	} | ||||
| 	if !proto.HasExtension(bm_new, user.E_LoginMessage_UserMessage) { | ||||
| 		t.Fatal("Decoded message didn't contain extension.") | ||||
| 	} | ||||
| 	um_out, err := proto.GetExtension(bm_new, user.E_LoginMessage_UserMessage) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Failed getting extension:", err) | ||||
| 	} | ||||
| 	if n := um_out.(*user.UserMessage).Name; *n != *um.Name { | ||||
| 		t.Errorf("um_out.Name = %q, expected %q", *n, *um.Name) | ||||
| 	} | ||||
| 	if r := um_out.(*user.UserMessage).Rank; *r != *um.Rank { | ||||
| 		t.Errorf("um_out.Rank = %q, expected %q", *r, *um.Rank) | ||||
| 	} | ||||
| 	proto.ClearExtension(bm_new, user.E_LoginMessage_UserMessage) | ||||
| 	if proto.HasExtension(bm_new, user.E_LoginMessage_UserMessage) { | ||||
| 		t.Fatal("Failed clearing extension.") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestTopLevelExtension(t *testing.T) { | ||||
| 	bm := &base.BaseMessage{ | ||||
| 		Height: proto.Int32(179), | ||||
| 	} | ||||
|  | ||||
| 	width := proto.Int32(17) | ||||
| 	err := proto.SetExtension(bm, user.E_Width, width) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Failed setting extension:", err) | ||||
| 	} | ||||
| 	buf, err := proto.Marshal(bm) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Failed encoding message with extension:", err) | ||||
| 	} | ||||
| 	bm_new := new(base.BaseMessage) | ||||
| 	if err := proto.Unmarshal(buf, bm_new); err != nil { | ||||
| 		t.Fatal("Failed decoding message with extension:", err) | ||||
| 	} | ||||
| 	if !proto.HasExtension(bm_new, user.E_Width) { | ||||
| 		t.Fatal("Decoded message didn't contain extension.") | ||||
| 	} | ||||
| 	width_out, err := proto.GetExtension(bm_new, user.E_Width) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Failed getting extension:", err) | ||||
| 	} | ||||
| 	if w := width_out.(*int32); *w != *width { | ||||
| 		t.Errorf("width_out = %v, expected %v", *w, *width) | ||||
| 	} | ||||
| 	proto.ClearExtension(bm_new, user.E_Width) | ||||
| 	if proto.HasExtension(bm_new, user.E_Width) { | ||||
| 		t.Fatal("Failed clearing extension.") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestMessageSetWireFormat(t *testing.T) { | ||||
| 	osm := new(base.OldStyleMessage) | ||||
| 	osp := &user.OldStyleParcel{ | ||||
| 		Name:   proto.String("Dave"), | ||||
| 		Height: proto.Int32(178), | ||||
| 	} | ||||
|  | ||||
| 	err := proto.SetExtension(osm, user.E_OldStyleParcel_MessageSetExtension, osp) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Failed setting extension:", err) | ||||
| 	} | ||||
|  | ||||
| 	buf, err := proto.Marshal(osm) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Failed encoding message:", err) | ||||
| 	} | ||||
|  | ||||
| 	// Data generated from Python implementation. | ||||
| 	expected := []byte{ | ||||
| 		11, 16, 209, 15, 26, 9, 10, 4, 68, 97, 118, 101, 16, 178, 1, 12, | ||||
| 	} | ||||
|  | ||||
| 	if !bytes.Equal(expected, buf) { | ||||
| 		t.Errorf("Encoding mismatch.\nwant %+v\n got %+v", expected, buf) | ||||
| 	} | ||||
|  | ||||
| 	// Check that it is restored correctly. | ||||
| 	osm = new(base.OldStyleMessage) | ||||
| 	if err := proto.Unmarshal(buf, osm); err != nil { | ||||
| 		t.Fatal("Failed decoding message:", err) | ||||
| 	} | ||||
| 	osp_out, err := proto.GetExtension(osm, user.E_OldStyleParcel_MessageSetExtension) | ||||
| 	if err != nil { | ||||
| 		t.Fatal("Failed getting extension:", err) | ||||
| 	} | ||||
| 	osp = osp_out.(*user.OldStyleParcel) | ||||
| 	if *osp.Name != "Dave" || *osp.Height != 178 { | ||||
| 		t.Errorf("Retrieved extension from decoded message is not correct: %+v", osp) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	// simpler than rigging up gotest | ||||
| 	testing.Main(regexp.MatchString, []testing.InternalTest{ | ||||
| 		{"TestSingleFieldExtension", TestSingleFieldExtension}, | ||||
| 		{"TestMessageExtension", TestMessageExtension}, | ||||
| 		{"TestTopLevelExtension", TestTopLevelExtension}, | ||||
| 	}, | ||||
| 		[]testing.InternalBenchmark{}, | ||||
| 		[]testing.InternalExample{}) | ||||
| } | ||||
|  | ||||
| */ | ||||
							
								
								
									
										100
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/extension_user.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto2"; | ||||
|  | ||||
| import "extension_base.proto"; | ||||
| import "extension_extra.proto"; | ||||
|  | ||||
| package extension_user; | ||||
|  | ||||
| message UserMessage { | ||||
|   optional string name = 1; | ||||
|   optional string rank = 2; | ||||
| } | ||||
|  | ||||
| // Extend with a message | ||||
| extend extension_base.BaseMessage { | ||||
|   optional UserMessage user_message = 5; | ||||
| } | ||||
|  | ||||
| // Extend with a foreign message | ||||
| extend extension_base.BaseMessage { | ||||
|   optional extension_extra.ExtraMessage extra_message = 9; | ||||
| } | ||||
|  | ||||
| // Extend with some primitive types | ||||
| extend extension_base.BaseMessage { | ||||
|   optional int32 width = 6; | ||||
|   optional int64 area = 7; | ||||
| } | ||||
|  | ||||
| // Extend inside the scope of another type | ||||
| message LoudMessage { | ||||
|   extend extension_base.BaseMessage { | ||||
|     optional uint32 volume = 8; | ||||
|   } | ||||
|   extensions 100 to max; | ||||
| } | ||||
|  | ||||
| // Extend inside the scope of another type, using a message. | ||||
| message LoginMessage { | ||||
|   extend extension_base.BaseMessage { | ||||
|     optional UserMessage user_message = 16; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // Extend with a repeated field | ||||
| extend extension_base.BaseMessage { | ||||
|   repeated Detail detail = 17; | ||||
| } | ||||
|  | ||||
| message Detail { | ||||
|   optional string color = 1; | ||||
| } | ||||
|  | ||||
| // An extension of an extension | ||||
| message Announcement { | ||||
|   optional string words = 1; | ||||
|   extend LoudMessage { | ||||
|     optional Announcement loud_ext = 100; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // Something that can be put in a message set. | ||||
| message OldStyleParcel { | ||||
|   extend extension_base.OldStyleMessage { | ||||
|     optional OldStyleParcel message_set_extension = 2001; | ||||
|   } | ||||
|  | ||||
|   required string name = 1; | ||||
|   optional int32 height = 2; | ||||
| } | ||||
							
								
								
									
										59
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/grpc.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2015 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto3"; | ||||
|  | ||||
| package grpc.testing; | ||||
|  | ||||
| message SimpleRequest { | ||||
| } | ||||
|  | ||||
| message SimpleResponse { | ||||
| } | ||||
|  | ||||
| message StreamMsg { | ||||
| } | ||||
|  | ||||
| message StreamMsg2 { | ||||
| } | ||||
|  | ||||
| service Test { | ||||
|   rpc UnaryCall(SimpleRequest) returns (SimpleResponse); | ||||
|  | ||||
|   // This RPC streams from the server only. | ||||
|   rpc Downstream(SimpleRequest) returns (stream StreamMsg); | ||||
|  | ||||
|   // This RPC streams from the client. | ||||
|   rpc Upstream(stream StreamMsg) returns (SimpleResponse); | ||||
|  | ||||
|   // This one streams in both directions. | ||||
|   rpc Bidi(stream StreamMsg) returns (stream StreamMsg2); | ||||
| } | ||||
							
								
								
									
										113
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp.pb.go.golden
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp.pb.go.golden
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: imp.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| package imp | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import "math" | ||||
| import "os" | ||||
| import imp1 "imp2.pb" | ||||
|  | ||||
| // Reference proto & math imports to suppress error if they are not otherwise used. | ||||
| var _ = proto.GetString | ||||
| var _ = math.Inf | ||||
|  | ||||
| // Types from public import imp2.proto | ||||
| type PubliclyImportedMessage imp1.PubliclyImportedMessage | ||||
|  | ||||
| func (this *PubliclyImportedMessage) Reset() { (*imp1.PubliclyImportedMessage)(this).Reset() } | ||||
| func (this *PubliclyImportedMessage) String() string { | ||||
| 	return (*imp1.PubliclyImportedMessage)(this).String() | ||||
| } | ||||
|  | ||||
| // PubliclyImportedMessage from public import imp.proto | ||||
|  | ||||
| type ImportedMessage_Owner int32 | ||||
|  | ||||
| const ( | ||||
| 	ImportedMessage_DAVE ImportedMessage_Owner = 1 | ||||
| 	ImportedMessage_MIKE ImportedMessage_Owner = 2 | ||||
| ) | ||||
|  | ||||
| var ImportedMessage_Owner_name = map[int32]string{ | ||||
| 	1: "DAVE", | ||||
| 	2: "MIKE", | ||||
| } | ||||
| var ImportedMessage_Owner_value = map[string]int32{ | ||||
| 	"DAVE": 1, | ||||
| 	"MIKE": 2, | ||||
| } | ||||
|  | ||||
| // NewImportedMessage_Owner is deprecated. Use x.Enum() instead. | ||||
| func NewImportedMessage_Owner(x ImportedMessage_Owner) *ImportedMessage_Owner { | ||||
| 	e := ImportedMessage_Owner(x) | ||||
| 	return &e | ||||
| } | ||||
| func (x ImportedMessage_Owner) Enum() *ImportedMessage_Owner { | ||||
| 	p := new(ImportedMessage_Owner) | ||||
| 	*p = x | ||||
| 	return p | ||||
| } | ||||
| func (x ImportedMessage_Owner) String() string { | ||||
| 	return proto.EnumName(ImportedMessage_Owner_name, int32(x)) | ||||
| } | ||||
|  | ||||
| type ImportedMessage struct { | ||||
| 	Field            *int64           `protobuf:"varint,1,req,name=field" json:"field,omitempty"` | ||||
| 	XXX_extensions   map[int32][]byte `json:",omitempty"` | ||||
| 	XXX_unrecognized []byte           `json:",omitempty"` | ||||
| } | ||||
|  | ||||
| func (this *ImportedMessage) Reset()         { *this = ImportedMessage{} } | ||||
| func (this *ImportedMessage) String() string { return proto.CompactTextString(this) } | ||||
|  | ||||
| var extRange_ImportedMessage = []proto.ExtensionRange{ | ||||
| 	proto.ExtensionRange{90, 100}, | ||||
| } | ||||
|  | ||||
| func (*ImportedMessage) ExtensionRangeArray() []proto.ExtensionRange { | ||||
| 	return extRange_ImportedMessage | ||||
| } | ||||
| func (this *ImportedMessage) ExtensionMap() map[int32][]byte { | ||||
| 	if this.XXX_extensions == nil { | ||||
| 		this.XXX_extensions = make(map[int32][]byte) | ||||
| 	} | ||||
| 	return this.XXX_extensions | ||||
| } | ||||
|  | ||||
| type ImportedExtendable struct { | ||||
| 	XXX_extensions   map[int32][]byte `json:",omitempty"` | ||||
| 	XXX_unrecognized []byte           `json:",omitempty"` | ||||
| } | ||||
|  | ||||
| func (this *ImportedExtendable) Reset()         { *this = ImportedExtendable{} } | ||||
| func (this *ImportedExtendable) String() string { return proto.CompactTextString(this) } | ||||
|  | ||||
| func (this *ImportedExtendable) Marshal() ([]byte, error) { | ||||
| 	return proto.MarshalMessageSet(this.ExtensionMap()) | ||||
| } | ||||
| func (this *ImportedExtendable) Unmarshal(buf []byte) error { | ||||
| 	return proto.UnmarshalMessageSet(buf, this.ExtensionMap()) | ||||
| } | ||||
| // ensure ImportedExtendable satisfies proto.Marshaler and proto.Unmarshaler | ||||
| var _ proto.Marshaler = (*ImportedExtendable)(nil) | ||||
| var _ proto.Unmarshaler = (*ImportedExtendable)(nil) | ||||
|  | ||||
| var extRange_ImportedExtendable = []proto.ExtensionRange{ | ||||
| 	proto.ExtensionRange{100, 536870911}, | ||||
| } | ||||
|  | ||||
| func (*ImportedExtendable) ExtensionRangeArray() []proto.ExtensionRange { | ||||
| 	return extRange_ImportedExtendable | ||||
| } | ||||
| func (this *ImportedExtendable) ExtensionMap() map[int32][]byte { | ||||
| 	if this.XXX_extensions == nil { | ||||
| 		this.XXX_extensions = make(map[int32][]byte) | ||||
| 	} | ||||
| 	return this.XXX_extensions | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterEnum("imp.ImportedMessage_Owner", ImportedMessage_Owner_name, ImportedMessage_Owner_value) | ||||
| } | ||||
							
								
								
									
										70
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto2"; | ||||
|  | ||||
| package imp; | ||||
|  | ||||
| import "imp2.proto"; | ||||
| import "imp3.proto"; | ||||
|  | ||||
| message ImportedMessage { | ||||
|   required int64 field = 1; | ||||
|  | ||||
|   // The forwarded getters for these fields are fiddly to get right. | ||||
|   optional ImportedMessage2 local_msg = 2; | ||||
|   optional ForeignImportedMessage foreign_msg = 3;  // in imp3.proto | ||||
|   optional Owner enum_field = 4; | ||||
|   oneof union { | ||||
|     int32 state = 9; | ||||
|   } | ||||
|  | ||||
|   repeated string name = 5; | ||||
|   repeated Owner boss = 6; | ||||
|   repeated ImportedMessage2 memo = 7; | ||||
|  | ||||
|   map<string, ImportedMessage2> msg_map = 8; | ||||
|  | ||||
|   enum Owner { | ||||
|     DAVE = 1; | ||||
|     MIKE = 2; | ||||
|   } | ||||
|  | ||||
|   extensions 90 to 100; | ||||
| } | ||||
|  | ||||
| message ImportedMessage2 { | ||||
| } | ||||
|  | ||||
| message ImportedExtendable { | ||||
|   option message_set_wire_format = true; | ||||
|   extensions 100 to max; | ||||
| } | ||||
							
								
								
									
										43
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp2.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp2.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2011 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto2"; | ||||
|  | ||||
| package imp; | ||||
|  | ||||
| message PubliclyImportedMessage { | ||||
|   optional int64 field = 1; | ||||
| } | ||||
|  | ||||
| enum PubliclyImportedEnum { | ||||
|   GLASSES = 1; | ||||
|   HAIR = 2; | ||||
| } | ||||
							
								
								
									
										38
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp3.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/imp3.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2012 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto2"; | ||||
|  | ||||
| package imp; | ||||
|  | ||||
| message ForeignImportedMessage { | ||||
|   optional string tuber = 1; | ||||
| } | ||||
							
								
								
									
										46
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/main_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/main_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| // A simple binary to link together the protocol buffers in this test. | ||||
|  | ||||
| package testdata | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	mytestpb "./my_test" | ||||
| 	multipb "github.com/golang/protobuf/protoc-gen-go/testdata/multi" | ||||
| ) | ||||
|  | ||||
| func TestLink(t *testing.T) { | ||||
| 	_ = &multipb.Multi1{} | ||||
| 	_ = &mytestpb.Request{} | ||||
| } | ||||
							
								
								
									
										44
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi1.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto2"; | ||||
|  | ||||
| import "multi/multi2.proto"; | ||||
| import "multi/multi3.proto"; | ||||
|  | ||||
| package multitest; | ||||
|  | ||||
| message Multi1 { | ||||
|   required Multi2 multi2 = 1; | ||||
|   optional Multi2.Color color = 2; | ||||
|   optional Multi3.HatType hat_type = 3; | ||||
| } | ||||
|  | ||||
							
								
								
									
										46
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi2.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto2"; | ||||
|  | ||||
| package multitest; | ||||
|  | ||||
| message Multi2 { | ||||
|   required int32 required_value = 1; | ||||
|  | ||||
|   enum Color { | ||||
|     BLUE = 1; | ||||
|     GREEN = 2; | ||||
|     RED = 3; | ||||
|   }; | ||||
|   optional Color color = 2; | ||||
| } | ||||
|  | ||||
							
								
								
									
										43
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/multi/multi3.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto2"; | ||||
|  | ||||
| package multitest; | ||||
|  | ||||
| message Multi3 { | ||||
|   enum HatType { | ||||
|     FEDORA = 1; | ||||
|     FEZ = 2; | ||||
|   }; | ||||
|   optional HatType hat_type = 1; | ||||
| } | ||||
|  | ||||
							
								
								
									
										866
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										866
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,866 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: my_test/test.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| /* | ||||
| Package my_test is a generated protocol buffer package. | ||||
|  | ||||
| This package holds interesting messages. | ||||
|  | ||||
| It is generated from these files: | ||||
| 	my_test/test.proto | ||||
|  | ||||
| It has these top-level messages: | ||||
| 	Request | ||||
| 	Reply | ||||
| 	OtherBase | ||||
| 	ReplyExtensions | ||||
| 	OtherReplyExtensions | ||||
| 	OldReply | ||||
| 	Communique | ||||
| */ | ||||
| package my_test | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import fmt "fmt" | ||||
| import math "math" | ||||
| import _ "github.com/golang/protobuf/protoc-gen-go/testdata/multi" | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = fmt.Errorf | ||||
| var _ = math.Inf | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the proto package it is being compiled against. | ||||
| // A compilation error at this line likely means your copy of the | ||||
| // proto package needs to be updated. | ||||
| const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package | ||||
|  | ||||
| type HatType int32 | ||||
|  | ||||
| const ( | ||||
| 	// deliberately skipping 0 | ||||
| 	HatType_FEDORA HatType = 1 | ||||
| 	HatType_FEZ    HatType = 2 | ||||
| ) | ||||
|  | ||||
| var HatType_name = map[int32]string{ | ||||
| 	1: "FEDORA", | ||||
| 	2: "FEZ", | ||||
| } | ||||
| var HatType_value = map[string]int32{ | ||||
| 	"FEDORA": 1, | ||||
| 	"FEZ":    2, | ||||
| } | ||||
|  | ||||
| func (x HatType) Enum() *HatType { | ||||
| 	p := new(HatType) | ||||
| 	*p = x | ||||
| 	return p | ||||
| } | ||||
| func (x HatType) String() string { | ||||
| 	return proto.EnumName(HatType_name, int32(x)) | ||||
| } | ||||
| func (x *HatType) UnmarshalJSON(data []byte) error { | ||||
| 	value, err := proto.UnmarshalJSONEnum(HatType_value, data, "HatType") | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*x = HatType(value) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // This enum represents days of the week. | ||||
| type Days int32 | ||||
|  | ||||
| const ( | ||||
| 	Days_MONDAY  Days = 1 | ||||
| 	Days_TUESDAY Days = 2 | ||||
| 	Days_LUNDI   Days = 1 | ||||
| ) | ||||
|  | ||||
| var Days_name = map[int32]string{ | ||||
| 	1: "MONDAY", | ||||
| 	2: "TUESDAY", | ||||
| 	// Duplicate value: 1: "LUNDI", | ||||
| } | ||||
| var Days_value = map[string]int32{ | ||||
| 	"MONDAY":  1, | ||||
| 	"TUESDAY": 2, | ||||
| 	"LUNDI":   1, | ||||
| } | ||||
|  | ||||
| func (x Days) Enum() *Days { | ||||
| 	p := new(Days) | ||||
| 	*p = x | ||||
| 	return p | ||||
| } | ||||
| func (x Days) String() string { | ||||
| 	return proto.EnumName(Days_name, int32(x)) | ||||
| } | ||||
| func (x *Days) UnmarshalJSON(data []byte) error { | ||||
| 	value, err := proto.UnmarshalJSONEnum(Days_value, data, "Days") | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*x = Days(value) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type Request_Color int32 | ||||
|  | ||||
| const ( | ||||
| 	Request_RED   Request_Color = 0 | ||||
| 	Request_GREEN Request_Color = 1 | ||||
| 	Request_BLUE  Request_Color = 2 | ||||
| ) | ||||
|  | ||||
| var Request_Color_name = map[int32]string{ | ||||
| 	0: "RED", | ||||
| 	1: "GREEN", | ||||
| 	2: "BLUE", | ||||
| } | ||||
| var Request_Color_value = map[string]int32{ | ||||
| 	"RED":   0, | ||||
| 	"GREEN": 1, | ||||
| 	"BLUE":  2, | ||||
| } | ||||
|  | ||||
| func (x Request_Color) Enum() *Request_Color { | ||||
| 	p := new(Request_Color) | ||||
| 	*p = x | ||||
| 	return p | ||||
| } | ||||
| func (x Request_Color) String() string { | ||||
| 	return proto.EnumName(Request_Color_name, int32(x)) | ||||
| } | ||||
| func (x *Request_Color) UnmarshalJSON(data []byte) error { | ||||
| 	value, err := proto.UnmarshalJSONEnum(Request_Color_value, data, "Request_Color") | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*x = Request_Color(value) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type Reply_Entry_Game int32 | ||||
|  | ||||
| const ( | ||||
| 	Reply_Entry_FOOTBALL Reply_Entry_Game = 1 | ||||
| 	Reply_Entry_TENNIS   Reply_Entry_Game = 2 | ||||
| ) | ||||
|  | ||||
| var Reply_Entry_Game_name = map[int32]string{ | ||||
| 	1: "FOOTBALL", | ||||
| 	2: "TENNIS", | ||||
| } | ||||
| var Reply_Entry_Game_value = map[string]int32{ | ||||
| 	"FOOTBALL": 1, | ||||
| 	"TENNIS":   2, | ||||
| } | ||||
|  | ||||
| func (x Reply_Entry_Game) Enum() *Reply_Entry_Game { | ||||
| 	p := new(Reply_Entry_Game) | ||||
| 	*p = x | ||||
| 	return p | ||||
| } | ||||
| func (x Reply_Entry_Game) String() string { | ||||
| 	return proto.EnumName(Reply_Entry_Game_name, int32(x)) | ||||
| } | ||||
| func (x *Reply_Entry_Game) UnmarshalJSON(data []byte) error { | ||||
| 	value, err := proto.UnmarshalJSONEnum(Reply_Entry_Game_value, data, "Reply_Entry_Game") | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*x = Reply_Entry_Game(value) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // This is a message that might be sent somewhere. | ||||
| type Request struct { | ||||
| 	Key []int64 `protobuf:"varint,1,rep,name=key" json:"key,omitempty"` | ||||
| 	//  optional imp.ImportedMessage imported_message = 2; | ||||
| 	Hue *Request_Color `protobuf:"varint,3,opt,name=hue,enum=my.test.Request_Color" json:"hue,omitempty"` | ||||
| 	Hat *HatType       `protobuf:"varint,4,opt,name=hat,enum=my.test.HatType,def=1" json:"hat,omitempty"` | ||||
| 	//  optional imp.ImportedMessage.Owner owner = 6; | ||||
| 	Deadline  *float32           `protobuf:"fixed32,7,opt,name=deadline,def=inf" json:"deadline,omitempty"` | ||||
| 	Somegroup *Request_SomeGroup `protobuf:"group,8,opt,name=SomeGroup,json=somegroup" json:"somegroup,omitempty"` | ||||
| 	// This is a map field. It will generate map[int32]string. | ||||
| 	NameMapping map[int32]string `protobuf:"bytes,14,rep,name=name_mapping,json=nameMapping" json:"name_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` | ||||
| 	// This is a map field whose value type is a message. | ||||
| 	MsgMapping map[int64]*Reply `protobuf:"bytes,15,rep,name=msg_mapping,json=msgMapping" json:"msg_mapping,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` | ||||
| 	Reset_     *int32           `protobuf:"varint,12,opt,name=reset" json:"reset,omitempty"` | ||||
| 	// This field should not conflict with any getters. | ||||
| 	GetKey_          *string `protobuf:"bytes,16,opt,name=get_key,json=getKey" json:"get_key,omitempty"` | ||||
| 	XXX_unrecognized []byte  `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Request) Reset()         { *m = Request{} } | ||||
| func (m *Request) String() string { return proto.CompactTextString(m) } | ||||
| func (*Request) ProtoMessage()    {} | ||||
|  | ||||
| const Default_Request_Hat HatType = HatType_FEDORA | ||||
|  | ||||
| var Default_Request_Deadline float32 = float32(math.Inf(1)) | ||||
|  | ||||
| func (m *Request) GetKey() []int64 { | ||||
| 	if m != nil { | ||||
| 		return m.Key | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Request) GetHue() Request_Color { | ||||
| 	if m != nil && m.Hue != nil { | ||||
| 		return *m.Hue | ||||
| 	} | ||||
| 	return Request_RED | ||||
| } | ||||
|  | ||||
| func (m *Request) GetHat() HatType { | ||||
| 	if m != nil && m.Hat != nil { | ||||
| 		return *m.Hat | ||||
| 	} | ||||
| 	return Default_Request_Hat | ||||
| } | ||||
|  | ||||
| func (m *Request) GetDeadline() float32 { | ||||
| 	if m != nil && m.Deadline != nil { | ||||
| 		return *m.Deadline | ||||
| 	} | ||||
| 	return Default_Request_Deadline | ||||
| } | ||||
|  | ||||
| func (m *Request) GetSomegroup() *Request_SomeGroup { | ||||
| 	if m != nil { | ||||
| 		return m.Somegroup | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Request) GetNameMapping() map[int32]string { | ||||
| 	if m != nil { | ||||
| 		return m.NameMapping | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Request) GetMsgMapping() map[int64]*Reply { | ||||
| 	if m != nil { | ||||
| 		return m.MsgMapping | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Request) GetReset_() int32 { | ||||
| 	if m != nil && m.Reset_ != nil { | ||||
| 		return *m.Reset_ | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Request) GetGetKey_() string { | ||||
| 	if m != nil && m.GetKey_ != nil { | ||||
| 		return *m.GetKey_ | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type Request_SomeGroup struct { | ||||
| 	GroupField       *int32 `protobuf:"varint,9,opt,name=group_field,json=groupField" json:"group_field,omitempty"` | ||||
| 	XXX_unrecognized []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Request_SomeGroup) Reset()         { *m = Request_SomeGroup{} } | ||||
| func (m *Request_SomeGroup) String() string { return proto.CompactTextString(m) } | ||||
| func (*Request_SomeGroup) ProtoMessage()    {} | ||||
|  | ||||
| func (m *Request_SomeGroup) GetGroupField() int32 { | ||||
| 	if m != nil && m.GroupField != nil { | ||||
| 		return *m.GroupField | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| type Reply struct { | ||||
| 	Found                        []*Reply_Entry `protobuf:"bytes,1,rep,name=found" json:"found,omitempty"` | ||||
| 	CompactKeys                  []int32        `protobuf:"varint,2,rep,packed,name=compact_keys,json=compactKeys" json:"compact_keys,omitempty"` | ||||
| 	proto.XXX_InternalExtensions `json:"-"` | ||||
| 	XXX_unrecognized             []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Reply) Reset()         { *m = Reply{} } | ||||
| func (m *Reply) String() string { return proto.CompactTextString(m) } | ||||
| func (*Reply) ProtoMessage()    {} | ||||
|  | ||||
| var extRange_Reply = []proto.ExtensionRange{ | ||||
| 	{100, 536870911}, | ||||
| } | ||||
|  | ||||
| func (*Reply) ExtensionRangeArray() []proto.ExtensionRange { | ||||
| 	return extRange_Reply | ||||
| } | ||||
|  | ||||
| func (m *Reply) GetFound() []*Reply_Entry { | ||||
| 	if m != nil { | ||||
| 		return m.Found | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Reply) GetCompactKeys() []int32 { | ||||
| 	if m != nil { | ||||
| 		return m.CompactKeys | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type Reply_Entry struct { | ||||
| 	KeyThatNeeds_1234Camel_CasIng *int64 `protobuf:"varint,1,req,name=key_that_needs_1234camel_CasIng,json=keyThatNeeds1234camelCasIng" json:"key_that_needs_1234camel_CasIng,omitempty"` | ||||
| 	Value                         *int64 `protobuf:"varint,2,opt,name=value,def=7" json:"value,omitempty"` | ||||
| 	XMyFieldName_2                *int64 `protobuf:"varint,3,opt,name=_my_field_name_2,json=myFieldName2" json:"_my_field_name_2,omitempty"` | ||||
| 	XXX_unrecognized              []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Reply_Entry) Reset()         { *m = Reply_Entry{} } | ||||
| func (m *Reply_Entry) String() string { return proto.CompactTextString(m) } | ||||
| func (*Reply_Entry) ProtoMessage()    {} | ||||
|  | ||||
| const Default_Reply_Entry_Value int64 = 7 | ||||
|  | ||||
| func (m *Reply_Entry) GetKeyThatNeeds_1234Camel_CasIng() int64 { | ||||
| 	if m != nil && m.KeyThatNeeds_1234Camel_CasIng != nil { | ||||
| 		return *m.KeyThatNeeds_1234Camel_CasIng | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Reply_Entry) GetValue() int64 { | ||||
| 	if m != nil && m.Value != nil { | ||||
| 		return *m.Value | ||||
| 	} | ||||
| 	return Default_Reply_Entry_Value | ||||
| } | ||||
|  | ||||
| func (m *Reply_Entry) GetXMyFieldName_2() int64 { | ||||
| 	if m != nil && m.XMyFieldName_2 != nil { | ||||
| 		return *m.XMyFieldName_2 | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| type OtherBase struct { | ||||
| 	Name                         *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` | ||||
| 	proto.XXX_InternalExtensions `json:"-"` | ||||
| 	XXX_unrecognized             []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *OtherBase) Reset()         { *m = OtherBase{} } | ||||
| func (m *OtherBase) String() string { return proto.CompactTextString(m) } | ||||
| func (*OtherBase) ProtoMessage()    {} | ||||
|  | ||||
| var extRange_OtherBase = []proto.ExtensionRange{ | ||||
| 	{100, 536870911}, | ||||
| } | ||||
|  | ||||
| func (*OtherBase) ExtensionRangeArray() []proto.ExtensionRange { | ||||
| 	return extRange_OtherBase | ||||
| } | ||||
|  | ||||
| func (m *OtherBase) GetName() string { | ||||
| 	if m != nil && m.Name != nil { | ||||
| 		return *m.Name | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type ReplyExtensions struct { | ||||
| 	XXX_unrecognized []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *ReplyExtensions) Reset()         { *m = ReplyExtensions{} } | ||||
| func (m *ReplyExtensions) String() string { return proto.CompactTextString(m) } | ||||
| func (*ReplyExtensions) ProtoMessage()    {} | ||||
|  | ||||
| var E_ReplyExtensions_Time = &proto.ExtensionDesc{ | ||||
| 	ExtendedType:  (*Reply)(nil), | ||||
| 	ExtensionType: (*float64)(nil), | ||||
| 	Field:         101, | ||||
| 	Name:          "my.test.ReplyExtensions.time", | ||||
| 	Tag:           "fixed64,101,opt,name=time", | ||||
| } | ||||
|  | ||||
| var E_ReplyExtensions_Carrot = &proto.ExtensionDesc{ | ||||
| 	ExtendedType:  (*Reply)(nil), | ||||
| 	ExtensionType: (*ReplyExtensions)(nil), | ||||
| 	Field:         105, | ||||
| 	Name:          "my.test.ReplyExtensions.carrot", | ||||
| 	Tag:           "bytes,105,opt,name=carrot", | ||||
| } | ||||
|  | ||||
| var E_ReplyExtensions_Donut = &proto.ExtensionDesc{ | ||||
| 	ExtendedType:  (*OtherBase)(nil), | ||||
| 	ExtensionType: (*ReplyExtensions)(nil), | ||||
| 	Field:         101, | ||||
| 	Name:          "my.test.ReplyExtensions.donut", | ||||
| 	Tag:           "bytes,101,opt,name=donut", | ||||
| } | ||||
|  | ||||
| type OtherReplyExtensions struct { | ||||
| 	Key              *int32 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` | ||||
| 	XXX_unrecognized []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *OtherReplyExtensions) Reset()         { *m = OtherReplyExtensions{} } | ||||
| func (m *OtherReplyExtensions) String() string { return proto.CompactTextString(m) } | ||||
| func (*OtherReplyExtensions) ProtoMessage()    {} | ||||
|  | ||||
| func (m *OtherReplyExtensions) GetKey() int32 { | ||||
| 	if m != nil && m.Key != nil { | ||||
| 		return *m.Key | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| type OldReply struct { | ||||
| 	proto.XXX_InternalExtensions `json:"-"` | ||||
| 	XXX_unrecognized             []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *OldReply) Reset()         { *m = OldReply{} } | ||||
| func (m *OldReply) String() string { return proto.CompactTextString(m) } | ||||
| func (*OldReply) ProtoMessage()    {} | ||||
|  | ||||
| func (m *OldReply) Marshal() ([]byte, error) { | ||||
| 	return proto.MarshalMessageSet(&m.XXX_InternalExtensions) | ||||
| } | ||||
| func (m *OldReply) Unmarshal(buf []byte) error { | ||||
| 	return proto.UnmarshalMessageSet(buf, &m.XXX_InternalExtensions) | ||||
| } | ||||
| func (m *OldReply) MarshalJSON() ([]byte, error) { | ||||
| 	return proto.MarshalMessageSetJSON(&m.XXX_InternalExtensions) | ||||
| } | ||||
| func (m *OldReply) UnmarshalJSON(buf []byte) error { | ||||
| 	return proto.UnmarshalMessageSetJSON(buf, &m.XXX_InternalExtensions) | ||||
| } | ||||
|  | ||||
| // ensure OldReply satisfies proto.Marshaler and proto.Unmarshaler | ||||
| var _ proto.Marshaler = (*OldReply)(nil) | ||||
| var _ proto.Unmarshaler = (*OldReply)(nil) | ||||
|  | ||||
| var extRange_OldReply = []proto.ExtensionRange{ | ||||
| 	{100, 2147483646}, | ||||
| } | ||||
|  | ||||
| func (*OldReply) ExtensionRangeArray() []proto.ExtensionRange { | ||||
| 	return extRange_OldReply | ||||
| } | ||||
|  | ||||
| type Communique struct { | ||||
| 	MakeMeCry *bool `protobuf:"varint,1,opt,name=make_me_cry,json=makeMeCry" json:"make_me_cry,omitempty"` | ||||
| 	// This is a oneof, called "union". | ||||
| 	// | ||||
| 	// Types that are valid to be assigned to Union: | ||||
| 	//	*Communique_Number | ||||
| 	//	*Communique_Name | ||||
| 	//	*Communique_Data | ||||
| 	//	*Communique_TempC | ||||
| 	//	*Communique_Height | ||||
| 	//	*Communique_Today | ||||
| 	//	*Communique_Maybe | ||||
| 	//	*Communique_Delta_ | ||||
| 	//	*Communique_Msg | ||||
| 	//	*Communique_Somegroup | ||||
| 	Union            isCommunique_Union `protobuf_oneof:"union"` | ||||
| 	XXX_unrecognized []byte             `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Communique) Reset()         { *m = Communique{} } | ||||
| func (m *Communique) String() string { return proto.CompactTextString(m) } | ||||
| func (*Communique) ProtoMessage()    {} | ||||
|  | ||||
| type isCommunique_Union interface { | ||||
| 	isCommunique_Union() | ||||
| } | ||||
|  | ||||
| type Communique_Number struct { | ||||
| 	Number int32 `protobuf:"varint,5,opt,name=number,oneof"` | ||||
| } | ||||
| type Communique_Name struct { | ||||
| 	Name string `protobuf:"bytes,6,opt,name=name,oneof"` | ||||
| } | ||||
| type Communique_Data struct { | ||||
| 	Data []byte `protobuf:"bytes,7,opt,name=data,oneof"` | ||||
| } | ||||
| type Communique_TempC struct { | ||||
| 	TempC float64 `protobuf:"fixed64,8,opt,name=temp_c,json=tempC,oneof"` | ||||
| } | ||||
| type Communique_Height struct { | ||||
| 	Height float32 `protobuf:"fixed32,9,opt,name=height,oneof"` | ||||
| } | ||||
| type Communique_Today struct { | ||||
| 	Today Days `protobuf:"varint,10,opt,name=today,enum=my.test.Days,oneof"` | ||||
| } | ||||
| type Communique_Maybe struct { | ||||
| 	Maybe bool `protobuf:"varint,11,opt,name=maybe,oneof"` | ||||
| } | ||||
| type Communique_Delta_ struct { | ||||
| 	Delta int32 `protobuf:"zigzag32,12,opt,name=delta,oneof"` | ||||
| } | ||||
| type Communique_Msg struct { | ||||
| 	Msg *Reply `protobuf:"bytes,13,opt,name=msg,oneof"` | ||||
| } | ||||
| type Communique_Somegroup struct { | ||||
| 	Somegroup *Communique_SomeGroup `protobuf:"group,14,opt,name=SomeGroup,json=somegroup,oneof"` | ||||
| } | ||||
|  | ||||
| func (*Communique_Number) isCommunique_Union()    {} | ||||
| func (*Communique_Name) isCommunique_Union()      {} | ||||
| func (*Communique_Data) isCommunique_Union()      {} | ||||
| func (*Communique_TempC) isCommunique_Union()     {} | ||||
| func (*Communique_Height) isCommunique_Union()    {} | ||||
| func (*Communique_Today) isCommunique_Union()     {} | ||||
| func (*Communique_Maybe) isCommunique_Union()     {} | ||||
| func (*Communique_Delta_) isCommunique_Union()    {} | ||||
| func (*Communique_Msg) isCommunique_Union()       {} | ||||
| func (*Communique_Somegroup) isCommunique_Union() {} | ||||
|  | ||||
| func (m *Communique) GetUnion() isCommunique_Union { | ||||
| 	if m != nil { | ||||
| 		return m.Union | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetMakeMeCry() bool { | ||||
| 	if m != nil && m.MakeMeCry != nil { | ||||
| 		return *m.MakeMeCry | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetNumber() int32 { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Number); ok { | ||||
| 		return x.Number | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetName() string { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Name); ok { | ||||
| 		return x.Name | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetData() []byte { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Data); ok { | ||||
| 		return x.Data | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetTempC() float64 { | ||||
| 	if x, ok := m.GetUnion().(*Communique_TempC); ok { | ||||
| 		return x.TempC | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetHeight() float32 { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Height); ok { | ||||
| 		return x.Height | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetToday() Days { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Today); ok { | ||||
| 		return x.Today | ||||
| 	} | ||||
| 	return Days_MONDAY | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetMaybe() bool { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Maybe); ok { | ||||
| 		return x.Maybe | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetDelta() int32 { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Delta_); ok { | ||||
| 		return x.Delta | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetMsg() *Reply { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Msg); ok { | ||||
| 		return x.Msg | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetSomegroup() *Communique_SomeGroup { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Somegroup); ok { | ||||
| 		return x.Somegroup | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // XXX_OneofFuncs is for the internal use of the proto package. | ||||
| func (*Communique) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { | ||||
| 	return _Communique_OneofMarshaler, _Communique_OneofUnmarshaler, _Communique_OneofSizer, []interface{}{ | ||||
| 		(*Communique_Number)(nil), | ||||
| 		(*Communique_Name)(nil), | ||||
| 		(*Communique_Data)(nil), | ||||
| 		(*Communique_TempC)(nil), | ||||
| 		(*Communique_Height)(nil), | ||||
| 		(*Communique_Today)(nil), | ||||
| 		(*Communique_Maybe)(nil), | ||||
| 		(*Communique_Delta_)(nil), | ||||
| 		(*Communique_Msg)(nil), | ||||
| 		(*Communique_Somegroup)(nil), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func _Communique_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { | ||||
| 	m := msg.(*Communique) | ||||
| 	// union | ||||
| 	switch x := m.Union.(type) { | ||||
| 	case *Communique_Number: | ||||
| 		b.EncodeVarint(5<<3 | proto.WireVarint) | ||||
| 		b.EncodeVarint(uint64(x.Number)) | ||||
| 	case *Communique_Name: | ||||
| 		b.EncodeVarint(6<<3 | proto.WireBytes) | ||||
| 		b.EncodeStringBytes(x.Name) | ||||
| 	case *Communique_Data: | ||||
| 		b.EncodeVarint(7<<3 | proto.WireBytes) | ||||
| 		b.EncodeRawBytes(x.Data) | ||||
| 	case *Communique_TempC: | ||||
| 		b.EncodeVarint(8<<3 | proto.WireFixed64) | ||||
| 		b.EncodeFixed64(math.Float64bits(x.TempC)) | ||||
| 	case *Communique_Height: | ||||
| 		b.EncodeVarint(9<<3 | proto.WireFixed32) | ||||
| 		b.EncodeFixed32(uint64(math.Float32bits(x.Height))) | ||||
| 	case *Communique_Today: | ||||
| 		b.EncodeVarint(10<<3 | proto.WireVarint) | ||||
| 		b.EncodeVarint(uint64(x.Today)) | ||||
| 	case *Communique_Maybe: | ||||
| 		t := uint64(0) | ||||
| 		if x.Maybe { | ||||
| 			t = 1 | ||||
| 		} | ||||
| 		b.EncodeVarint(11<<3 | proto.WireVarint) | ||||
| 		b.EncodeVarint(t) | ||||
| 	case *Communique_Delta_: | ||||
| 		b.EncodeVarint(12<<3 | proto.WireVarint) | ||||
| 		b.EncodeZigzag32(uint64(x.Delta)) | ||||
| 	case *Communique_Msg: | ||||
| 		b.EncodeVarint(13<<3 | proto.WireBytes) | ||||
| 		if err := b.EncodeMessage(x.Msg); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	case *Communique_Somegroup: | ||||
| 		b.EncodeVarint(14<<3 | proto.WireStartGroup) | ||||
| 		if err := b.Marshal(x.Somegroup); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		b.EncodeVarint(14<<3 | proto.WireEndGroup) | ||||
| 	case nil: | ||||
| 	default: | ||||
| 		return fmt.Errorf("Communique.Union has unexpected type %T", x) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func _Communique_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { | ||||
| 	m := msg.(*Communique) | ||||
| 	switch tag { | ||||
| 	case 5: // union.number | ||||
| 		if wire != proto.WireVarint { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeVarint() | ||||
| 		m.Union = &Communique_Number{int32(x)} | ||||
| 		return true, err | ||||
| 	case 6: // union.name | ||||
| 		if wire != proto.WireBytes { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeStringBytes() | ||||
| 		m.Union = &Communique_Name{x} | ||||
| 		return true, err | ||||
| 	case 7: // union.data | ||||
| 		if wire != proto.WireBytes { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeRawBytes(true) | ||||
| 		m.Union = &Communique_Data{x} | ||||
| 		return true, err | ||||
| 	case 8: // union.temp_c | ||||
| 		if wire != proto.WireFixed64 { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeFixed64() | ||||
| 		m.Union = &Communique_TempC{math.Float64frombits(x)} | ||||
| 		return true, err | ||||
| 	case 9: // union.height | ||||
| 		if wire != proto.WireFixed32 { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeFixed32() | ||||
| 		m.Union = &Communique_Height{math.Float32frombits(uint32(x))} | ||||
| 		return true, err | ||||
| 	case 10: // union.today | ||||
| 		if wire != proto.WireVarint { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeVarint() | ||||
| 		m.Union = &Communique_Today{Days(x)} | ||||
| 		return true, err | ||||
| 	case 11: // union.maybe | ||||
| 		if wire != proto.WireVarint { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeVarint() | ||||
| 		m.Union = &Communique_Maybe{x != 0} | ||||
| 		return true, err | ||||
| 	case 12: // union.delta | ||||
| 		if wire != proto.WireVarint { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeZigzag32() | ||||
| 		m.Union = &Communique_Delta_{int32(x)} | ||||
| 		return true, err | ||||
| 	case 13: // union.msg | ||||
| 		if wire != proto.WireBytes { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		msg := new(Reply) | ||||
| 		err := b.DecodeMessage(msg) | ||||
| 		m.Union = &Communique_Msg{msg} | ||||
| 		return true, err | ||||
| 	case 14: // union.somegroup | ||||
| 		if wire != proto.WireStartGroup { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		msg := new(Communique_SomeGroup) | ||||
| 		err := b.DecodeGroup(msg) | ||||
| 		m.Union = &Communique_Somegroup{msg} | ||||
| 		return true, err | ||||
| 	default: | ||||
| 		return false, nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func _Communique_OneofSizer(msg proto.Message) (n int) { | ||||
| 	m := msg.(*Communique) | ||||
| 	// union | ||||
| 	switch x := m.Union.(type) { | ||||
| 	case *Communique_Number: | ||||
| 		n += proto.SizeVarint(5<<3 | proto.WireVarint) | ||||
| 		n += proto.SizeVarint(uint64(x.Number)) | ||||
| 	case *Communique_Name: | ||||
| 		n += proto.SizeVarint(6<<3 | proto.WireBytes) | ||||
| 		n += proto.SizeVarint(uint64(len(x.Name))) | ||||
| 		n += len(x.Name) | ||||
| 	case *Communique_Data: | ||||
| 		n += proto.SizeVarint(7<<3 | proto.WireBytes) | ||||
| 		n += proto.SizeVarint(uint64(len(x.Data))) | ||||
| 		n += len(x.Data) | ||||
| 	case *Communique_TempC: | ||||
| 		n += proto.SizeVarint(8<<3 | proto.WireFixed64) | ||||
| 		n += 8 | ||||
| 	case *Communique_Height: | ||||
| 		n += proto.SizeVarint(9<<3 | proto.WireFixed32) | ||||
| 		n += 4 | ||||
| 	case *Communique_Today: | ||||
| 		n += proto.SizeVarint(10<<3 | proto.WireVarint) | ||||
| 		n += proto.SizeVarint(uint64(x.Today)) | ||||
| 	case *Communique_Maybe: | ||||
| 		n += proto.SizeVarint(11<<3 | proto.WireVarint) | ||||
| 		n += 1 | ||||
| 	case *Communique_Delta_: | ||||
| 		n += proto.SizeVarint(12<<3 | proto.WireVarint) | ||||
| 		n += proto.SizeVarint(uint64((uint32(x.Delta) << 1) ^ uint32((int32(x.Delta) >> 31)))) | ||||
| 	case *Communique_Msg: | ||||
| 		s := proto.Size(x.Msg) | ||||
| 		n += proto.SizeVarint(13<<3 | proto.WireBytes) | ||||
| 		n += proto.SizeVarint(uint64(s)) | ||||
| 		n += s | ||||
| 	case *Communique_Somegroup: | ||||
| 		n += proto.SizeVarint(14<<3 | proto.WireStartGroup) | ||||
| 		n += proto.Size(x.Somegroup) | ||||
| 		n += proto.SizeVarint(14<<3 | proto.WireEndGroup) | ||||
| 	case nil: | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| type Communique_SomeGroup struct { | ||||
| 	Member           *string `protobuf:"bytes,15,opt,name=member" json:"member,omitempty"` | ||||
| 	XXX_unrecognized []byte  `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Communique_SomeGroup) Reset()         { *m = Communique_SomeGroup{} } | ||||
| func (m *Communique_SomeGroup) String() string { return proto.CompactTextString(m) } | ||||
| func (*Communique_SomeGroup) ProtoMessage()    {} | ||||
|  | ||||
| func (m *Communique_SomeGroup) GetMember() string { | ||||
| 	if m != nil && m.Member != nil { | ||||
| 		return *m.Member | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type Communique_Delta struct { | ||||
| 	XXX_unrecognized []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Communique_Delta) Reset()         { *m = Communique_Delta{} } | ||||
| func (m *Communique_Delta) String() string { return proto.CompactTextString(m) } | ||||
| func (*Communique_Delta) ProtoMessage()    {} | ||||
|  | ||||
| var E_Tag = &proto.ExtensionDesc{ | ||||
| 	ExtendedType:  (*Reply)(nil), | ||||
| 	ExtensionType: (*string)(nil), | ||||
| 	Field:         103, | ||||
| 	Name:          "my.test.tag", | ||||
| 	Tag:           "bytes,103,opt,name=tag", | ||||
| } | ||||
|  | ||||
| var E_Donut = &proto.ExtensionDesc{ | ||||
| 	ExtendedType:  (*Reply)(nil), | ||||
| 	ExtensionType: (*OtherReplyExtensions)(nil), | ||||
| 	Field:         106, | ||||
| 	Name:          "my.test.donut", | ||||
| 	Tag:           "bytes,106,opt,name=donut", | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterType((*Request)(nil), "my.test.Request") | ||||
| 	proto.RegisterType((*Request_SomeGroup)(nil), "my.test.Request.SomeGroup") | ||||
| 	proto.RegisterType((*Reply)(nil), "my.test.Reply") | ||||
| 	proto.RegisterType((*Reply_Entry)(nil), "my.test.Reply.Entry") | ||||
| 	proto.RegisterType((*OtherBase)(nil), "my.test.OtherBase") | ||||
| 	proto.RegisterType((*ReplyExtensions)(nil), "my.test.ReplyExtensions") | ||||
| 	proto.RegisterType((*OtherReplyExtensions)(nil), "my.test.OtherReplyExtensions") | ||||
| 	proto.RegisterType((*OldReply)(nil), "my.test.OldReply") | ||||
| 	proto.RegisterType((*Communique)(nil), "my.test.Communique") | ||||
| 	proto.RegisterType((*Communique_SomeGroup)(nil), "my.test.Communique.SomeGroup") | ||||
| 	proto.RegisterType((*Communique_Delta)(nil), "my.test.Communique.Delta") | ||||
| 	proto.RegisterEnum("my.test.HatType", HatType_name, HatType_value) | ||||
| 	proto.RegisterEnum("my.test.Days", Days_name, Days_value) | ||||
| 	proto.RegisterEnum("my.test.Request_Color", Request_Color_name, Request_Color_value) | ||||
| 	proto.RegisterEnum("my.test.Reply_Entry_Game", Reply_Entry_Game_name, Reply_Entry_Game_value) | ||||
| 	proto.RegisterExtension(E_ReplyExtensions_Time) | ||||
| 	proto.RegisterExtension(E_ReplyExtensions_Carrot) | ||||
| 	proto.RegisterExtension(E_ReplyExtensions_Donut) | ||||
| 	proto.RegisterExtension(E_Tag) | ||||
| 	proto.RegisterExtension(E_Donut) | ||||
| } | ||||
							
								
								
									
										866
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										866
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,866 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: my_test/test.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| /* | ||||
| Package my_test is a generated protocol buffer package. | ||||
|  | ||||
| This package holds interesting messages. | ||||
|  | ||||
| It is generated from these files: | ||||
| 	my_test/test.proto | ||||
|  | ||||
| It has these top-level messages: | ||||
| 	Request | ||||
| 	Reply | ||||
| 	OtherBase | ||||
| 	ReplyExtensions | ||||
| 	OtherReplyExtensions | ||||
| 	OldReply | ||||
| 	Communique | ||||
| */ | ||||
| package my_test | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import fmt "fmt" | ||||
| import math "math" | ||||
| import _ "github.com/golang/protobuf/protoc-gen-go/testdata/multi" | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = fmt.Errorf | ||||
| var _ = math.Inf | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the proto package it is being compiled against. | ||||
| // A compilation error at this line likely means your copy of the | ||||
| // proto package needs to be updated. | ||||
| const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package | ||||
|  | ||||
| type HatType int32 | ||||
|  | ||||
| const ( | ||||
| 	// deliberately skipping 0 | ||||
| 	HatType_FEDORA HatType = 1 | ||||
| 	HatType_FEZ    HatType = 2 | ||||
| ) | ||||
|  | ||||
| var HatType_name = map[int32]string{ | ||||
| 	1: "FEDORA", | ||||
| 	2: "FEZ", | ||||
| } | ||||
| var HatType_value = map[string]int32{ | ||||
| 	"FEDORA": 1, | ||||
| 	"FEZ":    2, | ||||
| } | ||||
|  | ||||
| func (x HatType) Enum() *HatType { | ||||
| 	p := new(HatType) | ||||
| 	*p = x | ||||
| 	return p | ||||
| } | ||||
| func (x HatType) String() string { | ||||
| 	return proto.EnumName(HatType_name, int32(x)) | ||||
| } | ||||
| func (x *HatType) UnmarshalJSON(data []byte) error { | ||||
| 	value, err := proto.UnmarshalJSONEnum(HatType_value, data, "HatType") | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*x = HatType(value) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // This enum represents days of the week. | ||||
| type Days int32 | ||||
|  | ||||
| const ( | ||||
| 	Days_MONDAY  Days = 1 | ||||
| 	Days_TUESDAY Days = 2 | ||||
| 	Days_LUNDI   Days = 1 | ||||
| ) | ||||
|  | ||||
| var Days_name = map[int32]string{ | ||||
| 	1: "MONDAY", | ||||
| 	2: "TUESDAY", | ||||
| 	// Duplicate value: 1: "LUNDI", | ||||
| } | ||||
| var Days_value = map[string]int32{ | ||||
| 	"MONDAY":  1, | ||||
| 	"TUESDAY": 2, | ||||
| 	"LUNDI":   1, | ||||
| } | ||||
|  | ||||
| func (x Days) Enum() *Days { | ||||
| 	p := new(Days) | ||||
| 	*p = x | ||||
| 	return p | ||||
| } | ||||
| func (x Days) String() string { | ||||
| 	return proto.EnumName(Days_name, int32(x)) | ||||
| } | ||||
| func (x *Days) UnmarshalJSON(data []byte) error { | ||||
| 	value, err := proto.UnmarshalJSONEnum(Days_value, data, "Days") | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*x = Days(value) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type Request_Color int32 | ||||
|  | ||||
| const ( | ||||
| 	Request_RED   Request_Color = 0 | ||||
| 	Request_GREEN Request_Color = 1 | ||||
| 	Request_BLUE  Request_Color = 2 | ||||
| ) | ||||
|  | ||||
| var Request_Color_name = map[int32]string{ | ||||
| 	0: "RED", | ||||
| 	1: "GREEN", | ||||
| 	2: "BLUE", | ||||
| } | ||||
| var Request_Color_value = map[string]int32{ | ||||
| 	"RED":   0, | ||||
| 	"GREEN": 1, | ||||
| 	"BLUE":  2, | ||||
| } | ||||
|  | ||||
| func (x Request_Color) Enum() *Request_Color { | ||||
| 	p := new(Request_Color) | ||||
| 	*p = x | ||||
| 	return p | ||||
| } | ||||
| func (x Request_Color) String() string { | ||||
| 	return proto.EnumName(Request_Color_name, int32(x)) | ||||
| } | ||||
| func (x *Request_Color) UnmarshalJSON(data []byte) error { | ||||
| 	value, err := proto.UnmarshalJSONEnum(Request_Color_value, data, "Request_Color") | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*x = Request_Color(value) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type Reply_Entry_Game int32 | ||||
|  | ||||
| const ( | ||||
| 	Reply_Entry_FOOTBALL Reply_Entry_Game = 1 | ||||
| 	Reply_Entry_TENNIS   Reply_Entry_Game = 2 | ||||
| ) | ||||
|  | ||||
| var Reply_Entry_Game_name = map[int32]string{ | ||||
| 	1: "FOOTBALL", | ||||
| 	2: "TENNIS", | ||||
| } | ||||
| var Reply_Entry_Game_value = map[string]int32{ | ||||
| 	"FOOTBALL": 1, | ||||
| 	"TENNIS":   2, | ||||
| } | ||||
|  | ||||
| func (x Reply_Entry_Game) Enum() *Reply_Entry_Game { | ||||
| 	p := new(Reply_Entry_Game) | ||||
| 	*p = x | ||||
| 	return p | ||||
| } | ||||
| func (x Reply_Entry_Game) String() string { | ||||
| 	return proto.EnumName(Reply_Entry_Game_name, int32(x)) | ||||
| } | ||||
| func (x *Reply_Entry_Game) UnmarshalJSON(data []byte) error { | ||||
| 	value, err := proto.UnmarshalJSONEnum(Reply_Entry_Game_value, data, "Reply_Entry_Game") | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*x = Reply_Entry_Game(value) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // This is a message that might be sent somewhere. | ||||
| type Request struct { | ||||
| 	Key []int64 `protobuf:"varint,1,rep,name=key" json:"key,omitempty"` | ||||
| 	//  optional imp.ImportedMessage imported_message = 2; | ||||
| 	Hue *Request_Color `protobuf:"varint,3,opt,name=hue,enum=my.test.Request_Color" json:"hue,omitempty"` | ||||
| 	Hat *HatType       `protobuf:"varint,4,opt,name=hat,enum=my.test.HatType,def=1" json:"hat,omitempty"` | ||||
| 	//  optional imp.ImportedMessage.Owner owner = 6; | ||||
| 	Deadline  *float32           `protobuf:"fixed32,7,opt,name=deadline,def=inf" json:"deadline,omitempty"` | ||||
| 	Somegroup *Request_SomeGroup `protobuf:"group,8,opt,name=SomeGroup,json=somegroup" json:"somegroup,omitempty"` | ||||
| 	// This is a map field. It will generate map[int32]string. | ||||
| 	NameMapping map[int32]string `protobuf:"bytes,14,rep,name=name_mapping,json=nameMapping" json:"name_mapping,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` | ||||
| 	// This is a map field whose value type is a message. | ||||
| 	MsgMapping map[int64]*Reply `protobuf:"bytes,15,rep,name=msg_mapping,json=msgMapping" json:"msg_mapping,omitempty" protobuf_key:"zigzag64,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` | ||||
| 	Reset_     *int32           `protobuf:"varint,12,opt,name=reset" json:"reset,omitempty"` | ||||
| 	// This field should not conflict with any getters. | ||||
| 	GetKey_          *string `protobuf:"bytes,16,opt,name=get_key,json=getKey" json:"get_key,omitempty"` | ||||
| 	XXX_unrecognized []byte  `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Request) Reset()         { *m = Request{} } | ||||
| func (m *Request) String() string { return proto.CompactTextString(m) } | ||||
| func (*Request) ProtoMessage()    {} | ||||
|  | ||||
| const Default_Request_Hat HatType = HatType_FEDORA | ||||
|  | ||||
| var Default_Request_Deadline float32 = float32(math.Inf(1)) | ||||
|  | ||||
| func (m *Request) GetKey() []int64 { | ||||
| 	if m != nil { | ||||
| 		return m.Key | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Request) GetHue() Request_Color { | ||||
| 	if m != nil && m.Hue != nil { | ||||
| 		return *m.Hue | ||||
| 	} | ||||
| 	return Request_RED | ||||
| } | ||||
|  | ||||
| func (m *Request) GetHat() HatType { | ||||
| 	if m != nil && m.Hat != nil { | ||||
| 		return *m.Hat | ||||
| 	} | ||||
| 	return Default_Request_Hat | ||||
| } | ||||
|  | ||||
| func (m *Request) GetDeadline() float32 { | ||||
| 	if m != nil && m.Deadline != nil { | ||||
| 		return *m.Deadline | ||||
| 	} | ||||
| 	return Default_Request_Deadline | ||||
| } | ||||
|  | ||||
| func (m *Request) GetSomegroup() *Request_SomeGroup { | ||||
| 	if m != nil { | ||||
| 		return m.Somegroup | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Request) GetNameMapping() map[int32]string { | ||||
| 	if m != nil { | ||||
| 		return m.NameMapping | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Request) GetMsgMapping() map[int64]*Reply { | ||||
| 	if m != nil { | ||||
| 		return m.MsgMapping | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Request) GetReset_() int32 { | ||||
| 	if m != nil && m.Reset_ != nil { | ||||
| 		return *m.Reset_ | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Request) GetGetKey_() string { | ||||
| 	if m != nil && m.GetKey_ != nil { | ||||
| 		return *m.GetKey_ | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type Request_SomeGroup struct { | ||||
| 	GroupField       *int32 `protobuf:"varint,9,opt,name=group_field,json=groupField" json:"group_field,omitempty"` | ||||
| 	XXX_unrecognized []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Request_SomeGroup) Reset()         { *m = Request_SomeGroup{} } | ||||
| func (m *Request_SomeGroup) String() string { return proto.CompactTextString(m) } | ||||
| func (*Request_SomeGroup) ProtoMessage()    {} | ||||
|  | ||||
| func (m *Request_SomeGroup) GetGroupField() int32 { | ||||
| 	if m != nil && m.GroupField != nil { | ||||
| 		return *m.GroupField | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| type Reply struct { | ||||
| 	Found                        []*Reply_Entry `protobuf:"bytes,1,rep,name=found" json:"found,omitempty"` | ||||
| 	CompactKeys                  []int32        `protobuf:"varint,2,rep,packed,name=compact_keys,json=compactKeys" json:"compact_keys,omitempty"` | ||||
| 	proto.XXX_InternalExtensions `json:"-"` | ||||
| 	XXX_unrecognized             []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Reply) Reset()         { *m = Reply{} } | ||||
| func (m *Reply) String() string { return proto.CompactTextString(m) } | ||||
| func (*Reply) ProtoMessage()    {} | ||||
|  | ||||
| var extRange_Reply = []proto.ExtensionRange{ | ||||
| 	{100, 536870911}, | ||||
| } | ||||
|  | ||||
| func (*Reply) ExtensionRangeArray() []proto.ExtensionRange { | ||||
| 	return extRange_Reply | ||||
| } | ||||
|  | ||||
| func (m *Reply) GetFound() []*Reply_Entry { | ||||
| 	if m != nil { | ||||
| 		return m.Found | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Reply) GetCompactKeys() []int32 { | ||||
| 	if m != nil { | ||||
| 		return m.CompactKeys | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type Reply_Entry struct { | ||||
| 	KeyThatNeeds_1234Camel_CasIng *int64 `protobuf:"varint,1,req,name=key_that_needs_1234camel_CasIng,json=keyThatNeeds1234camelCasIng" json:"key_that_needs_1234camel_CasIng,omitempty"` | ||||
| 	Value                         *int64 `protobuf:"varint,2,opt,name=value,def=7" json:"value,omitempty"` | ||||
| 	XMyFieldName_2                *int64 `protobuf:"varint,3,opt,name=_my_field_name_2,json=myFieldName2" json:"_my_field_name_2,omitempty"` | ||||
| 	XXX_unrecognized              []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Reply_Entry) Reset()         { *m = Reply_Entry{} } | ||||
| func (m *Reply_Entry) String() string { return proto.CompactTextString(m) } | ||||
| func (*Reply_Entry) ProtoMessage()    {} | ||||
|  | ||||
| const Default_Reply_Entry_Value int64 = 7 | ||||
|  | ||||
| func (m *Reply_Entry) GetKeyThatNeeds_1234Camel_CasIng() int64 { | ||||
| 	if m != nil && m.KeyThatNeeds_1234Camel_CasIng != nil { | ||||
| 		return *m.KeyThatNeeds_1234Camel_CasIng | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Reply_Entry) GetValue() int64 { | ||||
| 	if m != nil && m.Value != nil { | ||||
| 		return *m.Value | ||||
| 	} | ||||
| 	return Default_Reply_Entry_Value | ||||
| } | ||||
|  | ||||
| func (m *Reply_Entry) GetXMyFieldName_2() int64 { | ||||
| 	if m != nil && m.XMyFieldName_2 != nil { | ||||
| 		return *m.XMyFieldName_2 | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| type OtherBase struct { | ||||
| 	Name                         *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` | ||||
| 	proto.XXX_InternalExtensions `json:"-"` | ||||
| 	XXX_unrecognized             []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *OtherBase) Reset()         { *m = OtherBase{} } | ||||
| func (m *OtherBase) String() string { return proto.CompactTextString(m) } | ||||
| func (*OtherBase) ProtoMessage()    {} | ||||
|  | ||||
| var extRange_OtherBase = []proto.ExtensionRange{ | ||||
| 	{100, 536870911}, | ||||
| } | ||||
|  | ||||
| func (*OtherBase) ExtensionRangeArray() []proto.ExtensionRange { | ||||
| 	return extRange_OtherBase | ||||
| } | ||||
|  | ||||
| func (m *OtherBase) GetName() string { | ||||
| 	if m != nil && m.Name != nil { | ||||
| 		return *m.Name | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type ReplyExtensions struct { | ||||
| 	XXX_unrecognized []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *ReplyExtensions) Reset()         { *m = ReplyExtensions{} } | ||||
| func (m *ReplyExtensions) String() string { return proto.CompactTextString(m) } | ||||
| func (*ReplyExtensions) ProtoMessage()    {} | ||||
|  | ||||
| var E_ReplyExtensions_Time = &proto.ExtensionDesc{ | ||||
| 	ExtendedType:  (*Reply)(nil), | ||||
| 	ExtensionType: (*float64)(nil), | ||||
| 	Field:         101, | ||||
| 	Name:          "my.test.ReplyExtensions.time", | ||||
| 	Tag:           "fixed64,101,opt,name=time", | ||||
| } | ||||
|  | ||||
| var E_ReplyExtensions_Carrot = &proto.ExtensionDesc{ | ||||
| 	ExtendedType:  (*Reply)(nil), | ||||
| 	ExtensionType: (*ReplyExtensions)(nil), | ||||
| 	Field:         105, | ||||
| 	Name:          "my.test.ReplyExtensions.carrot", | ||||
| 	Tag:           "bytes,105,opt,name=carrot", | ||||
| } | ||||
|  | ||||
| var E_ReplyExtensions_Donut = &proto.ExtensionDesc{ | ||||
| 	ExtendedType:  (*OtherBase)(nil), | ||||
| 	ExtensionType: (*ReplyExtensions)(nil), | ||||
| 	Field:         101, | ||||
| 	Name:          "my.test.ReplyExtensions.donut", | ||||
| 	Tag:           "bytes,101,opt,name=donut", | ||||
| } | ||||
|  | ||||
| type OtherReplyExtensions struct { | ||||
| 	Key              *int32 `protobuf:"varint,1,opt,name=key" json:"key,omitempty"` | ||||
| 	XXX_unrecognized []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *OtherReplyExtensions) Reset()         { *m = OtherReplyExtensions{} } | ||||
| func (m *OtherReplyExtensions) String() string { return proto.CompactTextString(m) } | ||||
| func (*OtherReplyExtensions) ProtoMessage()    {} | ||||
|  | ||||
| func (m *OtherReplyExtensions) GetKey() int32 { | ||||
| 	if m != nil && m.Key != nil { | ||||
| 		return *m.Key | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| type OldReply struct { | ||||
| 	proto.XXX_InternalExtensions `json:"-"` | ||||
| 	XXX_unrecognized             []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *OldReply) Reset()         { *m = OldReply{} } | ||||
| func (m *OldReply) String() string { return proto.CompactTextString(m) } | ||||
| func (*OldReply) ProtoMessage()    {} | ||||
|  | ||||
| func (m *OldReply) Marshal() ([]byte, error) { | ||||
| 	return proto.MarshalMessageSet(&m.XXX_InternalExtensions) | ||||
| } | ||||
| func (m *OldReply) Unmarshal(buf []byte) error { | ||||
| 	return proto.UnmarshalMessageSet(buf, &m.XXX_InternalExtensions) | ||||
| } | ||||
| func (m *OldReply) MarshalJSON() ([]byte, error) { | ||||
| 	return proto.MarshalMessageSetJSON(&m.XXX_InternalExtensions) | ||||
| } | ||||
| func (m *OldReply) UnmarshalJSON(buf []byte) error { | ||||
| 	return proto.UnmarshalMessageSetJSON(buf, &m.XXX_InternalExtensions) | ||||
| } | ||||
|  | ||||
| // ensure OldReply satisfies proto.Marshaler and proto.Unmarshaler | ||||
| var _ proto.Marshaler = (*OldReply)(nil) | ||||
| var _ proto.Unmarshaler = (*OldReply)(nil) | ||||
|  | ||||
| var extRange_OldReply = []proto.ExtensionRange{ | ||||
| 	{100, 2147483646}, | ||||
| } | ||||
|  | ||||
| func (*OldReply) ExtensionRangeArray() []proto.ExtensionRange { | ||||
| 	return extRange_OldReply | ||||
| } | ||||
|  | ||||
| type Communique struct { | ||||
| 	MakeMeCry *bool `protobuf:"varint,1,opt,name=make_me_cry,json=makeMeCry" json:"make_me_cry,omitempty"` | ||||
| 	// This is a oneof, called "union". | ||||
| 	// | ||||
| 	// Types that are valid to be assigned to Union: | ||||
| 	//	*Communique_Number | ||||
| 	//	*Communique_Name | ||||
| 	//	*Communique_Data | ||||
| 	//	*Communique_TempC | ||||
| 	//	*Communique_Height | ||||
| 	//	*Communique_Today | ||||
| 	//	*Communique_Maybe | ||||
| 	//	*Communique_Delta_ | ||||
| 	//	*Communique_Msg | ||||
| 	//	*Communique_Somegroup | ||||
| 	Union            isCommunique_Union `protobuf_oneof:"union"` | ||||
| 	XXX_unrecognized []byte             `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Communique) Reset()         { *m = Communique{} } | ||||
| func (m *Communique) String() string { return proto.CompactTextString(m) } | ||||
| func (*Communique) ProtoMessage()    {} | ||||
|  | ||||
| type isCommunique_Union interface { | ||||
| 	isCommunique_Union() | ||||
| } | ||||
|  | ||||
| type Communique_Number struct { | ||||
| 	Number int32 `protobuf:"varint,5,opt,name=number,oneof"` | ||||
| } | ||||
| type Communique_Name struct { | ||||
| 	Name string `protobuf:"bytes,6,opt,name=name,oneof"` | ||||
| } | ||||
| type Communique_Data struct { | ||||
| 	Data []byte `protobuf:"bytes,7,opt,name=data,oneof"` | ||||
| } | ||||
| type Communique_TempC struct { | ||||
| 	TempC float64 `protobuf:"fixed64,8,opt,name=temp_c,json=tempC,oneof"` | ||||
| } | ||||
| type Communique_Height struct { | ||||
| 	Height float32 `protobuf:"fixed32,9,opt,name=height,oneof"` | ||||
| } | ||||
| type Communique_Today struct { | ||||
| 	Today Days `protobuf:"varint,10,opt,name=today,enum=my.test.Days,oneof"` | ||||
| } | ||||
| type Communique_Maybe struct { | ||||
| 	Maybe bool `protobuf:"varint,11,opt,name=maybe,oneof"` | ||||
| } | ||||
| type Communique_Delta_ struct { | ||||
| 	Delta int32 `protobuf:"zigzag32,12,opt,name=delta,oneof"` | ||||
| } | ||||
| type Communique_Msg struct { | ||||
| 	Msg *Reply `protobuf:"bytes,13,opt,name=msg,oneof"` | ||||
| } | ||||
| type Communique_Somegroup struct { | ||||
| 	Somegroup *Communique_SomeGroup `protobuf:"group,14,opt,name=SomeGroup,json=somegroup,oneof"` | ||||
| } | ||||
|  | ||||
| func (*Communique_Number) isCommunique_Union()    {} | ||||
| func (*Communique_Name) isCommunique_Union()      {} | ||||
| func (*Communique_Data) isCommunique_Union()      {} | ||||
| func (*Communique_TempC) isCommunique_Union()     {} | ||||
| func (*Communique_Height) isCommunique_Union()    {} | ||||
| func (*Communique_Today) isCommunique_Union()     {} | ||||
| func (*Communique_Maybe) isCommunique_Union()     {} | ||||
| func (*Communique_Delta_) isCommunique_Union()    {} | ||||
| func (*Communique_Msg) isCommunique_Union()       {} | ||||
| func (*Communique_Somegroup) isCommunique_Union() {} | ||||
|  | ||||
| func (m *Communique) GetUnion() isCommunique_Union { | ||||
| 	if m != nil { | ||||
| 		return m.Union | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetMakeMeCry() bool { | ||||
| 	if m != nil && m.MakeMeCry != nil { | ||||
| 		return *m.MakeMeCry | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetNumber() int32 { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Number); ok { | ||||
| 		return x.Number | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetName() string { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Name); ok { | ||||
| 		return x.Name | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetData() []byte { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Data); ok { | ||||
| 		return x.Data | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetTempC() float64 { | ||||
| 	if x, ok := m.GetUnion().(*Communique_TempC); ok { | ||||
| 		return x.TempC | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetHeight() float32 { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Height); ok { | ||||
| 		return x.Height | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetToday() Days { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Today); ok { | ||||
| 		return x.Today | ||||
| 	} | ||||
| 	return Days_MONDAY | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetMaybe() bool { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Maybe); ok { | ||||
| 		return x.Maybe | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetDelta() int32 { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Delta_); ok { | ||||
| 		return x.Delta | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetMsg() *Reply { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Msg); ok { | ||||
| 		return x.Msg | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Communique) GetSomegroup() *Communique_SomeGroup { | ||||
| 	if x, ok := m.GetUnion().(*Communique_Somegroup); ok { | ||||
| 		return x.Somegroup | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // XXX_OneofFuncs is for the internal use of the proto package. | ||||
| func (*Communique) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { | ||||
| 	return _Communique_OneofMarshaler, _Communique_OneofUnmarshaler, _Communique_OneofSizer, []interface{}{ | ||||
| 		(*Communique_Number)(nil), | ||||
| 		(*Communique_Name)(nil), | ||||
| 		(*Communique_Data)(nil), | ||||
| 		(*Communique_TempC)(nil), | ||||
| 		(*Communique_Height)(nil), | ||||
| 		(*Communique_Today)(nil), | ||||
| 		(*Communique_Maybe)(nil), | ||||
| 		(*Communique_Delta_)(nil), | ||||
| 		(*Communique_Msg)(nil), | ||||
| 		(*Communique_Somegroup)(nil), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func _Communique_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { | ||||
| 	m := msg.(*Communique) | ||||
| 	// union | ||||
| 	switch x := m.Union.(type) { | ||||
| 	case *Communique_Number: | ||||
| 		b.EncodeVarint(5<<3 | proto.WireVarint) | ||||
| 		b.EncodeVarint(uint64(x.Number)) | ||||
| 	case *Communique_Name: | ||||
| 		b.EncodeVarint(6<<3 | proto.WireBytes) | ||||
| 		b.EncodeStringBytes(x.Name) | ||||
| 	case *Communique_Data: | ||||
| 		b.EncodeVarint(7<<3 | proto.WireBytes) | ||||
| 		b.EncodeRawBytes(x.Data) | ||||
| 	case *Communique_TempC: | ||||
| 		b.EncodeVarint(8<<3 | proto.WireFixed64) | ||||
| 		b.EncodeFixed64(math.Float64bits(x.TempC)) | ||||
| 	case *Communique_Height: | ||||
| 		b.EncodeVarint(9<<3 | proto.WireFixed32) | ||||
| 		b.EncodeFixed32(uint64(math.Float32bits(x.Height))) | ||||
| 	case *Communique_Today: | ||||
| 		b.EncodeVarint(10<<3 | proto.WireVarint) | ||||
| 		b.EncodeVarint(uint64(x.Today)) | ||||
| 	case *Communique_Maybe: | ||||
| 		t := uint64(0) | ||||
| 		if x.Maybe { | ||||
| 			t = 1 | ||||
| 		} | ||||
| 		b.EncodeVarint(11<<3 | proto.WireVarint) | ||||
| 		b.EncodeVarint(t) | ||||
| 	case *Communique_Delta_: | ||||
| 		b.EncodeVarint(12<<3 | proto.WireVarint) | ||||
| 		b.EncodeZigzag32(uint64(x.Delta)) | ||||
| 	case *Communique_Msg: | ||||
| 		b.EncodeVarint(13<<3 | proto.WireBytes) | ||||
| 		if err := b.EncodeMessage(x.Msg); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	case *Communique_Somegroup: | ||||
| 		b.EncodeVarint(14<<3 | proto.WireStartGroup) | ||||
| 		if err := b.Marshal(x.Somegroup); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		b.EncodeVarint(14<<3 | proto.WireEndGroup) | ||||
| 	case nil: | ||||
| 	default: | ||||
| 		return fmt.Errorf("Communique.Union has unexpected type %T", x) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func _Communique_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { | ||||
| 	m := msg.(*Communique) | ||||
| 	switch tag { | ||||
| 	case 5: // union.number | ||||
| 		if wire != proto.WireVarint { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeVarint() | ||||
| 		m.Union = &Communique_Number{int32(x)} | ||||
| 		return true, err | ||||
| 	case 6: // union.name | ||||
| 		if wire != proto.WireBytes { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeStringBytes() | ||||
| 		m.Union = &Communique_Name{x} | ||||
| 		return true, err | ||||
| 	case 7: // union.data | ||||
| 		if wire != proto.WireBytes { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeRawBytes(true) | ||||
| 		m.Union = &Communique_Data{x} | ||||
| 		return true, err | ||||
| 	case 8: // union.temp_c | ||||
| 		if wire != proto.WireFixed64 { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeFixed64() | ||||
| 		m.Union = &Communique_TempC{math.Float64frombits(x)} | ||||
| 		return true, err | ||||
| 	case 9: // union.height | ||||
| 		if wire != proto.WireFixed32 { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeFixed32() | ||||
| 		m.Union = &Communique_Height{math.Float32frombits(uint32(x))} | ||||
| 		return true, err | ||||
| 	case 10: // union.today | ||||
| 		if wire != proto.WireVarint { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeVarint() | ||||
| 		m.Union = &Communique_Today{Days(x)} | ||||
| 		return true, err | ||||
| 	case 11: // union.maybe | ||||
| 		if wire != proto.WireVarint { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeVarint() | ||||
| 		m.Union = &Communique_Maybe{x != 0} | ||||
| 		return true, err | ||||
| 	case 12: // union.delta | ||||
| 		if wire != proto.WireVarint { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeZigzag32() | ||||
| 		m.Union = &Communique_Delta_{int32(x)} | ||||
| 		return true, err | ||||
| 	case 13: // union.msg | ||||
| 		if wire != proto.WireBytes { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		msg := new(Reply) | ||||
| 		err := b.DecodeMessage(msg) | ||||
| 		m.Union = &Communique_Msg{msg} | ||||
| 		return true, err | ||||
| 	case 14: // union.somegroup | ||||
| 		if wire != proto.WireStartGroup { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		msg := new(Communique_SomeGroup) | ||||
| 		err := b.DecodeGroup(msg) | ||||
| 		m.Union = &Communique_Somegroup{msg} | ||||
| 		return true, err | ||||
| 	default: | ||||
| 		return false, nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func _Communique_OneofSizer(msg proto.Message) (n int) { | ||||
| 	m := msg.(*Communique) | ||||
| 	// union | ||||
| 	switch x := m.Union.(type) { | ||||
| 	case *Communique_Number: | ||||
| 		n += proto.SizeVarint(5<<3 | proto.WireVarint) | ||||
| 		n += proto.SizeVarint(uint64(x.Number)) | ||||
| 	case *Communique_Name: | ||||
| 		n += proto.SizeVarint(6<<3 | proto.WireBytes) | ||||
| 		n += proto.SizeVarint(uint64(len(x.Name))) | ||||
| 		n += len(x.Name) | ||||
| 	case *Communique_Data: | ||||
| 		n += proto.SizeVarint(7<<3 | proto.WireBytes) | ||||
| 		n += proto.SizeVarint(uint64(len(x.Data))) | ||||
| 		n += len(x.Data) | ||||
| 	case *Communique_TempC: | ||||
| 		n += proto.SizeVarint(8<<3 | proto.WireFixed64) | ||||
| 		n += 8 | ||||
| 	case *Communique_Height: | ||||
| 		n += proto.SizeVarint(9<<3 | proto.WireFixed32) | ||||
| 		n += 4 | ||||
| 	case *Communique_Today: | ||||
| 		n += proto.SizeVarint(10<<3 | proto.WireVarint) | ||||
| 		n += proto.SizeVarint(uint64(x.Today)) | ||||
| 	case *Communique_Maybe: | ||||
| 		n += proto.SizeVarint(11<<3 | proto.WireVarint) | ||||
| 		n += 1 | ||||
| 	case *Communique_Delta_: | ||||
| 		n += proto.SizeVarint(12<<3 | proto.WireVarint) | ||||
| 		n += proto.SizeVarint(uint64((uint32(x.Delta) << 1) ^ uint32((int32(x.Delta) >> 31)))) | ||||
| 	case *Communique_Msg: | ||||
| 		s := proto.Size(x.Msg) | ||||
| 		n += proto.SizeVarint(13<<3 | proto.WireBytes) | ||||
| 		n += proto.SizeVarint(uint64(s)) | ||||
| 		n += s | ||||
| 	case *Communique_Somegroup: | ||||
| 		n += proto.SizeVarint(14<<3 | proto.WireStartGroup) | ||||
| 		n += proto.Size(x.Somegroup) | ||||
| 		n += proto.SizeVarint(14<<3 | proto.WireEndGroup) | ||||
| 	case nil: | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| type Communique_SomeGroup struct { | ||||
| 	Member           *string `protobuf:"bytes,15,opt,name=member" json:"member,omitempty"` | ||||
| 	XXX_unrecognized []byte  `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Communique_SomeGroup) Reset()         { *m = Communique_SomeGroup{} } | ||||
| func (m *Communique_SomeGroup) String() string { return proto.CompactTextString(m) } | ||||
| func (*Communique_SomeGroup) ProtoMessage()    {} | ||||
|  | ||||
| func (m *Communique_SomeGroup) GetMember() string { | ||||
| 	if m != nil && m.Member != nil { | ||||
| 		return *m.Member | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| type Communique_Delta struct { | ||||
| 	XXX_unrecognized []byte `json:"-"` | ||||
| } | ||||
|  | ||||
| func (m *Communique_Delta) Reset()         { *m = Communique_Delta{} } | ||||
| func (m *Communique_Delta) String() string { return proto.CompactTextString(m) } | ||||
| func (*Communique_Delta) ProtoMessage()    {} | ||||
|  | ||||
| var E_Tag = &proto.ExtensionDesc{ | ||||
| 	ExtendedType:  (*Reply)(nil), | ||||
| 	ExtensionType: (*string)(nil), | ||||
| 	Field:         103, | ||||
| 	Name:          "my.test.tag", | ||||
| 	Tag:           "bytes,103,opt,name=tag", | ||||
| } | ||||
|  | ||||
| var E_Donut = &proto.ExtensionDesc{ | ||||
| 	ExtendedType:  (*Reply)(nil), | ||||
| 	ExtensionType: (*OtherReplyExtensions)(nil), | ||||
| 	Field:         106, | ||||
| 	Name:          "my.test.donut", | ||||
| 	Tag:           "bytes,106,opt,name=donut", | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterType((*Request)(nil), "my.test.Request") | ||||
| 	proto.RegisterType((*Request_SomeGroup)(nil), "my.test.Request.SomeGroup") | ||||
| 	proto.RegisterType((*Reply)(nil), "my.test.Reply") | ||||
| 	proto.RegisterType((*Reply_Entry)(nil), "my.test.Reply.Entry") | ||||
| 	proto.RegisterType((*OtherBase)(nil), "my.test.OtherBase") | ||||
| 	proto.RegisterType((*ReplyExtensions)(nil), "my.test.ReplyExtensions") | ||||
| 	proto.RegisterType((*OtherReplyExtensions)(nil), "my.test.OtherReplyExtensions") | ||||
| 	proto.RegisterType((*OldReply)(nil), "my.test.OldReply") | ||||
| 	proto.RegisterType((*Communique)(nil), "my.test.Communique") | ||||
| 	proto.RegisterType((*Communique_SomeGroup)(nil), "my.test.Communique.SomeGroup") | ||||
| 	proto.RegisterType((*Communique_Delta)(nil), "my.test.Communique.Delta") | ||||
| 	proto.RegisterEnum("my.test.HatType", HatType_name, HatType_value) | ||||
| 	proto.RegisterEnum("my.test.Days", Days_name, Days_value) | ||||
| 	proto.RegisterEnum("my.test.Request_Color", Request_Color_name, Request_Color_value) | ||||
| 	proto.RegisterEnum("my.test.Reply_Entry_Game", Reply_Entry_Game_name, Reply_Entry_Game_value) | ||||
| 	proto.RegisterExtension(E_ReplyExtensions_Time) | ||||
| 	proto.RegisterExtension(E_ReplyExtensions_Carrot) | ||||
| 	proto.RegisterExtension(E_ReplyExtensions_Donut) | ||||
| 	proto.RegisterExtension(E_Tag) | ||||
| 	proto.RegisterExtension(E_Donut) | ||||
| } | ||||
							
								
								
									
										156
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,156 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2010 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto2"; | ||||
|  | ||||
| // This package holds interesting messages. | ||||
| package my.test;  // dotted package name | ||||
|  | ||||
| //import "imp.proto"; | ||||
| import "multi/multi1.proto";  // unused import | ||||
|  | ||||
| enum HatType { | ||||
|   // deliberately skipping 0 | ||||
|   FEDORA = 1; | ||||
|   FEZ = 2; | ||||
| } | ||||
|  | ||||
| // This enum represents days of the week. | ||||
| enum Days { | ||||
|   option allow_alias = true; | ||||
|  | ||||
|   MONDAY = 1; | ||||
|   TUESDAY = 2; | ||||
|   LUNDI = 1;  // same value as MONDAY | ||||
| } | ||||
|  | ||||
| // This is a message that might be sent somewhere. | ||||
| message Request { | ||||
|   enum Color { | ||||
|     RED = 0; | ||||
|     GREEN = 1; | ||||
|     BLUE = 2; | ||||
|   } | ||||
|   repeated int64 key = 1; | ||||
| //  optional imp.ImportedMessage imported_message = 2; | ||||
|   optional Color hue = 3; // no default | ||||
|   optional HatType hat = 4 [default=FEDORA]; | ||||
| //  optional imp.ImportedMessage.Owner owner = 6; | ||||
|   optional float deadline = 7 [default=inf]; | ||||
|   optional group SomeGroup = 8 { | ||||
|     optional int32 group_field = 9; | ||||
|   } | ||||
|  | ||||
|   // These foreign types are in imp2.proto, | ||||
|   // which is publicly imported by imp.proto. | ||||
| //  optional imp.PubliclyImportedMessage pub = 10; | ||||
| //  optional imp.PubliclyImportedEnum pub_enum = 13 [default=HAIR]; | ||||
|  | ||||
|  | ||||
|   // This is a map field. It will generate map[int32]string. | ||||
|   map<int32, string> name_mapping = 14; | ||||
|   // This is a map field whose value type is a message. | ||||
|   map<sint64, Reply> msg_mapping = 15; | ||||
|  | ||||
|   optional int32 reset = 12; | ||||
|   // This field should not conflict with any getters. | ||||
|   optional string get_key = 16; | ||||
| } | ||||
|  | ||||
| message Reply { | ||||
|   message Entry { | ||||
|     required int64 key_that_needs_1234camel_CasIng = 1; | ||||
|     optional int64 value = 2 [default=7]; | ||||
|     optional int64 _my_field_name_2 = 3; | ||||
|     enum Game { | ||||
|       FOOTBALL = 1; | ||||
|       TENNIS = 2; | ||||
|     } | ||||
|   } | ||||
|   repeated Entry found = 1; | ||||
|   repeated int32 compact_keys = 2 [packed=true]; | ||||
|   extensions 100 to max; | ||||
| } | ||||
|  | ||||
| message OtherBase { | ||||
|   optional string name = 1; | ||||
|   extensions 100 to max; | ||||
| } | ||||
|  | ||||
| message ReplyExtensions { | ||||
|   extend Reply { | ||||
|     optional double time = 101; | ||||
|     optional ReplyExtensions carrot = 105; | ||||
|   } | ||||
|   extend OtherBase { | ||||
|     optional ReplyExtensions donut = 101; | ||||
|   } | ||||
| } | ||||
|  | ||||
| message OtherReplyExtensions { | ||||
|   optional int32 key = 1; | ||||
| } | ||||
|  | ||||
| // top-level extension | ||||
| extend Reply { | ||||
|   optional string tag = 103; | ||||
|   optional OtherReplyExtensions donut = 106; | ||||
| //  optional imp.ImportedMessage elephant = 107;  // extend with message from another file. | ||||
| } | ||||
|  | ||||
| message OldReply { | ||||
|   // Extensions will be encoded in MessageSet wire format. | ||||
|   option message_set_wire_format = true; | ||||
|   extensions 100 to max; | ||||
| } | ||||
|  | ||||
| message Communique { | ||||
|   optional bool make_me_cry = 1; | ||||
|  | ||||
|   // This is a oneof, called "union". | ||||
|   oneof union { | ||||
|     int32 number = 5; | ||||
|     string name = 6; | ||||
|     bytes data = 7; | ||||
|     double temp_c = 8; | ||||
|     float height = 9; | ||||
|     Days today = 10; | ||||
|     bool maybe = 11; | ||||
|     sint32 delta = 12;  // name will conflict with Delta below | ||||
|     Reply msg = 13; | ||||
|     group SomeGroup = 14 { | ||||
|       optional string member = 15; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   message Delta {} | ||||
| } | ||||
|  | ||||
							
								
								
									
										53
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/testdata/proto3.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2014 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto3"; | ||||
|  | ||||
| package proto3; | ||||
|  | ||||
| message Request { | ||||
|   enum Flavour { | ||||
|     SWEET = 0; | ||||
|     SOUR = 1; | ||||
|     UMAMI = 2; | ||||
|     GOPHERLICIOUS = 3; | ||||
|   } | ||||
|   string name = 1; | ||||
|   repeated int64 key = 2; | ||||
|   Flavour taste = 3; | ||||
|   Book book = 4; | ||||
|   repeated int64 unpacked = 5 [packed=false]; | ||||
| } | ||||
|  | ||||
| message Book { | ||||
|   string title = 1; | ||||
|   bytes raw_data = 2; | ||||
| } | ||||
							
								
								
									
										136
									
								
								vendor/github.com/golang/protobuf/ptypes/any.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								vendor/github.com/golang/protobuf/ptypes/any.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,136 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2016 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package ptypes | ||||
|  | ||||
| // This file implements functions to marshal proto.Message to/from | ||||
| // google.protobuf.Any message. | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"github.com/golang/protobuf/ptypes/any" | ||||
| ) | ||||
|  | ||||
| const googleApis = "type.googleapis.com/" | ||||
|  | ||||
| // AnyMessageName returns the name of the message contained in a google.protobuf.Any message. | ||||
| // | ||||
| // Note that regular type assertions should be done using the Is | ||||
| // function. AnyMessageName is provided for less common use cases like filtering a | ||||
| // sequence of Any messages based on a set of allowed message type names. | ||||
| func AnyMessageName(any *any.Any) (string, error) { | ||||
| 	slash := strings.LastIndex(any.TypeUrl, "/") | ||||
| 	if slash < 0 { | ||||
| 		return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl) | ||||
| 	} | ||||
| 	return any.TypeUrl[slash+1:], nil | ||||
| } | ||||
|  | ||||
| // MarshalAny takes the protocol buffer and encodes it into google.protobuf.Any. | ||||
| func MarshalAny(pb proto.Message) (*any.Any, error) { | ||||
| 	value, err := proto.Marshal(pb) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return &any.Any{TypeUrl: googleApis + proto.MessageName(pb), Value: value}, nil | ||||
| } | ||||
|  | ||||
| // DynamicAny is a value that can be passed to UnmarshalAny to automatically | ||||
| // allocate a proto.Message for the type specified in a google.protobuf.Any | ||||
| // message. The allocated message is stored in the embedded proto.Message. | ||||
| // | ||||
| // Example: | ||||
| // | ||||
| //   var x ptypes.DynamicAny | ||||
| //   if err := ptypes.UnmarshalAny(a, &x); err != nil { ... } | ||||
| //   fmt.Printf("unmarshaled message: %v", x.Message) | ||||
| type DynamicAny struct { | ||||
| 	proto.Message | ||||
| } | ||||
|  | ||||
| // Empty returns a new proto.Message of the type specified in a | ||||
| // google.protobuf.Any message. It returns an error if corresponding message | ||||
| // type isn't linked in. | ||||
| func Empty(any *any.Any) (proto.Message, error) { | ||||
| 	aname, err := AnyMessageName(any) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	t := proto.MessageType(aname) | ||||
| 	if t == nil { | ||||
| 		return nil, fmt.Errorf("any: message type %q isn't linked in", aname) | ||||
| 	} | ||||
| 	return reflect.New(t.Elem()).Interface().(proto.Message), nil | ||||
| } | ||||
|  | ||||
| // UnmarshalAny parses the protocol buffer representation in a google.protobuf.Any | ||||
| // message and places the decoded result in pb. It returns an error if type of | ||||
| // contents of Any message does not match type of pb message. | ||||
| // | ||||
| // pb can be a proto.Message, or a *DynamicAny. | ||||
| func UnmarshalAny(any *any.Any, pb proto.Message) error { | ||||
| 	if d, ok := pb.(*DynamicAny); ok { | ||||
| 		if d.Message == nil { | ||||
| 			var err error | ||||
| 			d.Message, err = Empty(any) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		return UnmarshalAny(any, d.Message) | ||||
| 	} | ||||
|  | ||||
| 	aname, err := AnyMessageName(any) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	mname := proto.MessageName(pb) | ||||
| 	if aname != mname { | ||||
| 		return fmt.Errorf("mismatched message type: got %q want %q", aname, mname) | ||||
| 	} | ||||
| 	return proto.Unmarshal(any.Value, pb) | ||||
| } | ||||
|  | ||||
| // Is returns true if any value contains a given message type. | ||||
| func Is(any *any.Any, pb proto.Message) bool { | ||||
| 	aname, err := AnyMessageName(any) | ||||
| 	if err != nil { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	return aname == proto.MessageName(pb) | ||||
| } | ||||
							
								
								
									
										155
									
								
								vendor/github.com/golang/protobuf/ptypes/any/any.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								vendor/github.com/golang/protobuf/ptypes/any/any.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,155 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: github.com/golang/protobuf/ptypes/any/any.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| /* | ||||
| Package any is a generated protocol buffer package. | ||||
|  | ||||
| It is generated from these files: | ||||
| 	github.com/golang/protobuf/ptypes/any/any.proto | ||||
|  | ||||
| It has these top-level messages: | ||||
| 	Any | ||||
| */ | ||||
| package any | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import fmt "fmt" | ||||
| import math "math" | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = fmt.Errorf | ||||
| var _ = math.Inf | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the proto package it is being compiled against. | ||||
| // A compilation error at this line likely means your copy of the | ||||
| // proto package needs to be updated. | ||||
| const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package | ||||
|  | ||||
| // `Any` contains an arbitrary serialized protocol buffer message along with a | ||||
| // URL that describes the type of the serialized message. | ||||
| // | ||||
| // Protobuf library provides support to pack/unpack Any values in the form | ||||
| // of utility functions or additional generated methods of the Any type. | ||||
| // | ||||
| // Example 1: Pack and unpack a message in C++. | ||||
| // | ||||
| //     Foo foo = ...; | ||||
| //     Any any; | ||||
| //     any.PackFrom(foo); | ||||
| //     ... | ||||
| //     if (any.UnpackTo(&foo)) { | ||||
| //       ... | ||||
| //     } | ||||
| // | ||||
| // Example 2: Pack and unpack a message in Java. | ||||
| // | ||||
| //     Foo foo = ...; | ||||
| //     Any any = Any.pack(foo); | ||||
| //     ... | ||||
| //     if (any.is(Foo.class)) { | ||||
| //       foo = any.unpack(Foo.class); | ||||
| //     } | ||||
| // | ||||
| //  Example 3: Pack and unpack a message in Python. | ||||
| // | ||||
| //     foo = Foo(...) | ||||
| //     any = Any() | ||||
| //     any.Pack(foo) | ||||
| //     ... | ||||
| //     if any.Is(Foo.DESCRIPTOR): | ||||
| //       any.Unpack(foo) | ||||
| //       ... | ||||
| // | ||||
| // The pack methods provided by protobuf library will by default use | ||||
| // 'type.googleapis.com/full.type.name' as the type URL and the unpack | ||||
| // methods only use the fully qualified type name after the last '/' | ||||
| // in the type URL, for example "foo.bar.com/x/y.z" will yield type | ||||
| // name "y.z". | ||||
| // | ||||
| // | ||||
| // JSON | ||||
| // ==== | ||||
| // The JSON representation of an `Any` value uses the regular | ||||
| // representation of the deserialized, embedded message, with an | ||||
| // additional field `@type` which contains the type URL. Example: | ||||
| // | ||||
| //     package google.profile; | ||||
| //     message Person { | ||||
| //       string first_name = 1; | ||||
| //       string last_name = 2; | ||||
| //     } | ||||
| // | ||||
| //     { | ||||
| //       "@type": "type.googleapis.com/google.profile.Person", | ||||
| //       "firstName": <string>, | ||||
| //       "lastName": <string> | ||||
| //     } | ||||
| // | ||||
| // If the embedded message type is well-known and has a custom JSON | ||||
| // representation, that representation will be embedded adding a field | ||||
| // `value` which holds the custom JSON in addition to the `@type` | ||||
| // field. Example (for message [google.protobuf.Duration][]): | ||||
| // | ||||
| //     { | ||||
| //       "@type": "type.googleapis.com/google.protobuf.Duration", | ||||
| //       "value": "1.212s" | ||||
| //     } | ||||
| // | ||||
| type Any struct { | ||||
| 	// A URL/resource name whose content describes the type of the | ||||
| 	// serialized protocol buffer message. | ||||
| 	// | ||||
| 	// For URLs which use the scheme `http`, `https`, or no scheme, the | ||||
| 	// following restrictions and interpretations apply: | ||||
| 	// | ||||
| 	// * If no scheme is provided, `https` is assumed. | ||||
| 	// * The last segment of the URL's path must represent the fully | ||||
| 	//   qualified name of the type (as in `path/google.protobuf.Duration`). | ||||
| 	//   The name should be in a canonical form (e.g., leading "." is | ||||
| 	//   not accepted). | ||||
| 	// * An HTTP GET on the URL must yield a [google.protobuf.Type][] | ||||
| 	//   value in binary format, or produce an error. | ||||
| 	// * Applications are allowed to cache lookup results based on the | ||||
| 	//   URL, or have them precompiled into a binary to avoid any | ||||
| 	//   lookup. Therefore, binary compatibility needs to be preserved | ||||
| 	//   on changes to types. (Use versioned type names to manage | ||||
| 	//   breaking changes.) | ||||
| 	// | ||||
| 	// Schemes other than `http`, `https` (or the empty scheme) might be | ||||
| 	// used with implementation specific semantics. | ||||
| 	// | ||||
| 	TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl" json:"type_url,omitempty"` | ||||
| 	// Must be a valid serialized protocol buffer of the above specified type. | ||||
| 	Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *Any) Reset()                    { *m = Any{} } | ||||
| func (m *Any) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Any) ProtoMessage()               {} | ||||
| func (*Any) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } | ||||
| func (*Any) XXX_WellKnownType() string   { return "Any" } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterType((*Any)(nil), "google.protobuf.Any") | ||||
| } | ||||
|  | ||||
| func init() { proto.RegisterFile("github.com/golang/protobuf/ptypes/any/any.proto", fileDescriptor0) } | ||||
|  | ||||
| var fileDescriptor0 = []byte{ | ||||
| 	// 187 bytes of a gzipped FileDescriptorProto | ||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xd2, 0x4f, 0xcf, 0x2c, 0xc9, | ||||
| 	0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0x2f, 0x28, | ||||
| 	0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0x28, 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x4f, 0xcc, | ||||
| 	0xab, 0x04, 0x61, 0x3d, 0xb0, 0xb8, 0x10, 0x7f, 0x7a, 0x7e, 0x7e, 0x7a, 0x4e, 0xaa, 0x1e, 0x4c, | ||||
| 	0x95, 0x92, 0x19, 0x17, 0xb3, 0x63, 0x5e, 0xa5, 0x90, 0x24, 0x17, 0x07, 0x48, 0x79, 0x7c, 0x69, | ||||
| 	0x51, 0x8e, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x3b, 0x88, 0x1f, 0x5a, 0x94, 0x23, 0x24, | ||||
| 	0xc2, 0xc5, 0x5a, 0x96, 0x98, 0x53, 0x9a, 0x2a, 0xc1, 0xa4, 0xc0, 0xa8, 0xc1, 0x13, 0x04, 0xe1, | ||||
| 	0x38, 0x15, 0x71, 0x09, 0x27, 0xe7, 0xe7, 0xea, 0xa1, 0x19, 0xe7, 0xc4, 0xe1, 0x98, 0x57, 0x19, | ||||
| 	0x00, 0xe2, 0x04, 0x30, 0x46, 0xa9, 0x12, 0xe5, 0xb8, 0x05, 0x8c, 0x8c, 0x8b, 0x98, 0x98, 0xdd, | ||||
| 	0x03, 0x9c, 0x56, 0x31, 0xc9, 0xb9, 0x43, 0x4c, 0x0b, 0x80, 0xaa, 0xd2, 0x0b, 0x4f, 0xcd, 0xc9, | ||||
| 	0xf1, 0xce, 0xcb, 0x2f, 0xcf, 0x0b, 0x01, 0xa9, 0x4e, 0x62, 0x03, 0x6b, 0x37, 0x06, 0x04, 0x00, | ||||
| 	0x00, 0xff, 0xff, 0xc6, 0x4d, 0x03, 0x23, 0xf6, 0x00, 0x00, 0x00, | ||||
| } | ||||
							
								
								
									
										140
									
								
								vendor/github.com/golang/protobuf/ptypes/any/any.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								vendor/github.com/golang/protobuf/ptypes/any/any.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,140 @@ | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto3"; | ||||
|  | ||||
| package google.protobuf; | ||||
|  | ||||
| option csharp_namespace = "Google.Protobuf.WellKnownTypes"; | ||||
| option go_package = "github.com/golang/protobuf/ptypes/any"; | ||||
| option java_package = "com.google.protobuf"; | ||||
| option java_outer_classname = "AnyProto"; | ||||
| option java_multiple_files = true; | ||||
| option java_generate_equals_and_hash = true; | ||||
| option objc_class_prefix = "GPB"; | ||||
|  | ||||
| // `Any` contains an arbitrary serialized protocol buffer message along with a | ||||
| // URL that describes the type of the serialized message. | ||||
| // | ||||
| // Protobuf library provides support to pack/unpack Any values in the form | ||||
| // of utility functions or additional generated methods of the Any type. | ||||
| // | ||||
| // Example 1: Pack and unpack a message in C++. | ||||
| // | ||||
| //     Foo foo = ...; | ||||
| //     Any any; | ||||
| //     any.PackFrom(foo); | ||||
| //     ... | ||||
| //     if (any.UnpackTo(&foo)) { | ||||
| //       ... | ||||
| //     } | ||||
| // | ||||
| // Example 2: Pack and unpack a message in Java. | ||||
| // | ||||
| //     Foo foo = ...; | ||||
| //     Any any = Any.pack(foo); | ||||
| //     ... | ||||
| //     if (any.is(Foo.class)) { | ||||
| //       foo = any.unpack(Foo.class); | ||||
| //     } | ||||
| // | ||||
| //  Example 3: Pack and unpack a message in Python. | ||||
| // | ||||
| //     foo = Foo(...) | ||||
| //     any = Any() | ||||
| //     any.Pack(foo) | ||||
| //     ... | ||||
| //     if any.Is(Foo.DESCRIPTOR): | ||||
| //       any.Unpack(foo) | ||||
| //       ... | ||||
| // | ||||
| // The pack methods provided by protobuf library will by default use | ||||
| // 'type.googleapis.com/full.type.name' as the type URL and the unpack | ||||
| // methods only use the fully qualified type name after the last '/' | ||||
| // in the type URL, for example "foo.bar.com/x/y.z" will yield type | ||||
| // name "y.z". | ||||
| // | ||||
| // | ||||
| // JSON | ||||
| // ==== | ||||
| // The JSON representation of an `Any` value uses the regular | ||||
| // representation of the deserialized, embedded message, with an | ||||
| // additional field `@type` which contains the type URL. Example: | ||||
| // | ||||
| //     package google.profile; | ||||
| //     message Person { | ||||
| //       string first_name = 1; | ||||
| //       string last_name = 2; | ||||
| //     } | ||||
| // | ||||
| //     { | ||||
| //       "@type": "type.googleapis.com/google.profile.Person", | ||||
| //       "firstName": <string>, | ||||
| //       "lastName": <string> | ||||
| //     } | ||||
| // | ||||
| // If the embedded message type is well-known and has a custom JSON | ||||
| // representation, that representation will be embedded adding a field | ||||
| // `value` which holds the custom JSON in addition to the `@type` | ||||
| // field. Example (for message [google.protobuf.Duration][]): | ||||
| // | ||||
| //     { | ||||
| //       "@type": "type.googleapis.com/google.protobuf.Duration", | ||||
| //       "value": "1.212s" | ||||
| //     } | ||||
| // | ||||
| message Any { | ||||
|   // A URL/resource name whose content describes the type of the | ||||
|   // serialized protocol buffer message. | ||||
|   // | ||||
|   // For URLs which use the scheme `http`, `https`, or no scheme, the | ||||
|   // following restrictions and interpretations apply: | ||||
|   // | ||||
|   // * If no scheme is provided, `https` is assumed. | ||||
|   // * The last segment of the URL's path must represent the fully | ||||
|   //   qualified name of the type (as in `path/google.protobuf.Duration`). | ||||
|   //   The name should be in a canonical form (e.g., leading "." is | ||||
|   //   not accepted). | ||||
|   // * An HTTP GET on the URL must yield a [google.protobuf.Type][] | ||||
|   //   value in binary format, or produce an error. | ||||
|   // * Applications are allowed to cache lookup results based on the | ||||
|   //   URL, or have them precompiled into a binary to avoid any | ||||
|   //   lookup. Therefore, binary compatibility needs to be preserved | ||||
|   //   on changes to types. (Use versioned type names to manage | ||||
|   //   breaking changes.) | ||||
|   // | ||||
|   // Schemes other than `http`, `https` (or the empty scheme) might be | ||||
|   // used with implementation specific semantics. | ||||
|   // | ||||
|   string type_url = 1; | ||||
|  | ||||
|   // Must be a valid serialized protocol buffer of the above specified type. | ||||
|   bytes value = 2; | ||||
| } | ||||
							
								
								
									
										113
									
								
								vendor/github.com/golang/protobuf/ptypes/any_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								vendor/github.com/golang/protobuf/ptypes/any_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2016 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package ptypes | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	pb "github.com/golang/protobuf/protoc-gen-go/descriptor" | ||||
| 	"github.com/golang/protobuf/ptypes/any" | ||||
| ) | ||||
|  | ||||
| func TestMarshalUnmarshal(t *testing.T) { | ||||
| 	orig := &any.Any{Value: []byte("test")} | ||||
|  | ||||
| 	packed, err := MarshalAny(orig) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("MarshalAny(%+v): got: _, %v exp: _, nil", orig, err) | ||||
| 	} | ||||
|  | ||||
| 	unpacked := &any.Any{} | ||||
| 	err = UnmarshalAny(packed, unpacked) | ||||
| 	if err != nil || !proto.Equal(unpacked, orig) { | ||||
| 		t.Errorf("got: %v, %+v; want nil, %+v", err, unpacked, orig) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestIs(t *testing.T) { | ||||
| 	a, err := MarshalAny(&pb.FileDescriptorProto{}) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	if Is(a, &pb.DescriptorProto{}) { | ||||
| 		t.Error("FileDescriptorProto is not a DescriptorProto, but Is says it is") | ||||
| 	} | ||||
| 	if !Is(a, &pb.FileDescriptorProto{}) { | ||||
| 		t.Error("FileDescriptorProto is indeed a FileDescriptorProto, but Is says it is not") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestIsDifferentUrlPrefixes(t *testing.T) { | ||||
| 	m := &pb.FileDescriptorProto{} | ||||
| 	a := &any.Any{TypeUrl: "foo/bar/" + proto.MessageName(m)} | ||||
| 	if !Is(a, m) { | ||||
| 		t.Errorf("message with type url %q didn't satisfy Is for type %q", a.TypeUrl, proto.MessageName(m)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestUnmarshalDynamic(t *testing.T) { | ||||
| 	want := &pb.FileDescriptorProto{Name: proto.String("foo")} | ||||
| 	a, err := MarshalAny(want) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	var got DynamicAny | ||||
| 	if err := UnmarshalAny(a, &got); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	if !proto.Equal(got.Message, want) { | ||||
| 		t.Errorf("invalid result from UnmarshalAny, got %q want %q", got.Message, want) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestEmpty(t *testing.T) { | ||||
| 	want := &pb.FileDescriptorProto{} | ||||
| 	a, err := MarshalAny(want) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	got, err := Empty(a) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	if !proto.Equal(got, want) { | ||||
| 		t.Errorf("unequal empty message, got %q, want %q", got, want) | ||||
| 	} | ||||
|  | ||||
| 	// that's a valid type_url for a message which shouldn't be linked into this | ||||
| 	// test binary. We want an error. | ||||
| 	a.TypeUrl = "type.googleapis.com/google.protobuf.FieldMask" | ||||
| 	if _, err := Empty(a); err == nil { | ||||
| 		t.Errorf("got no error for an attempt to create a message of type %q, which shouldn't be linked in", a.TypeUrl) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										35
									
								
								vendor/github.com/golang/protobuf/ptypes/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/golang/protobuf/ptypes/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2016 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| /* | ||||
| Package ptypes contains code for interacting with well-known types. | ||||
| */ | ||||
| package ptypes | ||||
							
								
								
									
										102
									
								
								vendor/github.com/golang/protobuf/ptypes/duration.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								vendor/github.com/golang/protobuf/ptypes/duration.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,102 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2016 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package ptypes | ||||
|  | ||||
| // This file implements conversions between google.protobuf.Duration | ||||
| // and time.Duration. | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
|  | ||||
| 	durpb "github.com/golang/protobuf/ptypes/duration" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// Range of a durpb.Duration in seconds, as specified in | ||||
| 	// google/protobuf/duration.proto. This is about 10,000 years in seconds. | ||||
| 	maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) | ||||
| 	minSeconds = -maxSeconds | ||||
| ) | ||||
|  | ||||
| // validateDuration determines whether the durpb.Duration is valid according to the | ||||
| // definition in google/protobuf/duration.proto. A valid durpb.Duration | ||||
| // may still be too large to fit into a time.Duration (the range of durpb.Duration | ||||
| // is about 10,000 years, and the range of time.Duration is about 290). | ||||
| func validateDuration(d *durpb.Duration) error { | ||||
| 	if d == nil { | ||||
| 		return errors.New("duration: nil Duration") | ||||
| 	} | ||||
| 	if d.Seconds < minSeconds || d.Seconds > maxSeconds { | ||||
| 		return fmt.Errorf("duration: %v: seconds out of range", d) | ||||
| 	} | ||||
| 	if d.Nanos <= -1e9 || d.Nanos >= 1e9 { | ||||
| 		return fmt.Errorf("duration: %v: nanos out of range", d) | ||||
| 	} | ||||
| 	// Seconds and Nanos must have the same sign, unless d.Nanos is zero. | ||||
| 	if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { | ||||
| 		return fmt.Errorf("duration: %v: seconds and nanos have different signs", d) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Duration converts a durpb.Duration to a time.Duration. Duration | ||||
| // returns an error if the durpb.Duration is invalid or is too large to be | ||||
| // represented in a time.Duration. | ||||
| func Duration(p *durpb.Duration) (time.Duration, error) { | ||||
| 	if err := validateDuration(p); err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
| 	d := time.Duration(p.Seconds) * time.Second | ||||
| 	if int64(d/time.Second) != p.Seconds { | ||||
| 		return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) | ||||
| 	} | ||||
| 	if p.Nanos != 0 { | ||||
| 		d += time.Duration(p.Nanos) | ||||
| 		if (d < 0) != (p.Nanos < 0) { | ||||
| 			return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) | ||||
| 		} | ||||
| 	} | ||||
| 	return d, nil | ||||
| } | ||||
|  | ||||
| // DurationProto converts a time.Duration to a durpb.Duration. | ||||
| func DurationProto(d time.Duration) *durpb.Duration { | ||||
| 	nanos := d.Nanoseconds() | ||||
| 	secs := nanos / 1e9 | ||||
| 	nanos -= secs * 1e9 | ||||
| 	return &durpb.Duration{ | ||||
| 		Seconds: secs, | ||||
| 		Nanos:   int32(nanos), | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										114
									
								
								vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: github.com/golang/protobuf/ptypes/duration/duration.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| /* | ||||
| Package duration is a generated protocol buffer package. | ||||
|  | ||||
| It is generated from these files: | ||||
| 	github.com/golang/protobuf/ptypes/duration/duration.proto | ||||
|  | ||||
| It has these top-level messages: | ||||
| 	Duration | ||||
| */ | ||||
| package duration | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import fmt "fmt" | ||||
| import math "math" | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = fmt.Errorf | ||||
| var _ = math.Inf | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the proto package it is being compiled against. | ||||
| // A compilation error at this line likely means your copy of the | ||||
| // proto package needs to be updated. | ||||
| const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package | ||||
|  | ||||
| // A Duration represents a signed, fixed-length span of time represented | ||||
| // as a count of seconds and fractions of seconds at nanosecond | ||||
| // resolution. It is independent of any calendar and concepts like "day" | ||||
| // or "month". It is related to Timestamp in that the difference between | ||||
| // two Timestamp values is a Duration and it can be added or subtracted | ||||
| // from a Timestamp. Range is approximately +-10,000 years. | ||||
| // | ||||
| // Example 1: Compute Duration from two Timestamps in pseudo code. | ||||
| // | ||||
| //     Timestamp start = ...; | ||||
| //     Timestamp end = ...; | ||||
| //     Duration duration = ...; | ||||
| // | ||||
| //     duration.seconds = end.seconds - start.seconds; | ||||
| //     duration.nanos = end.nanos - start.nanos; | ||||
| // | ||||
| //     if (duration.seconds < 0 && duration.nanos > 0) { | ||||
| //       duration.seconds += 1; | ||||
| //       duration.nanos -= 1000000000; | ||||
| //     } else if (durations.seconds > 0 && duration.nanos < 0) { | ||||
| //       duration.seconds -= 1; | ||||
| //       duration.nanos += 1000000000; | ||||
| //     } | ||||
| // | ||||
| // Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. | ||||
| // | ||||
| //     Timestamp start = ...; | ||||
| //     Duration duration = ...; | ||||
| //     Timestamp end = ...; | ||||
| // | ||||
| //     end.seconds = start.seconds + duration.seconds; | ||||
| //     end.nanos = start.nanos + duration.nanos; | ||||
| // | ||||
| //     if (end.nanos < 0) { | ||||
| //       end.seconds -= 1; | ||||
| //       end.nanos += 1000000000; | ||||
| //     } else if (end.nanos >= 1000000000) { | ||||
| //       end.seconds += 1; | ||||
| //       end.nanos -= 1000000000; | ||||
| //     } | ||||
| // | ||||
| // | ||||
| type Duration struct { | ||||
| 	// Signed seconds of the span of time. Must be from -315,576,000,000 | ||||
| 	// to +315,576,000,000 inclusive. | ||||
| 	Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"` | ||||
| 	// Signed fractions of a second at nanosecond resolution of the span | ||||
| 	// of time. Durations less than one second are represented with a 0 | ||||
| 	// `seconds` field and a positive or negative `nanos` field. For durations | ||||
| 	// of one second or more, a non-zero value for the `nanos` field must be | ||||
| 	// of the same sign as the `seconds` field. Must be from -999,999,999 | ||||
| 	// to +999,999,999 inclusive. | ||||
| 	Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *Duration) Reset()                    { *m = Duration{} } | ||||
| func (m *Duration) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Duration) ProtoMessage()               {} | ||||
| func (*Duration) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } | ||||
| func (*Duration) XXX_WellKnownType() string   { return "Duration" } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterType((*Duration)(nil), "google.protobuf.Duration") | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterFile("github.com/golang/protobuf/ptypes/duration/duration.proto", fileDescriptor0) | ||||
| } | ||||
|  | ||||
| var fileDescriptor0 = []byte{ | ||||
| 	// 189 bytes of a gzipped FileDescriptorProto | ||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xb2, 0x4c, 0xcf, 0x2c, 0xc9, | ||||
| 	0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0x2f, 0x28, | ||||
| 	0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0x28, 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x4f, 0x29, | ||||
| 	0x2d, 0x4a, 0x2c, 0xc9, 0xcc, 0xcf, 0x83, 0x33, 0xf4, 0xc0, 0x2a, 0x84, 0xf8, 0xd3, 0xf3, 0xf3, | ||||
| 	0xd3, 0x73, 0x52, 0xf5, 0x60, 0xea, 0x95, 0xac, 0xb8, 0x38, 0x5c, 0xa0, 0x4a, 0x84, 0x24, 0xb8, | ||||
| 	0xd8, 0x8b, 0x53, 0x93, 0xf3, 0xf3, 0x52, 0x8a, 0x25, 0x18, 0x15, 0x18, 0x35, 0x98, 0x83, 0x60, | ||||
| 	0x5c, 0x21, 0x11, 0x2e, 0xd6, 0xbc, 0xc4, 0xbc, 0xfc, 0x62, 0x09, 0x26, 0x05, 0x46, 0x0d, 0xd6, | ||||
| 	0x20, 0x08, 0xc7, 0xa9, 0x86, 0x4b, 0x38, 0x39, 0x3f, 0x57, 0x0f, 0xcd, 0x48, 0x27, 0x5e, 0x98, | ||||
| 	0x81, 0x01, 0x20, 0x91, 0x00, 0xc6, 0x28, 0x2d, 0xe2, 0xdd, 0xbb, 0x80, 0x91, 0x71, 0x11, 0x13, | ||||
| 	0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88, 0xb9, 0x01, 0x50, 0xa5, 0x7a, 0xe1, 0xa9, | ||||
| 	0x39, 0x39, 0xde, 0x79, 0xf9, 0xe5, 0x79, 0x21, 0x20, 0x2d, 0x49, 0x6c, 0x60, 0x33, 0x8c, 0x01, | ||||
| 	0x01, 0x00, 0x00, 0xff, 0xff, 0x62, 0xfb, 0xb1, 0x51, 0x0e, 0x01, 0x00, 0x00, | ||||
| } | ||||
							
								
								
									
										98
									
								
								vendor/github.com/golang/protobuf/ptypes/duration/duration.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								vendor/github.com/golang/protobuf/ptypes/duration/duration.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto3"; | ||||
|  | ||||
| package google.protobuf; | ||||
|  | ||||
| option csharp_namespace = "Google.Protobuf.WellKnownTypes"; | ||||
| option go_package = "github.com/golang/protobuf/ptypes/duration"; | ||||
| option java_package = "com.google.protobuf"; | ||||
| option java_outer_classname = "DurationProto"; | ||||
| option java_multiple_files = true; | ||||
| option java_generate_equals_and_hash = true; | ||||
| option objc_class_prefix = "GPB"; | ||||
|  | ||||
| // A Duration represents a signed, fixed-length span of time represented | ||||
| // as a count of seconds and fractions of seconds at nanosecond | ||||
| // resolution. It is independent of any calendar and concepts like "day" | ||||
| // or "month". It is related to Timestamp in that the difference between | ||||
| // two Timestamp values is a Duration and it can be added or subtracted | ||||
| // from a Timestamp. Range is approximately +-10,000 years. | ||||
| // | ||||
| // Example 1: Compute Duration from two Timestamps in pseudo code. | ||||
| // | ||||
| //     Timestamp start = ...; | ||||
| //     Timestamp end = ...; | ||||
| //     Duration duration = ...; | ||||
| // | ||||
| //     duration.seconds = end.seconds - start.seconds; | ||||
| //     duration.nanos = end.nanos - start.nanos; | ||||
| // | ||||
| //     if (duration.seconds < 0 && duration.nanos > 0) { | ||||
| //       duration.seconds += 1; | ||||
| //       duration.nanos -= 1000000000; | ||||
| //     } else if (durations.seconds > 0 && duration.nanos < 0) { | ||||
| //       duration.seconds -= 1; | ||||
| //       duration.nanos += 1000000000; | ||||
| //     } | ||||
| // | ||||
| // Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. | ||||
| // | ||||
| //     Timestamp start = ...; | ||||
| //     Duration duration = ...; | ||||
| //     Timestamp end = ...; | ||||
| // | ||||
| //     end.seconds = start.seconds + duration.seconds; | ||||
| //     end.nanos = start.nanos + duration.nanos; | ||||
| // | ||||
| //     if (end.nanos < 0) { | ||||
| //       end.seconds -= 1; | ||||
| //       end.nanos += 1000000000; | ||||
| //     } else if (end.nanos >= 1000000000) { | ||||
| //       end.seconds += 1; | ||||
| //       end.nanos -= 1000000000; | ||||
| //     } | ||||
| // | ||||
| // | ||||
| message Duration { | ||||
|  | ||||
|   // Signed seconds of the span of time. Must be from -315,576,000,000 | ||||
|   // to +315,576,000,000 inclusive. | ||||
|   int64 seconds = 1; | ||||
|  | ||||
|   // Signed fractions of a second at nanosecond resolution of the span | ||||
|   // of time. Durations less than one second are represented with a 0 | ||||
|   // `seconds` field and a positive or negative `nanos` field. For durations | ||||
|   // of one second or more, a non-zero value for the `nanos` field must be | ||||
|   // of the same sign as the `seconds` field. Must be from -999,999,999 | ||||
|   // to +999,999,999 inclusive. | ||||
|   int32 nanos = 2; | ||||
| } | ||||
							
								
								
									
										121
									
								
								vendor/github.com/golang/protobuf/ptypes/duration_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								vendor/github.com/golang/protobuf/ptypes/duration_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2016 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package ptypes | ||||
|  | ||||
| import ( | ||||
| 	"math" | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	durpb "github.com/golang/protobuf/ptypes/duration" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	minGoSeconds = math.MinInt64 / int64(1e9) | ||||
| 	maxGoSeconds = math.MaxInt64 / int64(1e9) | ||||
| ) | ||||
|  | ||||
| var durationTests = []struct { | ||||
| 	proto   *durpb.Duration | ||||
| 	isValid bool | ||||
| 	inRange bool | ||||
| 	dur     time.Duration | ||||
| }{ | ||||
| 	// The zero duration. | ||||
| 	{&durpb.Duration{0, 0}, true, true, 0}, | ||||
| 	// Some ordinary non-zero durations. | ||||
| 	{&durpb.Duration{100, 0}, true, true, 100 * time.Second}, | ||||
| 	{&durpb.Duration{-100, 0}, true, true, -100 * time.Second}, | ||||
| 	{&durpb.Duration{100, 987}, true, true, 100*time.Second + 987}, | ||||
| 	{&durpb.Duration{-100, -987}, true, true, -(100*time.Second + 987)}, | ||||
| 	// The largest duration representable in Go. | ||||
| 	{&durpb.Duration{maxGoSeconds, int32(math.MaxInt64 - 1e9*maxGoSeconds)}, true, true, math.MaxInt64}, | ||||
| 	// The smallest duration representable in Go. | ||||
| 	{&durpb.Duration{minGoSeconds, int32(math.MinInt64 - 1e9*minGoSeconds)}, true, true, math.MinInt64}, | ||||
| 	{nil, false, false, 0}, | ||||
| 	{&durpb.Duration{-100, 987}, false, false, 0}, | ||||
| 	{&durpb.Duration{100, -987}, false, false, 0}, | ||||
| 	{&durpb.Duration{math.MinInt64, 0}, false, false, 0}, | ||||
| 	{&durpb.Duration{math.MaxInt64, 0}, false, false, 0}, | ||||
| 	// The largest valid duration. | ||||
| 	{&durpb.Duration{maxSeconds, 1e9 - 1}, true, false, 0}, | ||||
| 	// The smallest valid duration. | ||||
| 	{&durpb.Duration{minSeconds, -(1e9 - 1)}, true, false, 0}, | ||||
| 	// The smallest invalid duration above the valid range. | ||||
| 	{&durpb.Duration{maxSeconds + 1, 0}, false, false, 0}, | ||||
| 	// The largest invalid duration below the valid range. | ||||
| 	{&durpb.Duration{minSeconds - 1, -(1e9 - 1)}, false, false, 0}, | ||||
| 	// One nanosecond past the largest duration representable in Go. | ||||
| 	{&durpb.Duration{maxGoSeconds, int32(math.MaxInt64-1e9*maxGoSeconds) + 1}, true, false, 0}, | ||||
| 	// One nanosecond past the smallest duration representable in Go. | ||||
| 	{&durpb.Duration{minGoSeconds, int32(math.MinInt64-1e9*minGoSeconds) - 1}, true, false, 0}, | ||||
| 	// One second past the largest duration representable in Go. | ||||
| 	{&durpb.Duration{maxGoSeconds + 1, int32(math.MaxInt64 - 1e9*maxGoSeconds)}, true, false, 0}, | ||||
| 	// One second past the smallest duration representable in Go. | ||||
| 	{&durpb.Duration{minGoSeconds - 1, int32(math.MinInt64 - 1e9*minGoSeconds)}, true, false, 0}, | ||||
| } | ||||
|  | ||||
| func TestValidateDuration(t *testing.T) { | ||||
| 	for _, test := range durationTests { | ||||
| 		err := validateDuration(test.proto) | ||||
| 		gotValid := (err == nil) | ||||
| 		if gotValid != test.isValid { | ||||
| 			t.Errorf("validateDuration(%v) = %t, want %t", test.proto, gotValid, test.isValid) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestDuration(t *testing.T) { | ||||
| 	for _, test := range durationTests { | ||||
| 		got, err := Duration(test.proto) | ||||
| 		gotOK := (err == nil) | ||||
| 		wantOK := test.isValid && test.inRange | ||||
| 		if gotOK != wantOK { | ||||
| 			t.Errorf("Duration(%v) ok = %t, want %t", test.proto, gotOK, wantOK) | ||||
| 		} | ||||
| 		if err == nil && got != test.dur { | ||||
| 			t.Errorf("Duration(%v) = %v, want %v", test.proto, got, test.dur) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestDurationProto(t *testing.T) { | ||||
| 	for _, test := range durationTests { | ||||
| 		if test.isValid && test.inRange { | ||||
| 			got := DurationProto(test.dur) | ||||
| 			if !proto.Equal(got, test.proto) { | ||||
| 				t.Errorf("DurationProto(%v) = %v, want %v", test.dur, got, test.proto) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										69
									
								
								vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								vendor/github.com/golang/protobuf/ptypes/empty/empty.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: github.com/golang/protobuf/ptypes/empty/empty.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| /* | ||||
| Package empty is a generated protocol buffer package. | ||||
|  | ||||
| It is generated from these files: | ||||
| 	github.com/golang/protobuf/ptypes/empty/empty.proto | ||||
|  | ||||
| It has these top-level messages: | ||||
| 	Empty | ||||
| */ | ||||
| package empty | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import fmt "fmt" | ||||
| import math "math" | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = fmt.Errorf | ||||
| var _ = math.Inf | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the proto package it is being compiled against. | ||||
| // A compilation error at this line likely means your copy of the | ||||
| // proto package needs to be updated. | ||||
| const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package | ||||
|  | ||||
| // A generic empty message that you can re-use to avoid defining duplicated | ||||
| // empty messages in your APIs. A typical example is to use it as the request | ||||
| // or the response type of an API method. For instance: | ||||
| // | ||||
| //     service Foo { | ||||
| //       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); | ||||
| //     } | ||||
| // | ||||
| // The JSON representation for `Empty` is empty JSON object `{}`. | ||||
| type Empty struct { | ||||
| } | ||||
|  | ||||
| func (m *Empty) Reset()                    { *m = Empty{} } | ||||
| func (m *Empty) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Empty) ProtoMessage()               {} | ||||
| func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } | ||||
| func (*Empty) XXX_WellKnownType() string   { return "Empty" } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterType((*Empty)(nil), "google.protobuf.Empty") | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterFile("github.com/golang/protobuf/ptypes/empty/empty.proto", fileDescriptor0) | ||||
| } | ||||
|  | ||||
| var fileDescriptor0 = []byte{ | ||||
| 	// 150 bytes of a gzipped FileDescriptorProto | ||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x32, 0x4e, 0xcf, 0x2c, 0xc9, | ||||
| 	0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0x2f, 0x28, | ||||
| 	0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0x28, 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x4f, 0xcd, | ||||
| 	0x2d, 0x28, 0xa9, 0x84, 0x90, 0x7a, 0x60, 0x39, 0x21, 0xfe, 0xf4, 0xfc, 0xfc, 0xf4, 0x9c, 0x54, | ||||
| 	0x3d, 0x98, 0x4a, 0x25, 0x76, 0x2e, 0x56, 0x57, 0x90, 0xbc, 0x53, 0x25, 0x97, 0x70, 0x72, 0x7e, | ||||
| 	0xae, 0x1e, 0x9a, 0xbc, 0x13, 0x17, 0x58, 0x36, 0x00, 0xc4, 0x0d, 0x60, 0x8c, 0x52, 0x27, 0xd2, | ||||
| 	0xce, 0x05, 0x8c, 0x8c, 0x3f, 0x18, 0x19, 0x17, 0x31, 0x31, 0xbb, 0x07, 0x38, 0xad, 0x62, 0x92, | ||||
| 	0x73, 0x87, 0x18, 0x1a, 0x00, 0x55, 0xaa, 0x17, 0x9e, 0x9a, 0x93, 0xe3, 0x9d, 0x97, 0x5f, 0x9e, | ||||
| 	0x17, 0x02, 0xd2, 0x92, 0xc4, 0x06, 0x36, 0xc3, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x7f, 0xbb, | ||||
| 	0xf4, 0x0e, 0xd2, 0x00, 0x00, 0x00, | ||||
| } | ||||
							
								
								
									
										53
									
								
								vendor/github.com/golang/protobuf/ptypes/empty/empty.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								vendor/github.com/golang/protobuf/ptypes/empty/empty.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto3"; | ||||
|  | ||||
| package google.protobuf; | ||||
|  | ||||
| option csharp_namespace = "Google.Protobuf.WellKnownTypes"; | ||||
| option go_package = "github.com/golang/protobuf/ptypes/empty"; | ||||
| option java_package = "com.google.protobuf"; | ||||
| option java_outer_classname = "EmptyProto"; | ||||
| option java_multiple_files = true; | ||||
| option java_generate_equals_and_hash = true; | ||||
| option objc_class_prefix = "GPB"; | ||||
| option cc_enable_arenas = true; | ||||
|  | ||||
| // A generic empty message that you can re-use to avoid defining duplicated | ||||
| // empty messages in your APIs. A typical example is to use it as the request | ||||
| // or the response type of an API method. For instance: | ||||
| // | ||||
| //     service Foo { | ||||
| //       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); | ||||
| //     } | ||||
| // | ||||
| // The JSON representation for `Empty` is empty JSON object `{}`. | ||||
| message Empty {} | ||||
							
								
								
									
										66
									
								
								vendor/github.com/golang/protobuf/ptypes/regen.sh
									
									
									
										generated
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										66
									
								
								vendor/github.com/golang/protobuf/ptypes/regen.sh
									
									
									
										generated
									
									
										vendored
									
									
										Executable file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| #!/bin/bash -e | ||||
| # | ||||
| # This script fetches and rebuilds the "well-known types" protocol buffers. | ||||
| # To run this you will need protoc and goprotobuf installed; | ||||
| # see https://github.com/golang/protobuf for instructions. | ||||
| # You also need Go and Git installed. | ||||
|  | ||||
| PKG=github.com/golang/protobuf/ptypes | ||||
| UPSTREAM=https://github.com/google/protobuf | ||||
| UPSTREAM_SUBDIR=src/google/protobuf | ||||
| PROTO_FILES=' | ||||
|   any.proto | ||||
|   duration.proto | ||||
|   empty.proto | ||||
|   struct.proto | ||||
|   timestamp.proto | ||||
|   wrappers.proto | ||||
| ' | ||||
|  | ||||
| function die() { | ||||
|   echo 1>&2 $* | ||||
|   exit 1 | ||||
| } | ||||
|  | ||||
| # Sanity check that the right tools are accessible. | ||||
| for tool in go git protoc protoc-gen-go; do | ||||
|   q=$(which $tool) || die "didn't find $tool" | ||||
|   echo 1>&2 "$tool: $q" | ||||
| done | ||||
|  | ||||
| tmpdir=$(mktemp -d -t regen-wkt.XXXXXX) | ||||
| trap 'rm -rf $tmpdir' EXIT | ||||
|  | ||||
| echo -n 1>&2 "finding package dir... " | ||||
| pkgdir=$(go list -f '{{.Dir}}' $PKG) | ||||
| echo 1>&2 $pkgdir | ||||
| base=$(echo $pkgdir | sed "s,/$PKG\$,,") | ||||
| echo 1>&2 "base: $base" | ||||
| cd $base | ||||
|  | ||||
| echo 1>&2 "fetching latest protos... " | ||||
| git clone -q $UPSTREAM $tmpdir | ||||
| # Pass 1: build mapping from upstream filename to our filename. | ||||
| declare -A filename_map | ||||
| for f in $(cd $PKG && find * -name '*.proto'); do | ||||
|   echo -n 1>&2 "looking for latest version of $f... " | ||||
|   up=$(cd $tmpdir/$UPSTREAM_SUBDIR && find * -name $(basename $f) | grep -v /testdata/) | ||||
|   echo 1>&2 $up | ||||
|   if [ $(echo $up | wc -w) != "1" ]; then | ||||
|     die "not exactly one match" | ||||
|   fi | ||||
|   filename_map[$up]=$f | ||||
| done | ||||
| # Pass 2: copy files | ||||
| for up in "${!filename_map[@]}"; do | ||||
|   f=${filename_map[$up]} | ||||
|   shortname=$(basename $f | sed 's,\.proto$,,') | ||||
|   cp $tmpdir/$UPSTREAM_SUBDIR/$up $PKG/$f | ||||
| done | ||||
|  | ||||
| # Run protoc once per package. | ||||
| for dir in $(find $PKG -name '*.proto' | xargs dirname | sort | uniq); do | ||||
|   echo 1>&2 "* $dir" | ||||
|   protoc --go_out=. $dir/*.proto | ||||
| done | ||||
| echo 1>&2 "All OK" | ||||
							
								
								
									
										382
									
								
								vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										382
									
								
								vendor/github.com/golang/protobuf/ptypes/struct/struct.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,382 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: github.com/golang/protobuf/ptypes/struct/struct.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| /* | ||||
| Package structpb is a generated protocol buffer package. | ||||
|  | ||||
| It is generated from these files: | ||||
| 	github.com/golang/protobuf/ptypes/struct/struct.proto | ||||
|  | ||||
| It has these top-level messages: | ||||
| 	Struct | ||||
| 	Value | ||||
| 	ListValue | ||||
| */ | ||||
| package structpb | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import fmt "fmt" | ||||
| import math "math" | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = fmt.Errorf | ||||
| var _ = math.Inf | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the proto package it is being compiled against. | ||||
| // A compilation error at this line likely means your copy of the | ||||
| // proto package needs to be updated. | ||||
| const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package | ||||
|  | ||||
| // `NullValue` is a singleton enumeration to represent the null value for the | ||||
| // `Value` type union. | ||||
| // | ||||
| //  The JSON representation for `NullValue` is JSON `null`. | ||||
| type NullValue int32 | ||||
|  | ||||
| const ( | ||||
| 	// Null value. | ||||
| 	NullValue_NULL_VALUE NullValue = 0 | ||||
| ) | ||||
|  | ||||
| var NullValue_name = map[int32]string{ | ||||
| 	0: "NULL_VALUE", | ||||
| } | ||||
| var NullValue_value = map[string]int32{ | ||||
| 	"NULL_VALUE": 0, | ||||
| } | ||||
|  | ||||
| func (x NullValue) String() string { | ||||
| 	return proto.EnumName(NullValue_name, int32(x)) | ||||
| } | ||||
| func (NullValue) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } | ||||
| func (NullValue) XXX_WellKnownType() string       { return "NullValue" } | ||||
|  | ||||
| // `Struct` represents a structured data value, consisting of fields | ||||
| // which map to dynamically typed values. In some languages, `Struct` | ||||
| // might be supported by a native representation. For example, in | ||||
| // scripting languages like JS a struct is represented as an | ||||
| // object. The details of that representation are described together | ||||
| // with the proto support for the language. | ||||
| // | ||||
| // The JSON representation for `Struct` is JSON object. | ||||
| type Struct struct { | ||||
| 	// Unordered map of dynamically typed values. | ||||
| 	Fields map[string]*Value `protobuf:"bytes,1,rep,name=fields" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` | ||||
| } | ||||
|  | ||||
| func (m *Struct) Reset()                    { *m = Struct{} } | ||||
| func (m *Struct) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Struct) ProtoMessage()               {} | ||||
| func (*Struct) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } | ||||
| func (*Struct) XXX_WellKnownType() string   { return "Struct" } | ||||
|  | ||||
| func (m *Struct) GetFields() map[string]*Value { | ||||
| 	if m != nil { | ||||
| 		return m.Fields | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // `Value` represents a dynamically typed value which can be either | ||||
| // null, a number, a string, a boolean, a recursive struct value, or a | ||||
| // list of values. A producer of value is expected to set one of that | ||||
| // variants, absence of any variant indicates an error. | ||||
| // | ||||
| // The JSON representation for `Value` is JSON value. | ||||
| type Value struct { | ||||
| 	// The kind of value. | ||||
| 	// | ||||
| 	// Types that are valid to be assigned to Kind: | ||||
| 	//	*Value_NullValue | ||||
| 	//	*Value_NumberValue | ||||
| 	//	*Value_StringValue | ||||
| 	//	*Value_BoolValue | ||||
| 	//	*Value_StructValue | ||||
| 	//	*Value_ListValue | ||||
| 	Kind isValue_Kind `protobuf_oneof:"kind"` | ||||
| } | ||||
|  | ||||
| func (m *Value) Reset()                    { *m = Value{} } | ||||
| func (m *Value) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Value) ProtoMessage()               {} | ||||
| func (*Value) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } | ||||
| func (*Value) XXX_WellKnownType() string   { return "Value" } | ||||
|  | ||||
| type isValue_Kind interface { | ||||
| 	isValue_Kind() | ||||
| } | ||||
|  | ||||
| type Value_NullValue struct { | ||||
| 	NullValue NullValue `protobuf:"varint,1,opt,name=null_value,json=nullValue,enum=google.protobuf.NullValue,oneof"` | ||||
| } | ||||
| type Value_NumberValue struct { | ||||
| 	NumberValue float64 `protobuf:"fixed64,2,opt,name=number_value,json=numberValue,oneof"` | ||||
| } | ||||
| type Value_StringValue struct { | ||||
| 	StringValue string `protobuf:"bytes,3,opt,name=string_value,json=stringValue,oneof"` | ||||
| } | ||||
| type Value_BoolValue struct { | ||||
| 	BoolValue bool `protobuf:"varint,4,opt,name=bool_value,json=boolValue,oneof"` | ||||
| } | ||||
| type Value_StructValue struct { | ||||
| 	StructValue *Struct `protobuf:"bytes,5,opt,name=struct_value,json=structValue,oneof"` | ||||
| } | ||||
| type Value_ListValue struct { | ||||
| 	ListValue *ListValue `protobuf:"bytes,6,opt,name=list_value,json=listValue,oneof"` | ||||
| } | ||||
|  | ||||
| func (*Value_NullValue) isValue_Kind()   {} | ||||
| func (*Value_NumberValue) isValue_Kind() {} | ||||
| func (*Value_StringValue) isValue_Kind() {} | ||||
| func (*Value_BoolValue) isValue_Kind()   {} | ||||
| func (*Value_StructValue) isValue_Kind() {} | ||||
| func (*Value_ListValue) isValue_Kind()   {} | ||||
|  | ||||
| func (m *Value) GetKind() isValue_Kind { | ||||
| 	if m != nil { | ||||
| 		return m.Kind | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Value) GetNullValue() NullValue { | ||||
| 	if x, ok := m.GetKind().(*Value_NullValue); ok { | ||||
| 		return x.NullValue | ||||
| 	} | ||||
| 	return NullValue_NULL_VALUE | ||||
| } | ||||
|  | ||||
| func (m *Value) GetNumberValue() float64 { | ||||
| 	if x, ok := m.GetKind().(*Value_NumberValue); ok { | ||||
| 		return x.NumberValue | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| func (m *Value) GetStringValue() string { | ||||
| 	if x, ok := m.GetKind().(*Value_StringValue); ok { | ||||
| 		return x.StringValue | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func (m *Value) GetBoolValue() bool { | ||||
| 	if x, ok := m.GetKind().(*Value_BoolValue); ok { | ||||
| 		return x.BoolValue | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (m *Value) GetStructValue() *Struct { | ||||
| 	if x, ok := m.GetKind().(*Value_StructValue); ok { | ||||
| 		return x.StructValue | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (m *Value) GetListValue() *ListValue { | ||||
| 	if x, ok := m.GetKind().(*Value_ListValue); ok { | ||||
| 		return x.ListValue | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // XXX_OneofFuncs is for the internal use of the proto package. | ||||
| func (*Value) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { | ||||
| 	return _Value_OneofMarshaler, _Value_OneofUnmarshaler, _Value_OneofSizer, []interface{}{ | ||||
| 		(*Value_NullValue)(nil), | ||||
| 		(*Value_NumberValue)(nil), | ||||
| 		(*Value_StringValue)(nil), | ||||
| 		(*Value_BoolValue)(nil), | ||||
| 		(*Value_StructValue)(nil), | ||||
| 		(*Value_ListValue)(nil), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func _Value_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { | ||||
| 	m := msg.(*Value) | ||||
| 	// kind | ||||
| 	switch x := m.Kind.(type) { | ||||
| 	case *Value_NullValue: | ||||
| 		b.EncodeVarint(1<<3 | proto.WireVarint) | ||||
| 		b.EncodeVarint(uint64(x.NullValue)) | ||||
| 	case *Value_NumberValue: | ||||
| 		b.EncodeVarint(2<<3 | proto.WireFixed64) | ||||
| 		b.EncodeFixed64(math.Float64bits(x.NumberValue)) | ||||
| 	case *Value_StringValue: | ||||
| 		b.EncodeVarint(3<<3 | proto.WireBytes) | ||||
| 		b.EncodeStringBytes(x.StringValue) | ||||
| 	case *Value_BoolValue: | ||||
| 		t := uint64(0) | ||||
| 		if x.BoolValue { | ||||
| 			t = 1 | ||||
| 		} | ||||
| 		b.EncodeVarint(4<<3 | proto.WireVarint) | ||||
| 		b.EncodeVarint(t) | ||||
| 	case *Value_StructValue: | ||||
| 		b.EncodeVarint(5<<3 | proto.WireBytes) | ||||
| 		if err := b.EncodeMessage(x.StructValue); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	case *Value_ListValue: | ||||
| 		b.EncodeVarint(6<<3 | proto.WireBytes) | ||||
| 		if err := b.EncodeMessage(x.ListValue); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	case nil: | ||||
| 	default: | ||||
| 		return fmt.Errorf("Value.Kind has unexpected type %T", x) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func _Value_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { | ||||
| 	m := msg.(*Value) | ||||
| 	switch tag { | ||||
| 	case 1: // kind.null_value | ||||
| 		if wire != proto.WireVarint { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeVarint() | ||||
| 		m.Kind = &Value_NullValue{NullValue(x)} | ||||
| 		return true, err | ||||
| 	case 2: // kind.number_value | ||||
| 		if wire != proto.WireFixed64 { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeFixed64() | ||||
| 		m.Kind = &Value_NumberValue{math.Float64frombits(x)} | ||||
| 		return true, err | ||||
| 	case 3: // kind.string_value | ||||
| 		if wire != proto.WireBytes { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeStringBytes() | ||||
| 		m.Kind = &Value_StringValue{x} | ||||
| 		return true, err | ||||
| 	case 4: // kind.bool_value | ||||
| 		if wire != proto.WireVarint { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		x, err := b.DecodeVarint() | ||||
| 		m.Kind = &Value_BoolValue{x != 0} | ||||
| 		return true, err | ||||
| 	case 5: // kind.struct_value | ||||
| 		if wire != proto.WireBytes { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		msg := new(Struct) | ||||
| 		err := b.DecodeMessage(msg) | ||||
| 		m.Kind = &Value_StructValue{msg} | ||||
| 		return true, err | ||||
| 	case 6: // kind.list_value | ||||
| 		if wire != proto.WireBytes { | ||||
| 			return true, proto.ErrInternalBadWireType | ||||
| 		} | ||||
| 		msg := new(ListValue) | ||||
| 		err := b.DecodeMessage(msg) | ||||
| 		m.Kind = &Value_ListValue{msg} | ||||
| 		return true, err | ||||
| 	default: | ||||
| 		return false, nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func _Value_OneofSizer(msg proto.Message) (n int) { | ||||
| 	m := msg.(*Value) | ||||
| 	// kind | ||||
| 	switch x := m.Kind.(type) { | ||||
| 	case *Value_NullValue: | ||||
| 		n += proto.SizeVarint(1<<3 | proto.WireVarint) | ||||
| 		n += proto.SizeVarint(uint64(x.NullValue)) | ||||
| 	case *Value_NumberValue: | ||||
| 		n += proto.SizeVarint(2<<3 | proto.WireFixed64) | ||||
| 		n += 8 | ||||
| 	case *Value_StringValue: | ||||
| 		n += proto.SizeVarint(3<<3 | proto.WireBytes) | ||||
| 		n += proto.SizeVarint(uint64(len(x.StringValue))) | ||||
| 		n += len(x.StringValue) | ||||
| 	case *Value_BoolValue: | ||||
| 		n += proto.SizeVarint(4<<3 | proto.WireVarint) | ||||
| 		n += 1 | ||||
| 	case *Value_StructValue: | ||||
| 		s := proto.Size(x.StructValue) | ||||
| 		n += proto.SizeVarint(5<<3 | proto.WireBytes) | ||||
| 		n += proto.SizeVarint(uint64(s)) | ||||
| 		n += s | ||||
| 	case *Value_ListValue: | ||||
| 		s := proto.Size(x.ListValue) | ||||
| 		n += proto.SizeVarint(6<<3 | proto.WireBytes) | ||||
| 		n += proto.SizeVarint(uint64(s)) | ||||
| 		n += s | ||||
| 	case nil: | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| // `ListValue` is a wrapper around a repeated field of values. | ||||
| // | ||||
| // The JSON representation for `ListValue` is JSON array. | ||||
| type ListValue struct { | ||||
| 	// Repeated field of dynamically typed values. | ||||
| 	Values []*Value `protobuf:"bytes,1,rep,name=values" json:"values,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *ListValue) Reset()                    { *m = ListValue{} } | ||||
| func (m *ListValue) String() string            { return proto.CompactTextString(m) } | ||||
| func (*ListValue) ProtoMessage()               {} | ||||
| func (*ListValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } | ||||
| func (*ListValue) XXX_WellKnownType() string   { return "ListValue" } | ||||
|  | ||||
| func (m *ListValue) GetValues() []*Value { | ||||
| 	if m != nil { | ||||
| 		return m.Values | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterType((*Struct)(nil), "google.protobuf.Struct") | ||||
| 	proto.RegisterType((*Value)(nil), "google.protobuf.Value") | ||||
| 	proto.RegisterType((*ListValue)(nil), "google.protobuf.ListValue") | ||||
| 	proto.RegisterEnum("google.protobuf.NullValue", NullValue_name, NullValue_value) | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterFile("github.com/golang/protobuf/ptypes/struct/struct.proto", fileDescriptor0) | ||||
| } | ||||
|  | ||||
| var fileDescriptor0 = []byte{ | ||||
| 	// 416 bytes of a gzipped FileDescriptorProto | ||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x92, 0x41, 0x8b, 0xd3, 0x40, | ||||
| 	0x14, 0x80, 0x3b, 0xc9, 0x36, 0x98, 0x17, 0x59, 0x97, 0x11, 0xb4, 0xac, 0xa0, 0xa1, 0x7b, 0x09, | ||||
| 	0x22, 0x09, 0x56, 0x04, 0x31, 0x5e, 0x0c, 0xac, 0xbb, 0x60, 0x58, 0x62, 0x74, 0x57, 0xf0, 0x52, | ||||
| 	0x9a, 0x34, 0x8d, 0xa1, 0xd3, 0x99, 0x90, 0xcc, 0x28, 0x3d, 0xfa, 0x2f, 0x3c, 0x8a, 0x47, 0x8f, | ||||
| 	0xfe, 0x42, 0x99, 0x99, 0x24, 0x4a, 0x4b, 0xc1, 0xd3, 0xf4, 0xbd, 0xf9, 0xde, 0x37, 0xef, 0xbd, | ||||
| 	0x06, 0x9e, 0x97, 0x15, 0xff, 0x2c, 0x32, 0x3f, 0x67, 0x9b, 0xa0, 0x64, 0x64, 0x41, 0xcb, 0xa0, | ||||
| 	0x6e, 0x18, 0x67, 0x99, 0x58, 0x05, 0x35, 0xdf, 0xd6, 0x45, 0x1b, 0xb4, 0xbc, 0x11, 0x39, 0xef, | ||||
| 	0x0e, 0x5f, 0xdd, 0xe2, 0x3b, 0x25, 0x63, 0x25, 0x29, 0xfc, 0x9e, 0x9d, 0x7e, 0x47, 0x60, 0xbd, | ||||
| 	0x57, 0x04, 0x0e, 0xc1, 0x5a, 0x55, 0x05, 0x59, 0xb6, 0x13, 0xe4, 0x9a, 0x9e, 0x33, 0x3b, 0xf3, | ||||
| 	0x77, 0x60, 0x5f, 0x83, 0xfe, 0x1b, 0x45, 0x9d, 0x53, 0xde, 0x6c, 0xd3, 0xae, 0xe4, 0xf4, 0x1d, | ||||
| 	0x38, 0xff, 0xa4, 0xf1, 0x09, 0x98, 0xeb, 0x62, 0x3b, 0x41, 0x2e, 0xf2, 0xec, 0x54, 0xfe, 0xc4, | ||||
| 	0x4f, 0x60, 0xfc, 0x65, 0x41, 0x44, 0x31, 0x31, 0x5c, 0xe4, 0x39, 0xb3, 0x7b, 0x7b, 0xf2, 0x1b, | ||||
| 	0x79, 0x9b, 0x6a, 0xe8, 0xa5, 0xf1, 0x02, 0x4d, 0x7f, 0x1b, 0x30, 0x56, 0x49, 0x1c, 0x02, 0x50, | ||||
| 	0x41, 0xc8, 0x5c, 0x0b, 0xa4, 0xf4, 0x78, 0x76, 0xba, 0x27, 0xb8, 0x12, 0x84, 0x28, 0xfe, 0x72, | ||||
| 	0x94, 0xda, 0xb4, 0x0f, 0xf0, 0x19, 0xdc, 0xa6, 0x62, 0x93, 0x15, 0xcd, 0xfc, 0xef, 0xfb, 0xe8, | ||||
| 	0x72, 0x94, 0x3a, 0x3a, 0x3b, 0x40, 0x2d, 0x6f, 0x2a, 0x5a, 0x76, 0x90, 0x29, 0x1b, 0x97, 0x90, | ||||
| 	0xce, 0x6a, 0xe8, 0x11, 0x40, 0xc6, 0x58, 0xdf, 0xc6, 0x91, 0x8b, 0xbc, 0x5b, 0xf2, 0x29, 0x99, | ||||
| 	0xd3, 0xc0, 0x2b, 0x65, 0x11, 0x39, 0xef, 0x90, 0xb1, 0x1a, 0xf5, 0xfe, 0x81, 0x3d, 0x76, 0x7a, | ||||
| 	0x91, 0xf3, 0x61, 0x4a, 0x52, 0xb5, 0x7d, 0xad, 0xa5, 0x6a, 0xf7, 0xa7, 0x8c, 0xab, 0x96, 0x0f, | ||||
| 	0x53, 0x92, 0x3e, 0x88, 0x2c, 0x38, 0x5a, 0x57, 0x74, 0x39, 0x0d, 0xc1, 0x1e, 0x08, 0xec, 0x83, | ||||
| 	0xa5, 0x64, 0xfd, 0x3f, 0x7a, 0x68, 0xe9, 0x1d, 0xf5, 0xf8, 0x01, 0xd8, 0xc3, 0x12, 0xf1, 0x31, | ||||
| 	0xc0, 0xd5, 0x75, 0x1c, 0xcf, 0x6f, 0x5e, 0xc7, 0xd7, 0xe7, 0x27, 0xa3, 0xe8, 0x1b, 0x82, 0xbb, | ||||
| 	0x39, 0xdb, 0xec, 0x2a, 0x22, 0x47, 0x4f, 0x93, 0xc8, 0x38, 0x41, 0x9f, 0x9e, 0xfe, 0xef, 0x87, | ||||
| 	0x19, 0xea, 0xa3, 0xce, 0x7e, 0x20, 0xf4, 0xd3, 0x30, 0x2f, 0x92, 0xe8, 0x97, 0xf1, 0xf0, 0x42, | ||||
| 	0xcb, 0x93, 0xbe, 0xbf, 0x8f, 0x05, 0x21, 0x6f, 0x29, 0xfb, 0x4a, 0x3f, 0xc8, 0xca, 0xcc, 0x52, | ||||
| 	0xaa, 0x67, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xbc, 0xcf, 0x6d, 0x50, 0xfe, 0x02, 0x00, 0x00, | ||||
| } | ||||
							
								
								
									
										96
									
								
								vendor/github.com/golang/protobuf/ptypes/struct/struct.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								vendor/github.com/golang/protobuf/ptypes/struct/struct.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto3"; | ||||
|  | ||||
| package google.protobuf; | ||||
|  | ||||
| option csharp_namespace = "Google.Protobuf.WellKnownTypes"; | ||||
| option go_package = "github.com/golang/protobuf/ptypes/struct;structpb"; | ||||
| option java_package = "com.google.protobuf"; | ||||
| option java_outer_classname = "StructProto"; | ||||
| option java_multiple_files = true; | ||||
| option java_generate_equals_and_hash = true; | ||||
| option objc_class_prefix = "GPB"; | ||||
|  | ||||
|  | ||||
| // `Struct` represents a structured data value, consisting of fields | ||||
| // which map to dynamically typed values. In some languages, `Struct` | ||||
| // might be supported by a native representation. For example, in | ||||
| // scripting languages like JS a struct is represented as an | ||||
| // object. The details of that representation are described together | ||||
| // with the proto support for the language. | ||||
| // | ||||
| // The JSON representation for `Struct` is JSON object. | ||||
| message Struct { | ||||
|   // Unordered map of dynamically typed values. | ||||
|   map<string, Value> fields = 1; | ||||
| } | ||||
|  | ||||
| // `Value` represents a dynamically typed value which can be either | ||||
| // null, a number, a string, a boolean, a recursive struct value, or a | ||||
| // list of values. A producer of value is expected to set one of that | ||||
| // variants, absence of any variant indicates an error. | ||||
| // | ||||
| // The JSON representation for `Value` is JSON value. | ||||
| message Value { | ||||
|   // The kind of value. | ||||
|   oneof kind { | ||||
|     // Represents a null value. | ||||
|     NullValue null_value = 1; | ||||
|     // Represents a double value. | ||||
|     double number_value = 2; | ||||
|     // Represents a string value. | ||||
|     string string_value = 3; | ||||
|     // Represents a boolean value. | ||||
|     bool bool_value = 4; | ||||
|     // Represents a structured value. | ||||
|     Struct struct_value = 5; | ||||
|     // Represents a repeated `Value`. | ||||
|     ListValue list_value = 6; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // `NullValue` is a singleton enumeration to represent the null value for the | ||||
| // `Value` type union. | ||||
| // | ||||
| //  The JSON representation for `NullValue` is JSON `null`. | ||||
| enum NullValue { | ||||
|   // Null value. | ||||
|   NULL_VALUE = 0; | ||||
| } | ||||
|  | ||||
| // `ListValue` is a wrapper around a repeated field of values. | ||||
| // | ||||
| // The JSON representation for `ListValue` is JSON array. | ||||
| message ListValue { | ||||
|   // Repeated field of dynamically typed values. | ||||
|   repeated Value values = 1; | ||||
| } | ||||
							
								
								
									
										125
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2016 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package ptypes | ||||
|  | ||||
| // This file implements operations on google.protobuf.Timestamp. | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
|  | ||||
| 	tspb "github.com/golang/protobuf/ptypes/timestamp" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// Seconds field of the earliest valid Timestamp. | ||||
| 	// This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). | ||||
| 	minValidSeconds = -62135596800 | ||||
| 	// Seconds field just after the latest valid Timestamp. | ||||
| 	// This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). | ||||
| 	maxValidSeconds = 253402300800 | ||||
| ) | ||||
|  | ||||
| // validateTimestamp determines whether a Timestamp is valid. | ||||
| // A valid timestamp represents a time in the range | ||||
| // [0001-01-01, 10000-01-01) and has a Nanos field | ||||
| // in the range [0, 1e9). | ||||
| // | ||||
| // If the Timestamp is valid, validateTimestamp returns nil. | ||||
| // Otherwise, it returns an error that describes | ||||
| // the problem. | ||||
| // | ||||
| // Every valid Timestamp can be represented by a time.Time, but the converse is not true. | ||||
| func validateTimestamp(ts *tspb.Timestamp) error { | ||||
| 	if ts == nil { | ||||
| 		return errors.New("timestamp: nil Timestamp") | ||||
| 	} | ||||
| 	if ts.Seconds < minValidSeconds { | ||||
| 		return fmt.Errorf("timestamp: %v before 0001-01-01", ts) | ||||
| 	} | ||||
| 	if ts.Seconds >= maxValidSeconds { | ||||
| 		return fmt.Errorf("timestamp: %v after 10000-01-01", ts) | ||||
| 	} | ||||
| 	if ts.Nanos < 0 || ts.Nanos >= 1e9 { | ||||
| 		return fmt.Errorf("timestamp: %v: nanos not in range [0, 1e9)", ts) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Timestamp converts a google.protobuf.Timestamp proto to a time.Time. | ||||
| // It returns an error if the argument is invalid. | ||||
| // | ||||
| // Unlike most Go functions, if Timestamp returns an error, the first return value | ||||
| // is not the zero time.Time. Instead, it is the value obtained from the | ||||
| // time.Unix function when passed the contents of the Timestamp, in the UTC | ||||
| // locale. This may or may not be a meaningful time; many invalid Timestamps | ||||
| // do map to valid time.Times. | ||||
| // | ||||
| // A nil Timestamp returns an error. The first return value in that case is | ||||
| // undefined. | ||||
| func Timestamp(ts *tspb.Timestamp) (time.Time, error) { | ||||
| 	// Don't return the zero value on error, because corresponds to a valid | ||||
| 	// timestamp. Instead return whatever time.Unix gives us. | ||||
| 	var t time.Time | ||||
| 	if ts == nil { | ||||
| 		t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp | ||||
| 	} else { | ||||
| 		t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() | ||||
| 	} | ||||
| 	return t, validateTimestamp(ts) | ||||
| } | ||||
|  | ||||
| // TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. | ||||
| // It returns an error if the resulting Timestamp is invalid. | ||||
| func TimestampProto(t time.Time) (*tspb.Timestamp, error) { | ||||
| 	seconds := t.Unix() | ||||
| 	nanos := int32(t.Sub(time.Unix(seconds, 0))) | ||||
| 	ts := &tspb.Timestamp{ | ||||
| 		Seconds: seconds, | ||||
| 		Nanos:   nanos, | ||||
| 	} | ||||
| 	if err := validateTimestamp(ts); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return ts, nil | ||||
| } | ||||
|  | ||||
| // TimestampString returns the RFC 3339 string for valid Timestamps. For invalid | ||||
| // Timestamps, it returns an error message in parentheses. | ||||
| func TimestampString(ts *tspb.Timestamp) string { | ||||
| 	t, err := Timestamp(ts) | ||||
| 	if err != nil { | ||||
| 		return fmt.Sprintf("(%v)", err) | ||||
| 	} | ||||
| 	return t.Format(time.RFC3339Nano) | ||||
| } | ||||
							
								
								
									
										127
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: github.com/golang/protobuf/ptypes/timestamp/timestamp.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| /* | ||||
| Package timestamp is a generated protocol buffer package. | ||||
|  | ||||
| It is generated from these files: | ||||
| 	github.com/golang/protobuf/ptypes/timestamp/timestamp.proto | ||||
|  | ||||
| It has these top-level messages: | ||||
| 	Timestamp | ||||
| */ | ||||
| package timestamp | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import fmt "fmt" | ||||
| import math "math" | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = fmt.Errorf | ||||
| var _ = math.Inf | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the proto package it is being compiled against. | ||||
| // A compilation error at this line likely means your copy of the | ||||
| // proto package needs to be updated. | ||||
| const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package | ||||
|  | ||||
| // A Timestamp represents a point in time independent of any time zone | ||||
| // or calendar, represented as seconds and fractions of seconds at | ||||
| // nanosecond resolution in UTC Epoch time. It is encoded using the | ||||
| // Proleptic Gregorian Calendar which extends the Gregorian calendar | ||||
| // backwards to year one. It is encoded assuming all minutes are 60 | ||||
| // seconds long, i.e. leap seconds are "smeared" so that no leap second | ||||
| // table is needed for interpretation. Range is from | ||||
| // 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. | ||||
| // By restricting to that range, we ensure that we can convert to | ||||
| // and from  RFC 3339 date strings. | ||||
| // See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). | ||||
| // | ||||
| // Example 1: Compute Timestamp from POSIX `time()`. | ||||
| // | ||||
| //     Timestamp timestamp; | ||||
| //     timestamp.set_seconds(time(NULL)); | ||||
| //     timestamp.set_nanos(0); | ||||
| // | ||||
| // Example 2: Compute Timestamp from POSIX `gettimeofday()`. | ||||
| // | ||||
| //     struct timeval tv; | ||||
| //     gettimeofday(&tv, NULL); | ||||
| // | ||||
| //     Timestamp timestamp; | ||||
| //     timestamp.set_seconds(tv.tv_sec); | ||||
| //     timestamp.set_nanos(tv.tv_usec * 1000); | ||||
| // | ||||
| // Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. | ||||
| // | ||||
| //     FILETIME ft; | ||||
| //     GetSystemTimeAsFileTime(&ft); | ||||
| //     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; | ||||
| // | ||||
| //     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z | ||||
| //     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. | ||||
| //     Timestamp timestamp; | ||||
| //     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); | ||||
| //     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); | ||||
| // | ||||
| // Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. | ||||
| // | ||||
| //     long millis = System.currentTimeMillis(); | ||||
| // | ||||
| //     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) | ||||
| //         .setNanos((int) ((millis % 1000) * 1000000)).build(); | ||||
| // | ||||
| // | ||||
| // Example 5: Compute Timestamp from current time in Python. | ||||
| // | ||||
| //     now = time.time() | ||||
| //     seconds = int(now) | ||||
| //     nanos = int((now - seconds) * 10**9) | ||||
| //     timestamp = Timestamp(seconds=seconds, nanos=nanos) | ||||
| // | ||||
| // | ||||
| type Timestamp struct { | ||||
| 	// Represents seconds of UTC time since Unix epoch | ||||
| 	// 1970-01-01T00:00:00Z. Must be from from 0001-01-01T00:00:00Z to | ||||
| 	// 9999-12-31T23:59:59Z inclusive. | ||||
| 	Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"` | ||||
| 	// Non-negative fractions of a second at nanosecond resolution. Negative | ||||
| 	// second values with fractions must still have non-negative nanos values | ||||
| 	// that count forward in time. Must be from 0 to 999,999,999 | ||||
| 	// inclusive. | ||||
| 	Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *Timestamp) Reset()                    { *m = Timestamp{} } | ||||
| func (m *Timestamp) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Timestamp) ProtoMessage()               {} | ||||
| func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } | ||||
| func (*Timestamp) XXX_WellKnownType() string   { return "Timestamp" } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp") | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterFile("github.com/golang/protobuf/ptypes/timestamp/timestamp.proto", fileDescriptor0) | ||||
| } | ||||
|  | ||||
| var fileDescriptor0 = []byte{ | ||||
| 	// 194 bytes of a gzipped FileDescriptorProto | ||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xb2, 0x4e, 0xcf, 0x2c, 0xc9, | ||||
| 	0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0x2f, 0x28, | ||||
| 	0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0x28, 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x2f, 0xc9, | ||||
| 	0xcc, 0x4d, 0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0x40, 0xb0, 0xf4, 0xc0, 0x6a, 0x84, 0xf8, 0xd3, 0xf3, | ||||
| 	0xf3, 0xd3, 0x73, 0x52, 0xf5, 0x60, 0x3a, 0x94, 0xac, 0xb9, 0x38, 0x43, 0x60, 0x6a, 0x84, 0x24, | ||||
| 	0xb8, 0xd8, 0x8b, 0x53, 0x93, 0xf3, 0xf3, 0x52, 0x8a, 0x25, 0x18, 0x15, 0x18, 0x35, 0x98, 0x83, | ||||
| 	0x60, 0x5c, 0x21, 0x11, 0x2e, 0xd6, 0xbc, 0xc4, 0xbc, 0xfc, 0x62, 0x09, 0x26, 0x05, 0x46, 0x0d, | ||||
| 	0xd6, 0x20, 0x08, 0xc7, 0xa9, 0x91, 0x91, 0x4b, 0x38, 0x39, 0x3f, 0x57, 0x0f, 0xcd, 0x50, 0x27, | ||||
| 	0x3e, 0xb8, 0x91, 0x01, 0x20, 0xa1, 0x00, 0xc6, 0x28, 0x6d, 0x12, 0x1c, 0xbd, 0x80, 0x91, 0xf1, | ||||
| 	0x07, 0x23, 0xe3, 0x22, 0x26, 0x66, 0xf7, 0x00, 0xa7, 0x55, 0x4c, 0x72, 0xee, 0x10, 0xc3, 0x03, | ||||
| 	0xa0, 0xca, 0xf5, 0xc2, 0x53, 0x73, 0x72, 0xbc, 0xf3, 0xf2, 0xcb, 0xf3, 0x42, 0x40, 0xda, 0x92, | ||||
| 	0xd8, 0xc0, 0xe6, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x17, 0x5f, 0xb7, 0xdc, 0x17, 0x01, | ||||
| 	0x00, 0x00, | ||||
| } | ||||
							
								
								
									
										111
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,111 @@ | ||||
| // 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. | ||||
|  | ||||
| syntax = "proto3"; | ||||
|  | ||||
| package google.protobuf; | ||||
|  | ||||
| option csharp_namespace = "Google.Protobuf.WellKnownTypes"; | ||||
| option cc_enable_arenas = true; | ||||
| option go_package = "github.com/golang/protobuf/ptypes/timestamp"; | ||||
| option java_package = "com.google.protobuf"; | ||||
| option java_outer_classname = "TimestampProto"; | ||||
| option java_multiple_files = true; | ||||
| option java_generate_equals_and_hash = true; | ||||
| option objc_class_prefix = "GPB"; | ||||
|  | ||||
| // A Timestamp represents a point in time independent of any time zone | ||||
| // or calendar, represented as seconds and fractions of seconds at | ||||
| // nanosecond resolution in UTC Epoch time. It is encoded using the | ||||
| // Proleptic Gregorian Calendar which extends the Gregorian calendar | ||||
| // backwards to year one. It is encoded assuming all minutes are 60 | ||||
| // seconds long, i.e. leap seconds are "smeared" so that no leap second | ||||
| // table is needed for interpretation. Range is from | ||||
| // 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. | ||||
| // By restricting to that range, we ensure that we can convert to | ||||
| // and from  RFC 3339 date strings. | ||||
| // See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). | ||||
| // | ||||
| // Example 1: Compute Timestamp from POSIX `time()`. | ||||
| // | ||||
| //     Timestamp timestamp; | ||||
| //     timestamp.set_seconds(time(NULL)); | ||||
| //     timestamp.set_nanos(0); | ||||
| // | ||||
| // Example 2: Compute Timestamp from POSIX `gettimeofday()`. | ||||
| // | ||||
| //     struct timeval tv; | ||||
| //     gettimeofday(&tv, NULL); | ||||
| // | ||||
| //     Timestamp timestamp; | ||||
| //     timestamp.set_seconds(tv.tv_sec); | ||||
| //     timestamp.set_nanos(tv.tv_usec * 1000); | ||||
| // | ||||
| // Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. | ||||
| // | ||||
| //     FILETIME ft; | ||||
| //     GetSystemTimeAsFileTime(&ft); | ||||
| //     UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; | ||||
| // | ||||
| //     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z | ||||
| //     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. | ||||
| //     Timestamp timestamp; | ||||
| //     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); | ||||
| //     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); | ||||
| // | ||||
| // Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. | ||||
| // | ||||
| //     long millis = System.currentTimeMillis(); | ||||
| // | ||||
| //     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) | ||||
| //         .setNanos((int) ((millis % 1000) * 1000000)).build(); | ||||
| // | ||||
| // | ||||
| // Example 5: Compute Timestamp from current time in Python. | ||||
| // | ||||
| //     now = time.time() | ||||
| //     seconds = int(now) | ||||
| //     nanos = int((now - seconds) * 10**9) | ||||
| //     timestamp = Timestamp(seconds=seconds, nanos=nanos) | ||||
| // | ||||
| // | ||||
| message Timestamp { | ||||
|  | ||||
|   // Represents seconds of UTC time since Unix epoch | ||||
|   // 1970-01-01T00:00:00Z. Must be from from 0001-01-01T00:00:00Z to | ||||
|   // 9999-12-31T23:59:59Z inclusive. | ||||
|   int64 seconds = 1; | ||||
|  | ||||
|   // Non-negative fractions of a second at nanosecond resolution. Negative | ||||
|   // second values with fractions must still have non-negative nanos values | ||||
|   // that count forward in time. Must be from 0 to 999,999,999 | ||||
|   // inclusive. | ||||
|   int32 nanos = 2; | ||||
| } | ||||
							
								
								
									
										138
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp_test.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | ||||
| // Go support for Protocol Buffers - Google's data interchange format | ||||
| // | ||||
| // Copyright 2016 The Go Authors.  All rights reserved. | ||||
| // https://github.com/golang/protobuf | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package ptypes | ||||
|  | ||||
| import ( | ||||
| 	"math" | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	tspb "github.com/golang/protobuf/ptypes/timestamp" | ||||
| ) | ||||
|  | ||||
| var tests = []struct { | ||||
| 	ts    *tspb.Timestamp | ||||
| 	valid bool | ||||
| 	t     time.Time | ||||
| }{ | ||||
| 	// The timestamp representing the Unix epoch date. | ||||
| 	{&tspb.Timestamp{0, 0}, true, utcDate(1970, 1, 1)}, | ||||
| 	// The smallest representable timestamp. | ||||
| 	{&tspb.Timestamp{math.MinInt64, math.MinInt32}, false, | ||||
| 		time.Unix(math.MinInt64, math.MinInt32).UTC()}, | ||||
| 	// The smallest representable timestamp with non-negative nanos. | ||||
| 	{&tspb.Timestamp{math.MinInt64, 0}, false, time.Unix(math.MinInt64, 0).UTC()}, | ||||
| 	// The earliest valid timestamp. | ||||
| 	{&tspb.Timestamp{minValidSeconds, 0}, true, utcDate(1, 1, 1)}, | ||||
| 	//"0001-01-01T00:00:00Z"}, | ||||
| 	// The largest representable timestamp. | ||||
| 	{&tspb.Timestamp{math.MaxInt64, math.MaxInt32}, false, | ||||
| 		time.Unix(math.MaxInt64, math.MaxInt32).UTC()}, | ||||
| 	// The largest representable timestamp with nanos in range. | ||||
| 	{&tspb.Timestamp{math.MaxInt64, 1e9 - 1}, false, | ||||
| 		time.Unix(math.MaxInt64, 1e9-1).UTC()}, | ||||
| 	// The largest valid timestamp. | ||||
| 	{&tspb.Timestamp{maxValidSeconds - 1, 1e9 - 1}, true, | ||||
| 		time.Date(9999, 12, 31, 23, 59, 59, 1e9-1, time.UTC)}, | ||||
| 	// The smallest invalid timestamp that is larger than the valid range. | ||||
| 	{&tspb.Timestamp{maxValidSeconds, 0}, false, time.Unix(maxValidSeconds, 0).UTC()}, | ||||
| 	// A date before the epoch. | ||||
| 	{&tspb.Timestamp{-281836800, 0}, true, utcDate(1961, 1, 26)}, | ||||
| 	// A date after the epoch. | ||||
| 	{&tspb.Timestamp{1296000000, 0}, true, utcDate(2011, 1, 26)}, | ||||
| 	// A date after the epoch, in the middle of the day. | ||||
| 	{&tspb.Timestamp{1296012345, 940483}, true, | ||||
| 		time.Date(2011, 1, 26, 3, 25, 45, 940483, time.UTC)}, | ||||
| } | ||||
|  | ||||
| func TestValidateTimestamp(t *testing.T) { | ||||
| 	for _, s := range tests { | ||||
| 		got := validateTimestamp(s.ts) | ||||
| 		if (got == nil) != s.valid { | ||||
| 			t.Errorf("validateTimestamp(%v) = %v, want %v", s.ts, got, s.valid) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestTimestamp(t *testing.T) { | ||||
| 	for _, s := range tests { | ||||
| 		got, err := Timestamp(s.ts) | ||||
| 		if (err == nil) != s.valid { | ||||
| 			t.Errorf("Timestamp(%v) error = %v, but valid = %t", s.ts, err, s.valid) | ||||
| 		} else if s.valid && got != s.t { | ||||
| 			t.Errorf("Timestamp(%v) = %v, want %v", s.ts, got, s.t) | ||||
| 		} | ||||
| 	} | ||||
| 	// Special case: a nil Timestamp is an error, but returns the 0 Unix time. | ||||
| 	got, err := Timestamp(nil) | ||||
| 	want := time.Unix(0, 0).UTC() | ||||
| 	if got != want { | ||||
| 		t.Errorf("Timestamp(nil) = %v, want %v", got, want) | ||||
| 	} | ||||
| 	if err == nil { | ||||
| 		t.Errorf("Timestamp(nil) error = nil, expected error") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestTimestampProto(t *testing.T) { | ||||
| 	for _, s := range tests { | ||||
| 		got, err := TimestampProto(s.t) | ||||
| 		if (err == nil) != s.valid { | ||||
| 			t.Errorf("TimestampProto(%v) error = %v, but valid = %t", s.t, err, s.valid) | ||||
| 		} else if s.valid && !proto.Equal(got, s.ts) { | ||||
| 			t.Errorf("TimestampProto(%v) = %v, want %v", s.t, got, s.ts) | ||||
| 		} | ||||
| 	} | ||||
| 	// No corresponding special case here: no time.Time results in a nil Timestamp. | ||||
| } | ||||
|  | ||||
| func TestTimestampString(t *testing.T) { | ||||
| 	for _, test := range []struct { | ||||
| 		ts   *tspb.Timestamp | ||||
| 		want string | ||||
| 	}{ | ||||
| 		// Not much testing needed because presumably time.Format is | ||||
| 		// well-tested. | ||||
| 		{&tspb.Timestamp{0, 0}, "1970-01-01T00:00:00Z"}, | ||||
| 		{&tspb.Timestamp{minValidSeconds - 1, 0}, "(timestamp: seconds:-62135596801  before 0001-01-01)"}, | ||||
| 	} { | ||||
| 		got := TimestampString(test.ts) | ||||
| 		if got != test.want { | ||||
| 			t.Errorf("TimestampString(%v) = %q, want %q", test.ts, got, test.want) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func utcDate(year, month, day int) time.Time { | ||||
| 	return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC) | ||||
| } | ||||
							
								
								
									
										200
									
								
								vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								vendor/github.com/golang/protobuf/ptypes/wrappers/wrappers.pb.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,200 @@ | ||||
| // Code generated by protoc-gen-go. | ||||
| // source: github.com/golang/protobuf/ptypes/wrappers/wrappers.proto | ||||
| // DO NOT EDIT! | ||||
|  | ||||
| /* | ||||
| Package wrappers is a generated protocol buffer package. | ||||
|  | ||||
| It is generated from these files: | ||||
| 	github.com/golang/protobuf/ptypes/wrappers/wrappers.proto | ||||
|  | ||||
| It has these top-level messages: | ||||
| 	DoubleValue | ||||
| 	FloatValue | ||||
| 	Int64Value | ||||
| 	UInt64Value | ||||
| 	Int32Value | ||||
| 	UInt32Value | ||||
| 	BoolValue | ||||
| 	StringValue | ||||
| 	BytesValue | ||||
| */ | ||||
| package wrappers | ||||
|  | ||||
| import proto "github.com/golang/protobuf/proto" | ||||
| import fmt "fmt" | ||||
| import math "math" | ||||
|  | ||||
| // Reference imports to suppress errors if they are not otherwise used. | ||||
| var _ = proto.Marshal | ||||
| var _ = fmt.Errorf | ||||
| var _ = math.Inf | ||||
|  | ||||
| // This is a compile-time assertion to ensure that this generated file | ||||
| // is compatible with the proto package it is being compiled against. | ||||
| // A compilation error at this line likely means your copy of the | ||||
| // proto package needs to be updated. | ||||
| const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package | ||||
|  | ||||
| // Wrapper message for `double`. | ||||
| // | ||||
| // The JSON representation for `DoubleValue` is JSON number. | ||||
| type DoubleValue struct { | ||||
| 	// The double value. | ||||
| 	Value float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *DoubleValue) Reset()                    { *m = DoubleValue{} } | ||||
| func (m *DoubleValue) String() string            { return proto.CompactTextString(m) } | ||||
| func (*DoubleValue) ProtoMessage()               {} | ||||
| func (*DoubleValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } | ||||
| func (*DoubleValue) XXX_WellKnownType() string   { return "DoubleValue" } | ||||
|  | ||||
| // Wrapper message for `float`. | ||||
| // | ||||
| // The JSON representation for `FloatValue` is JSON number. | ||||
| type FloatValue struct { | ||||
| 	// The float value. | ||||
| 	Value float32 `protobuf:"fixed32,1,opt,name=value" json:"value,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *FloatValue) Reset()                    { *m = FloatValue{} } | ||||
| func (m *FloatValue) String() string            { return proto.CompactTextString(m) } | ||||
| func (*FloatValue) ProtoMessage()               {} | ||||
| func (*FloatValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } | ||||
| func (*FloatValue) XXX_WellKnownType() string   { return "FloatValue" } | ||||
|  | ||||
| // Wrapper message for `int64`. | ||||
| // | ||||
| // The JSON representation for `Int64Value` is JSON string. | ||||
| type Int64Value struct { | ||||
| 	// The int64 value. | ||||
| 	Value int64 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *Int64Value) Reset()                    { *m = Int64Value{} } | ||||
| func (m *Int64Value) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Int64Value) ProtoMessage()               {} | ||||
| func (*Int64Value) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } | ||||
| func (*Int64Value) XXX_WellKnownType() string   { return "Int64Value" } | ||||
|  | ||||
| // Wrapper message for `uint64`. | ||||
| // | ||||
| // The JSON representation for `UInt64Value` is JSON string. | ||||
| type UInt64Value struct { | ||||
| 	// The uint64 value. | ||||
| 	Value uint64 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *UInt64Value) Reset()                    { *m = UInt64Value{} } | ||||
| func (m *UInt64Value) String() string            { return proto.CompactTextString(m) } | ||||
| func (*UInt64Value) ProtoMessage()               {} | ||||
| func (*UInt64Value) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } | ||||
| func (*UInt64Value) XXX_WellKnownType() string   { return "UInt64Value" } | ||||
|  | ||||
| // Wrapper message for `int32`. | ||||
| // | ||||
| // The JSON representation for `Int32Value` is JSON number. | ||||
| type Int32Value struct { | ||||
| 	// The int32 value. | ||||
| 	Value int32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *Int32Value) Reset()                    { *m = Int32Value{} } | ||||
| func (m *Int32Value) String() string            { return proto.CompactTextString(m) } | ||||
| func (*Int32Value) ProtoMessage()               {} | ||||
| func (*Int32Value) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } | ||||
| func (*Int32Value) XXX_WellKnownType() string   { return "Int32Value" } | ||||
|  | ||||
| // Wrapper message for `uint32`. | ||||
| // | ||||
| // The JSON representation for `UInt32Value` is JSON number. | ||||
| type UInt32Value struct { | ||||
| 	// The uint32 value. | ||||
| 	Value uint32 `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *UInt32Value) Reset()                    { *m = UInt32Value{} } | ||||
| func (m *UInt32Value) String() string            { return proto.CompactTextString(m) } | ||||
| func (*UInt32Value) ProtoMessage()               {} | ||||
| func (*UInt32Value) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } | ||||
| func (*UInt32Value) XXX_WellKnownType() string   { return "UInt32Value" } | ||||
|  | ||||
| // Wrapper message for `bool`. | ||||
| // | ||||
| // The JSON representation for `BoolValue` is JSON `true` and `false`. | ||||
| type BoolValue struct { | ||||
| 	// The bool value. | ||||
| 	Value bool `protobuf:"varint,1,opt,name=value" json:"value,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *BoolValue) Reset()                    { *m = BoolValue{} } | ||||
| func (m *BoolValue) String() string            { return proto.CompactTextString(m) } | ||||
| func (*BoolValue) ProtoMessage()               {} | ||||
| func (*BoolValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } | ||||
| func (*BoolValue) XXX_WellKnownType() string   { return "BoolValue" } | ||||
|  | ||||
| // Wrapper message for `string`. | ||||
| // | ||||
| // The JSON representation for `StringValue` is JSON string. | ||||
| type StringValue struct { | ||||
| 	// The string value. | ||||
| 	Value string `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *StringValue) Reset()                    { *m = StringValue{} } | ||||
| func (m *StringValue) String() string            { return proto.CompactTextString(m) } | ||||
| func (*StringValue) ProtoMessage()               {} | ||||
| func (*StringValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } | ||||
| func (*StringValue) XXX_WellKnownType() string   { return "StringValue" } | ||||
|  | ||||
| // Wrapper message for `bytes`. | ||||
| // | ||||
| // The JSON representation for `BytesValue` is JSON string. | ||||
| type BytesValue struct { | ||||
| 	// The bytes value. | ||||
| 	Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m *BytesValue) Reset()                    { *m = BytesValue{} } | ||||
| func (m *BytesValue) String() string            { return proto.CompactTextString(m) } | ||||
| func (*BytesValue) ProtoMessage()               {} | ||||
| func (*BytesValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } | ||||
| func (*BytesValue) XXX_WellKnownType() string   { return "BytesValue" } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterType((*DoubleValue)(nil), "google.protobuf.DoubleValue") | ||||
| 	proto.RegisterType((*FloatValue)(nil), "google.protobuf.FloatValue") | ||||
| 	proto.RegisterType((*Int64Value)(nil), "google.protobuf.Int64Value") | ||||
| 	proto.RegisterType((*UInt64Value)(nil), "google.protobuf.UInt64Value") | ||||
| 	proto.RegisterType((*Int32Value)(nil), "google.protobuf.Int32Value") | ||||
| 	proto.RegisterType((*UInt32Value)(nil), "google.protobuf.UInt32Value") | ||||
| 	proto.RegisterType((*BoolValue)(nil), "google.protobuf.BoolValue") | ||||
| 	proto.RegisterType((*StringValue)(nil), "google.protobuf.StringValue") | ||||
| 	proto.RegisterType((*BytesValue)(nil), "google.protobuf.BytesValue") | ||||
| } | ||||
|  | ||||
| func init() { | ||||
| 	proto.RegisterFile("github.com/golang/protobuf/ptypes/wrappers/wrappers.proto", fileDescriptor0) | ||||
| } | ||||
|  | ||||
| var fileDescriptor0 = []byte{ | ||||
| 	// 260 bytes of a gzipped FileDescriptorProto | ||||
| 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xb2, 0x4c, 0xcf, 0x2c, 0xc9, | ||||
| 	0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0x2f, 0x28, | ||||
| 	0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0x28, 0xa9, 0x2c, 0x48, 0x2d, 0xd6, 0x2f, 0x2f, | ||||
| 	0x4a, 0x2c, 0x28, 0x48, 0x2d, 0x42, 0x30, 0xf4, 0xc0, 0x2a, 0x84, 0xf8, 0xd3, 0xf3, 0xf3, 0xd3, | ||||
| 	0x73, 0x52, 0xf5, 0x60, 0xea, 0x95, 0x94, 0xb9, 0xb8, 0x5d, 0xf2, 0x4b, 0x93, 0x72, 0x52, 0xc3, | ||||
| 	0x12, 0x73, 0x4a, 0x53, 0x85, 0x44, 0xb8, 0x58, 0xcb, 0x40, 0x0c, 0x09, 0x46, 0x05, 0x46, 0x0d, | ||||
| 	0xc6, 0x20, 0x08, 0x47, 0x49, 0x89, 0x8b, 0xcb, 0x2d, 0x27, 0x3f, 0xb1, 0x04, 0x8b, 0x1a, 0x26, | ||||
| 	0x24, 0x35, 0x9e, 0x79, 0x25, 0x66, 0x26, 0x58, 0xd4, 0x30, 0xc3, 0xd4, 0x28, 0x73, 0x71, 0x87, | ||||
| 	0xe2, 0x52, 0xc4, 0x82, 0x6a, 0x90, 0xb1, 0x11, 0x16, 0x35, 0xac, 0x68, 0x06, 0x61, 0x55, 0xc4, | ||||
| 	0x0b, 0x53, 0xa4, 0xc8, 0xc5, 0xe9, 0x94, 0x9f, 0x9f, 0x83, 0x45, 0x09, 0x07, 0x92, 0x39, 0xc1, | ||||
| 	0x25, 0x45, 0x99, 0x79, 0xe9, 0x58, 0x14, 0x71, 0x22, 0x39, 0xc8, 0xa9, 0xb2, 0x24, 0xb5, 0x18, | ||||
| 	0x8b, 0x1a, 0x1e, 0xa8, 0x1a, 0xa7, 0x7a, 0x2e, 0xe1, 0xe4, 0xfc, 0x5c, 0x3d, 0xb4, 0xd0, 0x75, | ||||
| 	0xe2, 0x0d, 0x87, 0x06, 0x7f, 0x00, 0x48, 0x24, 0x80, 0x31, 0x4a, 0x8b, 0xf8, 0xa8, 0x5b, 0xc0, | ||||
| 	0xc8, 0xf8, 0x83, 0x91, 0x71, 0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88, | ||||
| 	0xd1, 0x01, 0x50, 0xd5, 0x7a, 0xe1, 0xa9, 0x39, 0x39, 0xde, 0x79, 0xf9, 0xe5, 0x79, 0x21, 0x20, | ||||
| 	0x5d, 0x49, 0x6c, 0x60, 0x63, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa9, 0xdf, 0x64, 0x4b, | ||||
| 	0x1c, 0x02, 0x00, 0x00, | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user