chore: update vendor
This commit is contained in:
parent
ecb3e9c868
commit
f91ae88876
4
go.mod
4
go.mod
@ -1,8 +1,10 @@
|
|||||||
module novit.nc/direktil/local-server
|
module novit.nc/direktil/local-server
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/cavaliercoder/go-cpio v0.0.0-20180222193108-9caab6ff29df
|
github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e
|
||||||
github.com/cloudflare/cfssl v0.0.0-20180530085446-275fb308ac70
|
github.com/cloudflare/cfssl v0.0.0-20180530085446-275fb308ac70
|
||||||
|
github.com/golang/protobuf v1.1.0
|
||||||
|
github.com/google/certificate-transparency-go v1.0.19
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f
|
||||||
novit.nc/direktil/pkg v0.0.0-20180619202319-3b512e61055e
|
novit.nc/direktil/pkg v0.0.0-20180619202319-3b512e61055e
|
||||||
)
|
)
|
||||||
|
1
vendor/github.com/cavaliercoder/go-cpio/header.go
generated
vendored
1
vendor/github.com/cavaliercoder/go-cpio/header.go
generated
vendored
@ -122,6 +122,7 @@ func FileInfoHeader(fi os.FileInfo, link string) (*Header, error) {
|
|||||||
case fi.IsDir():
|
case fi.IsDir():
|
||||||
h.Mode |= ModeDir
|
h.Mode |= ModeDir
|
||||||
h.Name += "/"
|
h.Name += "/"
|
||||||
|
h.Size = 0
|
||||||
case fm&os.ModeSymlink != 0:
|
case fm&os.ModeSymlink != 0:
|
||||||
h.Mode |= ModeSymlink
|
h.Mode |= ModeSymlink
|
||||||
h.Linkname = link
|
h.Linkname = link
|
||||||
|
11
vendor/github.com/cavaliercoder/go-cpio/svr4.go
generated
vendored
11
vendor/github.com/cavaliercoder/go-cpio/svr4.go
generated
vendored
@ -13,7 +13,7 @@ const (
|
|||||||
svr4MaxFileSize = 4294967295
|
svr4MaxFileSize = 4294967295
|
||||||
)
|
)
|
||||||
|
|
||||||
var svr4Magic = []byte{0x30, 0x37, 0x30, 0x37, 0x30, 0x31} // 07070
|
var svr4Magic = []byte{0x30, 0x37, 0x30, 0x37, 0x30, 0x31} // 070701
|
||||||
|
|
||||||
func readHex(s string) int64 {
|
func readHex(s string) int64 {
|
||||||
// errors are ignored and 0 returned
|
// errors are ignored and 0 returned
|
||||||
@ -108,7 +108,11 @@ func writeSVR4Header(w io.Writer, hdr *Header) (pad int64, err error) {
|
|||||||
for i := 0; i < len(hdrBuf); i++ {
|
for i := 0; i < len(hdrBuf); i++ {
|
||||||
hdrBuf[i] = '0'
|
hdrBuf[i] = '0'
|
||||||
}
|
}
|
||||||
copy(hdrBuf[:], svr4Magic)
|
magic := svr4Magic
|
||||||
|
if hdr.Checksum != 0 {
|
||||||
|
magic[5] = 0x32
|
||||||
|
}
|
||||||
|
copy(hdrBuf[:], magic)
|
||||||
writeHex(hdrBuf[6:14], hdr.Inode)
|
writeHex(hdrBuf[6:14], hdr.Inode)
|
||||||
writeHex(hdrBuf[14:22], int64(hdr.Mode))
|
writeHex(hdrBuf[14:22], int64(hdr.Mode))
|
||||||
writeHex(hdrBuf[22:30], int64(hdr.UID))
|
writeHex(hdrBuf[22:30], int64(hdr.UID))
|
||||||
@ -119,6 +123,9 @@ func writeSVR4Header(w io.Writer, hdr *Header) (pad int64, err error) {
|
|||||||
}
|
}
|
||||||
writeHex(hdrBuf[54:62], hdr.Size)
|
writeHex(hdrBuf[54:62], hdr.Size)
|
||||||
writeHex(hdrBuf[94:102], int64(len(hdr.Name)+1))
|
writeHex(hdrBuf[94:102], int64(len(hdr.Name)+1))
|
||||||
|
if hdr.Checksum != 0 {
|
||||||
|
writeHex(hdrBuf[102:110], int64(hdr.Checksum))
|
||||||
|
}
|
||||||
|
|
||||||
// write header
|
// write header
|
||||||
_, err = w.Write(hdrBuf[:])
|
_, err = w.Write(hdrBuf[:])
|
||||||
|
2
vendor/github.com/cavaliercoder/go-cpio/testdata/etc/hosts
generated
vendored
Normal file
2
vendor/github.com/cavaliercoder/go-cpio/testdata/etc/hosts
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
127.0.0.1 localhost
|
||||||
|
::1 localhost
|
53
vendor/github.com/cavaliercoder/go-cpio/writer_test.go
generated
vendored
Normal file
53
vendor/github.com/cavaliercoder/go-cpio/writer_test.go
generated
vendored
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package cpio_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
cpio "github.com/cavaliercoder/go-cpio"
|
||||||
|
)
|
||||||
|
|
||||||
|
func store(w *cpio.Writer, fn string) error {
|
||||||
|
f, err := os.Open(fn)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
fi, err := f.Stat()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
hdr, err := cpio.FileInfoHeader(fi, "")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := w.WriteHeader(hdr); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !fi.IsDir() {
|
||||||
|
if _, err := io.Copy(w, f); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWriter(t *testing.T) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
w := cpio.NewWriter(&buf)
|
||||||
|
|
||||||
|
if err := store(w, "testdata/etc"); err != nil {
|
||||||
|
t.Fatalf("store: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := store(w, "testdata/etc/hosts"); err != nil {
|
||||||
|
t.Fatalf("store: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := w.Close(); err != nil {
|
||||||
|
t.Fatalf("Close: %v", err)
|
||||||
|
}
|
||||||
|
}
|
43
vendor/github.com/gogo/protobuf/proto/Makefile
generated
vendored
43
vendor/github.com/gogo/protobuf/proto/Makefile
generated
vendored
@ -1,43 +0,0 @@
|
|||||||
# 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-min-version --version="3.0.0" --proto_path=.:../../../../:../protobuf --gogo_out=Mtestdata/test.proto=github.com/gogo/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types:. proto3_proto/proto3.proto
|
|
||||||
make
|
|
2278
vendor/github.com/gogo/protobuf/proto/all_test.go
generated
vendored
2278
vendor/github.com/gogo/protobuf/proto/all_test.go
generated
vendored
File diff suppressed because it is too large
Load Diff
300
vendor/github.com/gogo/protobuf/proto/any_test.go
generated
vendored
300
vendor/github.com/gogo/protobuf/proto/any_test.go
generated
vendored
@ -1,300 +0,0 @@
|
|||||||
// 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/gogo/protobuf/proto"
|
|
||||||
|
|
||||||
pb "github.com/gogo/protobuf/proto/proto3_proto"
|
|
||||||
testpb "github.com/gogo/protobuf/proto/testdata"
|
|
||||||
"github.com/gogo/protobuf/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
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: &types.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(nested), Value: nb},
|
|
||||||
}
|
|
||||||
m2 := &pb.Message{
|
|
||||||
Name: "David",
|
|
||||||
ResultCount: 47,
|
|
||||||
Anything: &types.Any{TypeUrl: "http://[::1]/type.googleapis.com/" + proto.MessageName(nested), Value: nb},
|
|
||||||
}
|
|
||||||
m3 := &pb.Message{
|
|
||||||
Name: "David",
|
|
||||||
ResultCount: 47,
|
|
||||||
Anything: &types.Any{TypeUrl: `type.googleapis.com/"/` + proto.MessageName(nested), Value: nb},
|
|
||||||
}
|
|
||||||
m4 := &pb.Message{
|
|
||||||
Name: "David",
|
|
||||||
ResultCount: 47,
|
|
||||||
Anything: &types.Any{TypeUrl: "type.googleapis.com/a/path/" + proto.MessageName(nested), Value: nb},
|
|
||||||
}
|
|
||||||
m5 := &types.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: &types.Any{TypeUrl: "type.googleapis.com/" + proto.MessageName(any1), Value: any1b},
|
|
||||||
ManyThings: []*types.Any{
|
|
||||||
{TypeUrl: "type.googleapis.com/" + proto.MessageName(any2), Value: any2b},
|
|
||||||
{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: &types.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 := &types.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 := &types.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 := &types.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)
|
|
||||||
}
|
|
||||||
}
|
|
234
vendor/github.com/gogo/protobuf/proto/clone.go
generated
vendored
234
vendor/github.com/gogo/protobuf/proto/clone.go
generated
vendored
@ -1,234 +0,0 @@
|
|||||||
// 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 := in.Addr().Interface().(extensionsBytes); ok {
|
|
||||||
emOut := out.Addr().Interface().(extensionsBytes)
|
|
||||||
bIn := emIn.GetExtensions()
|
|
||||||
bOut := emOut.GetExtensions()
|
|
||||||
*bOut = append(*bOut, *bIn...)
|
|
||||||
} else 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/gogo/protobuf/proto/clone_test.go
generated
vendored
300
vendor/github.com/gogo/protobuf/proto/clone_test.go
generated
vendored
@ -1,300 +0,0 @@
|
|||||||
// 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/gogo/protobuf/proto"
|
|
||||||
|
|
||||||
proto3pb "github.com/gogo/protobuf/proto/proto3_proto"
|
|
||||||
pb "github.com/gogo/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: {F: proto.Float64(2.0)},
|
|
||||||
0x4002: {
|
|
||||||
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: {
|
|
||||||
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: {F: proto.Float64(2.0)},
|
|
||||||
0x4002: {
|
|
||||||
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{Number: 41},
|
|
||||||
},
|
|
||||||
dst: &pb.Communique{
|
|
||||||
Union: &pb.Communique_Name{Name: "Bobby Tables"},
|
|
||||||
},
|
|
||||||
want: &pb.Communique{
|
|
||||||
Union: &pb.Communique_Number{Number: 41},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// Oneof nil is the same as not set.
|
|
||||||
{
|
|
||||||
src: &pb.Communique{},
|
|
||||||
dst: &pb.Communique{
|
|
||||||
Union: &pb.Communique_Name{Name: "Bobby Tables"},
|
|
||||||
},
|
|
||||||
want: &pb.Communique{
|
|
||||||
Union: &pb.Communique_Name{Name: "Bobby Tables"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: &proto3pb.Message{
|
|
||||||
Terrain: map[string]*proto3pb.Nested{
|
|
||||||
"kay_a": {Cute: true}, // replace
|
|
||||||
"kay_b": {Bunny: "rabbit"}, // insert
|
|
||||||
},
|
|
||||||
},
|
|
||||||
dst: &proto3pb.Message{
|
|
||||||
Terrain: map[string]*proto3pb.Nested{
|
|
||||||
"kay_a": {Bunny: "lost"}, // replaced
|
|
||||||
"kay_c": {Bunny: "bunny"}, // keep
|
|
||||||
},
|
|
||||||
},
|
|
||||||
want: &proto3pb.Message{
|
|
||||||
Terrain: map[string]*proto3pb.Nested{
|
|
||||||
"kay_a": {Cute: true},
|
|
||||||
"kay_b": {Bunny: "rabbit"},
|
|
||||||
"kay_c": {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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
978
vendor/github.com/gogo/protobuf/proto/decode.go
generated
vendored
978
vendor/github.com/gogo/protobuf/proto/decode.go
generated
vendored
@ -1,978 +0,0 @@
|
|||||||
// 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, eok := structPointer_Interface(base, st).(extensionsBytes); eok {
|
|
||||||
if isExtensionField(e, int32(tag)) {
|
|
||||||
if err = o.skip(st, tag, wire); err == nil {
|
|
||||||
ext := e.GetExtensions()
|
|
||||||
*ext = append(*ext, o.buf[oi:o.index]...)
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
} else 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
|
|
||||||
}
|
|
172
vendor/github.com/gogo/protobuf/proto/decode_gogo.go
generated
vendored
172
vendor/github.com/gogo/protobuf/proto/decode_gogo.go
generated
vendored
@ -1,172 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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 (
|
|
||||||
"reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Decode a reference to a struct pointer.
|
|
||||||
func (o *Buffer) dec_ref_struct_message(p *Properties, base structPointer) (err error) {
|
|
||||||
raw, e := o.DecodeRawBytes(false)
|
|
||||||
if e != nil {
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the object can unmarshal itself, let it.
|
|
||||||
if p.isUnmarshaler {
|
|
||||||
panic("not supported, since this is a pointer receiver")
|
|
||||||
}
|
|
||||||
|
|
||||||
obuf := o.buf
|
|
||||||
oi := o.index
|
|
||||||
o.buf = raw
|
|
||||||
o.index = 0
|
|
||||||
|
|
||||||
bas := structPointer_FieldPointer(base, p.field)
|
|
||||||
|
|
||||||
err = o.unmarshalType(p.stype, p.sprop, false, bas)
|
|
||||||
o.buf = obuf
|
|
||||||
o.index = oi
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decode a slice of references to struct pointers ([]struct).
|
|
||||||
func (o *Buffer) dec_slice_ref_struct(p *Properties, is_group bool, base structPointer) error {
|
|
||||||
newBas := appendStructPointer(base, p.field, p.sstype)
|
|
||||||
|
|
||||||
if is_group {
|
|
||||||
panic("not supported, maybe in future, if requested.")
|
|
||||||
}
|
|
||||||
|
|
||||||
raw, err := o.DecodeRawBytes(false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the object can unmarshal itself, let it.
|
|
||||||
if p.isUnmarshaler {
|
|
||||||
panic("not supported, since this is not a pointer receiver.")
|
|
||||||
}
|
|
||||||
|
|
||||||
obuf := o.buf
|
|
||||||
oi := o.index
|
|
||||||
o.buf = raw
|
|
||||||
o.index = 0
|
|
||||||
|
|
||||||
err = o.unmarshalType(p.stype, p.sprop, is_group, newBas)
|
|
||||||
|
|
||||||
o.buf = obuf
|
|
||||||
o.index = oi
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decode a slice of references to struct pointers.
|
|
||||||
func (o *Buffer) dec_slice_ref_struct_message(p *Properties, base structPointer) error {
|
|
||||||
return o.dec_slice_ref_struct(p, false, base)
|
|
||||||
}
|
|
||||||
|
|
||||||
func setPtrCustomType(base structPointer, f field, v interface{}) {
|
|
||||||
if v == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
structPointer_SetStructPointer(base, f, toStructPointer(reflect.ValueOf(v)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func setCustomType(base structPointer, f field, value interface{}) {
|
|
||||||
if value == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
v := reflect.ValueOf(value).Elem()
|
|
||||||
t := reflect.TypeOf(value).Elem()
|
|
||||||
kind := t.Kind()
|
|
||||||
switch kind {
|
|
||||||
case reflect.Slice:
|
|
||||||
slice := reflect.MakeSlice(t, v.Len(), v.Cap())
|
|
||||||
reflect.Copy(slice, v)
|
|
||||||
oldHeader := structPointer_GetSliceHeader(base, f)
|
|
||||||
oldHeader.Data = slice.Pointer()
|
|
||||||
oldHeader.Len = v.Len()
|
|
||||||
oldHeader.Cap = v.Cap()
|
|
||||||
default:
|
|
||||||
size := reflect.TypeOf(value).Elem().Size()
|
|
||||||
structPointer_Copy(toStructPointer(reflect.ValueOf(value)), structPointer_Add(base, f), int(size))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) dec_custom_bytes(p *Properties, base structPointer) error {
|
|
||||||
b, err := o.DecodeRawBytes(true)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
i := reflect.New(p.ctype.Elem()).Interface()
|
|
||||||
custom := (i).(Unmarshaler)
|
|
||||||
if err := custom.Unmarshal(b); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
setPtrCustomType(base, p.field, custom)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) dec_custom_ref_bytes(p *Properties, base structPointer) error {
|
|
||||||
b, err := o.DecodeRawBytes(true)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
i := reflect.New(p.ctype).Interface()
|
|
||||||
custom := (i).(Unmarshaler)
|
|
||||||
if err := custom.Unmarshal(b); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if custom != nil {
|
|
||||||
setCustomType(base, p.field, custom)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decode a slice of bytes ([]byte) into a slice of custom types.
|
|
||||||
func (o *Buffer) dec_custom_slice_bytes(p *Properties, base structPointer) error {
|
|
||||||
b, err := o.DecodeRawBytes(true)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
i := reflect.New(p.ctype.Elem()).Interface()
|
|
||||||
custom := (i).(Unmarshaler)
|
|
||||||
if err := custom.Unmarshal(b); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
newBas := appendStructPointer(base, p.field, p.ctype)
|
|
||||||
|
|
||||||
var zero field
|
|
||||||
setCustomType(newBas, zero, custom)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
262
vendor/github.com/gogo/protobuf/proto/decode_test.go
generated
vendored
262
vendor/github.com/gogo/protobuf/proto/decode_test.go
generated
vendored
@ -1,262 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// +build go1.7
|
|
||||||
|
|
||||||
package proto_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/gogo/protobuf/proto"
|
|
||||||
tpb "github.com/gogo/protobuf/proto/proto3_proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
bytesBlackhole []byte
|
|
||||||
msgBlackhole = new(tpb.Message)
|
|
||||||
)
|
|
||||||
|
|
||||||
// Disabled this Benchmark because it is using features (b.Run) from go1.7 and gogoprotobuf still have compatibility with go1.5
|
|
||||||
// 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)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Disabled this Benchmark because it is using features (b.Run) from go1.7 and gogoprotobuf still have compatibility with go1.5
|
|
||||||
// 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)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Disabled this Benchmark because it is using features (b.Run) from go1.7 and gogoprotobuf still have compatibility with go1.5
|
|
||||||
// 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)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Disabled this Benchmark because it is using features (b.Run) from go1.7 and gogoprotobuf still have compatibility with go1.5
|
|
||||||
// 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)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Disabled this Benchmark because it is using features (b.Run) from go1.7 and gogoprotobuf still have compatibility with go1.5
|
|
||||||
// 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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
151
vendor/github.com/gogo/protobuf/proto/discard.go
generated
vendored
151
vendor/github.com/gogo/protobuf/proto/discard.go
generated
vendored
@ -1,151 +0,0 @@
|
|||||||
// Go support for Protocol Buffers - Google's data interchange format
|
|
||||||
//
|
|
||||||
// Copyright 2017 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 (
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// DiscardUnknown recursively discards all unknown fields from this message
|
|
||||||
// and all embedded messages.
|
|
||||||
//
|
|
||||||
// When unmarshaling a message with unrecognized fields, the tags and values
|
|
||||||
// of such fields are preserved in the Message. This allows a later call to
|
|
||||||
// marshal to be able to produce a message that continues to have those
|
|
||||||
// unrecognized fields. To avoid this, DiscardUnknown is used to
|
|
||||||
// explicitly clear the unknown fields after unmarshaling.
|
|
||||||
//
|
|
||||||
// For proto2 messages, the unknown fields of message extensions are only
|
|
||||||
// discarded from messages that have been accessed via GetExtension.
|
|
||||||
func DiscardUnknown(m Message) {
|
|
||||||
discardLegacy(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func discardLegacy(m Message) {
|
|
||||||
v := reflect.ValueOf(m)
|
|
||||||
if v.Kind() != reflect.Ptr || v.IsNil() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
v = v.Elem()
|
|
||||||
if v.Kind() != reflect.Struct {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
t := v.Type()
|
|
||||||
|
|
||||||
for i := 0; i < v.NumField(); i++ {
|
|
||||||
f := t.Field(i)
|
|
||||||
if strings.HasPrefix(f.Name, "XXX_") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
vf := v.Field(i)
|
|
||||||
tf := f.Type
|
|
||||||
|
|
||||||
// Unwrap tf to get its most basic type.
|
|
||||||
var isPointer, isSlice bool
|
|
||||||
if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 {
|
|
||||||
isSlice = true
|
|
||||||
tf = tf.Elem()
|
|
||||||
}
|
|
||||||
if tf.Kind() == reflect.Ptr {
|
|
||||||
isPointer = true
|
|
||||||
tf = tf.Elem()
|
|
||||||
}
|
|
||||||
if isPointer && isSlice && tf.Kind() != reflect.Struct {
|
|
||||||
panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name))
|
|
||||||
}
|
|
||||||
|
|
||||||
switch tf.Kind() {
|
|
||||||
case reflect.Struct:
|
|
||||||
switch {
|
|
||||||
case !isPointer:
|
|
||||||
panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name))
|
|
||||||
case isSlice: // E.g., []*pb.T
|
|
||||||
for j := 0; j < vf.Len(); j++ {
|
|
||||||
discardLegacy(vf.Index(j).Interface().(Message))
|
|
||||||
}
|
|
||||||
default: // E.g., *pb.T
|
|
||||||
discardLegacy(vf.Interface().(Message))
|
|
||||||
}
|
|
||||||
case reflect.Map:
|
|
||||||
switch {
|
|
||||||
case isPointer || isSlice:
|
|
||||||
panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name))
|
|
||||||
default: // E.g., map[K]V
|
|
||||||
tv := vf.Type().Elem()
|
|
||||||
if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T)
|
|
||||||
for _, key := range vf.MapKeys() {
|
|
||||||
val := vf.MapIndex(key)
|
|
||||||
discardLegacy(val.Interface().(Message))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case reflect.Interface:
|
|
||||||
// Must be oneof field.
|
|
||||||
switch {
|
|
||||||
case isPointer || isSlice:
|
|
||||||
panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name))
|
|
||||||
default: // E.g., test_proto.isCommunique_Union interface
|
|
||||||
if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" {
|
|
||||||
vf = vf.Elem() // E.g., *test_proto.Communique_Msg
|
|
||||||
if !vf.IsNil() {
|
|
||||||
vf = vf.Elem() // E.g., test_proto.Communique_Msg
|
|
||||||
vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value
|
|
||||||
if vf.Kind() == reflect.Ptr {
|
|
||||||
discardLegacy(vf.Interface().(Message))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() {
|
|
||||||
if vf.Type() != reflect.TypeOf([]byte{}) {
|
|
||||||
panic("expected XXX_unrecognized to be of type []byte")
|
|
||||||
}
|
|
||||||
vf.Set(reflect.ValueOf([]byte(nil)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// For proto2 messages, only discard unknown fields in message extensions
|
|
||||||
// that have been accessed via GetExtension.
|
|
||||||
if em, ok := extendable(m); ok {
|
|
||||||
// Ignore lock since discardLegacy is not concurrency safe.
|
|
||||||
emm, _ := em.extensionsRead()
|
|
||||||
for _, mx := range emm {
|
|
||||||
if m, ok := mx.value.(Message); ok {
|
|
||||||
discardLegacy(m)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
100
vendor/github.com/gogo/protobuf/proto/duration.go
generated
vendored
100
vendor/github.com/gogo/protobuf/proto/duration.go
generated
vendored
@ -1,100 +0,0 @@
|
|||||||
// 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
|
|
||||||
|
|
||||||
// This file implements conversions between google.protobuf.Duration
|
|
||||||
// and time.Duration.
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Range of a 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 Duration is valid according to the
|
|
||||||
// definition in google/protobuf/duration.proto. A valid Duration
|
|
||||||
// may still be too large to fit into a time.Duration (the range of Duration
|
|
||||||
// is about 10,000 years, and the range of time.Duration is about 290).
|
|
||||||
func validateDuration(d *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
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationFromProto converts a Duration to a time.Duration. DurationFromProto
|
|
||||||
// returns an error if the Duration is invalid or is too large to be
|
|
||||||
// represented in a time.Duration.
|
|
||||||
func durationFromProto(p *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 Duration.
|
|
||||||
func durationProto(d time.Duration) *duration {
|
|
||||||
nanos := d.Nanoseconds()
|
|
||||||
secs := nanos / 1e9
|
|
||||||
nanos -= secs * 1e9
|
|
||||||
return &duration{
|
|
||||||
Seconds: secs,
|
|
||||||
Nanos: int32(nanos),
|
|
||||||
}
|
|
||||||
}
|
|
203
vendor/github.com/gogo/protobuf/proto/duration_gogo.go
generated
vendored
203
vendor/github.com/gogo/protobuf/proto/duration_gogo.go
generated
vendored
@ -1,203 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2016, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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 (
|
|
||||||
"reflect"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
var durationType = reflect.TypeOf((*time.Duration)(nil)).Elem()
|
|
||||||
|
|
||||||
type duration struct {
|
|
||||||
Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"`
|
|
||||||
Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *duration) Reset() { *m = duration{} }
|
|
||||||
func (*duration) ProtoMessage() {}
|
|
||||||
func (*duration) String() string { return "duration<string>" }
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
RegisterType((*duration)(nil), "gogo.protobuf.proto.duration")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) decDuration() (time.Duration, error) {
|
|
||||||
b, err := o.DecodeRawBytes(true)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
dproto := &duration{}
|
|
||||||
if err := Unmarshal(b, dproto); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return durationFromProto(dproto)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) dec_duration(p *Properties, base structPointer) error {
|
|
||||||
d, err := o.decDuration()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
word64_Set(structPointer_Word64(base, p.field), o, uint64(d))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) dec_ref_duration(p *Properties, base structPointer) error {
|
|
||||||
d, err := o.decDuration()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
word64Val_Set(structPointer_Word64Val(base, p.field), o, uint64(d))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) dec_slice_duration(p *Properties, base structPointer) error {
|
|
||||||
d, err := o.decDuration()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
newBas := appendStructPointer(base, p.field, reflect.SliceOf(reflect.PtrTo(durationType)))
|
|
||||||
var zero field
|
|
||||||
setPtrCustomType(newBas, zero, &d)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) dec_slice_ref_duration(p *Properties, base structPointer) error {
|
|
||||||
d, err := o.decDuration()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
structPointer_Word64Slice(base, p.field).Append(uint64(d))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_duration(p *Properties, base structPointer) (n int) {
|
|
||||||
structp := structPointer_GetStructPointer(base, p.field)
|
|
||||||
if structPointer_IsNil(structp) {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
dur := structPointer_Interface(structp, durationType).(*time.Duration)
|
|
||||||
d := durationProto(*dur)
|
|
||||||
size := Size(d)
|
|
||||||
return size + sizeVarint(uint64(size)) + len(p.tagcode)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) enc_duration(p *Properties, base structPointer) error {
|
|
||||||
structp := structPointer_GetStructPointer(base, p.field)
|
|
||||||
if structPointer_IsNil(structp) {
|
|
||||||
return ErrNil
|
|
||||||
}
|
|
||||||
dur := structPointer_Interface(structp, durationType).(*time.Duration)
|
|
||||||
d := durationProto(*dur)
|
|
||||||
data, err := Marshal(d)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeRawBytes(data)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_ref_duration(p *Properties, base structPointer) (n int) {
|
|
||||||
dur := structPointer_InterfaceAt(base, p.field, durationType).(*time.Duration)
|
|
||||||
d := durationProto(*dur)
|
|
||||||
size := Size(d)
|
|
||||||
return size + sizeVarint(uint64(size)) + len(p.tagcode)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) enc_ref_duration(p *Properties, base structPointer) error {
|
|
||||||
dur := structPointer_InterfaceAt(base, p.field, durationType).(*time.Duration)
|
|
||||||
d := durationProto(*dur)
|
|
||||||
data, err := Marshal(d)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeRawBytes(data)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_slice_duration(p *Properties, base structPointer) (n int) {
|
|
||||||
pdurs := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(reflect.PtrTo(durationType))).(*[]*time.Duration)
|
|
||||||
durs := *pdurs
|
|
||||||
for i := 0; i < len(durs); i++ {
|
|
||||||
if durs[i] == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
dproto := durationProto(*durs[i])
|
|
||||||
size := Size(dproto)
|
|
||||||
n += len(p.tagcode) + size + sizeVarint(uint64(size))
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) enc_slice_duration(p *Properties, base structPointer) error {
|
|
||||||
pdurs := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(reflect.PtrTo(durationType))).(*[]*time.Duration)
|
|
||||||
durs := *pdurs
|
|
||||||
for i := 0; i < len(durs); i++ {
|
|
||||||
if durs[i] == nil {
|
|
||||||
return errRepeatedHasNil
|
|
||||||
}
|
|
||||||
dproto := durationProto(*durs[i])
|
|
||||||
data, err := Marshal(dproto)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeRawBytes(data)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_slice_ref_duration(p *Properties, base structPointer) (n int) {
|
|
||||||
pdurs := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(durationType)).(*[]time.Duration)
|
|
||||||
durs := *pdurs
|
|
||||||
for i := 0; i < len(durs); i++ {
|
|
||||||
dproto := durationProto(durs[i])
|
|
||||||
size := Size(dproto)
|
|
||||||
n += len(p.tagcode) + size + sizeVarint(uint64(size))
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) enc_slice_ref_duration(p *Properties, base structPointer) error {
|
|
||||||
pdurs := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(durationType)).(*[]time.Duration)
|
|
||||||
durs := *pdurs
|
|
||||||
for i := 0; i < len(durs); i++ {
|
|
||||||
dproto := durationProto(durs[i])
|
|
||||||
data, err := Marshal(dproto)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeRawBytes(data)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
1362
vendor/github.com/gogo/protobuf/proto/encode.go
generated
vendored
1362
vendor/github.com/gogo/protobuf/proto/encode.go
generated
vendored
File diff suppressed because it is too large
Load Diff
350
vendor/github.com/gogo/protobuf/proto/encode_gogo.go
generated
vendored
350
vendor/github.com/gogo/protobuf/proto/encode_gogo.go
generated
vendored
@ -1,350 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/protobuf
|
|
||||||
//
|
|
||||||
// Go support for Protocol Buffers - Google's data interchange format
|
|
||||||
//
|
|
||||||
// Copyright 2010 The Go Authors. All rights reserved.
|
|
||||||
// http://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 (
|
|
||||||
"reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
func NewRequiredNotSetError(field string) *RequiredNotSetError {
|
|
||||||
return &RequiredNotSetError{field}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Sizer interface {
|
|
||||||
Size() int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) enc_ext_slice_byte(p *Properties, base structPointer) error {
|
|
||||||
s := *structPointer_Bytes(base, p.field)
|
|
||||||
if s == nil {
|
|
||||||
return ErrNil
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, s...)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_ext_slice_byte(p *Properties, base structPointer) (n int) {
|
|
||||||
s := *structPointer_Bytes(base, p.field)
|
|
||||||
if s == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
n += len(s)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encode a reference to bool pointer.
|
|
||||||
func (o *Buffer) enc_ref_bool(p *Properties, base structPointer) error {
|
|
||||||
v := *structPointer_BoolVal(base, p.field)
|
|
||||||
x := 0
|
|
||||||
if v {
|
|
||||||
x = 1
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
p.valEnc(o, uint64(x))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_ref_bool(p *Properties, base structPointer) int {
|
|
||||||
return len(p.tagcode) + 1 // each bool takes exactly one byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encode a reference to int32 pointer.
|
|
||||||
func (o *Buffer) enc_ref_int32(p *Properties, base structPointer) error {
|
|
||||||
v := structPointer_Word32Val(base, p.field)
|
|
||||||
x := int32(word32Val_Get(v))
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
p.valEnc(o, uint64(x))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_ref_int32(p *Properties, base structPointer) (n int) {
|
|
||||||
v := structPointer_Word32Val(base, p.field)
|
|
||||||
x := int32(word32Val_Get(v))
|
|
||||||
n += len(p.tagcode)
|
|
||||||
n += p.valSize(uint64(x))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) enc_ref_uint32(p *Properties, base structPointer) error {
|
|
||||||
v := structPointer_Word32Val(base, p.field)
|
|
||||||
x := word32Val_Get(v)
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
p.valEnc(o, uint64(x))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_ref_uint32(p *Properties, base structPointer) (n int) {
|
|
||||||
v := structPointer_Word32Val(base, p.field)
|
|
||||||
x := word32Val_Get(v)
|
|
||||||
n += len(p.tagcode)
|
|
||||||
n += p.valSize(uint64(x))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encode a reference to an int64 pointer.
|
|
||||||
func (o *Buffer) enc_ref_int64(p *Properties, base structPointer) error {
|
|
||||||
v := structPointer_Word64Val(base, p.field)
|
|
||||||
x := word64Val_Get(v)
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
p.valEnc(o, x)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_ref_int64(p *Properties, base structPointer) (n int) {
|
|
||||||
v := structPointer_Word64Val(base, p.field)
|
|
||||||
x := word64Val_Get(v)
|
|
||||||
n += len(p.tagcode)
|
|
||||||
n += p.valSize(x)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encode a reference to a string pointer.
|
|
||||||
func (o *Buffer) enc_ref_string(p *Properties, base structPointer) error {
|
|
||||||
v := *structPointer_StringVal(base, p.field)
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeStringBytes(v)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_ref_string(p *Properties, base structPointer) (n int) {
|
|
||||||
v := *structPointer_StringVal(base, p.field)
|
|
||||||
n += len(p.tagcode)
|
|
||||||
n += sizeStringBytes(v)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encode a reference to a message struct.
|
|
||||||
func (o *Buffer) enc_ref_struct_message(p *Properties, base structPointer) error {
|
|
||||||
var state errorState
|
|
||||||
structp := structPointer_GetRefStructPointer(base, p.field)
|
|
||||||
if structPointer_IsNil(structp) {
|
|
||||||
return ErrNil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Can the object marshal itself?
|
|
||||||
if p.isMarshaler {
|
|
||||||
m := structPointer_Interface(structp, p.stype).(Marshaler)
|
|
||||||
data, err := m.Marshal()
|
|
||||||
if err != nil && !state.shouldContinue(err, nil) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeRawBytes(data)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
return o.enc_len_struct(p.sprop, structp, &state)
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO this is only copied, please fix this
|
|
||||||
func size_ref_struct_message(p *Properties, base structPointer) int {
|
|
||||||
structp := structPointer_GetRefStructPointer(base, p.field)
|
|
||||||
if structPointer_IsNil(structp) {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Can the object marshal itself?
|
|
||||||
if p.isMarshaler {
|
|
||||||
m := structPointer_Interface(structp, p.stype).(Marshaler)
|
|
||||||
data, _ := m.Marshal()
|
|
||||||
n0 := len(p.tagcode)
|
|
||||||
n1 := sizeRawBytes(data)
|
|
||||||
return n0 + n1
|
|
||||||
}
|
|
||||||
|
|
||||||
n0 := len(p.tagcode)
|
|
||||||
n1 := size_struct(p.sprop, structp)
|
|
||||||
n2 := sizeVarint(uint64(n1)) // size of encoded length
|
|
||||||
return n0 + n1 + n2
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encode a slice of references to message struct pointers ([]struct).
|
|
||||||
func (o *Buffer) enc_slice_ref_struct_message(p *Properties, base structPointer) error {
|
|
||||||
var state errorState
|
|
||||||
ss := structPointer_StructRefSlice(base, p.field, p.stype.Size())
|
|
||||||
l := ss.Len()
|
|
||||||
for i := 0; i < l; i++ {
|
|
||||||
structp := ss.Index(i)
|
|
||||||
if structPointer_IsNil(structp) {
|
|
||||||
return errRepeatedHasNil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Can the object marshal itself?
|
|
||||||
if p.isMarshaler {
|
|
||||||
m := structPointer_Interface(structp, p.stype).(Marshaler)
|
|
||||||
data, err := m.Marshal()
|
|
||||||
if err != nil && !state.shouldContinue(err, nil) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeRawBytes(data)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
err := o.enc_len_struct(p.sprop, structp, &state)
|
|
||||||
if err != nil && !state.shouldContinue(err, nil) {
|
|
||||||
if err == ErrNil {
|
|
||||||
return errRepeatedHasNil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return state.err
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO this is only copied, please fix this
|
|
||||||
func size_slice_ref_struct_message(p *Properties, base structPointer) (n int) {
|
|
||||||
ss := structPointer_StructRefSlice(base, p.field, p.stype.Size())
|
|
||||||
l := ss.Len()
|
|
||||||
n += l * len(p.tagcode)
|
|
||||||
for i := 0; i < l; i++ {
|
|
||||||
structp := ss.Index(i)
|
|
||||||
if structPointer_IsNil(structp) {
|
|
||||||
return // return the size up to this point
|
|
||||||
}
|
|
||||||
|
|
||||||
// Can the object marshal itself?
|
|
||||||
if p.isMarshaler {
|
|
||||||
m := structPointer_Interface(structp, p.stype).(Marshaler)
|
|
||||||
data, _ := m.Marshal()
|
|
||||||
n += len(p.tagcode)
|
|
||||||
n += sizeRawBytes(data)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
n0 := size_struct(p.sprop, structp)
|
|
||||||
n1 := sizeVarint(uint64(n0)) // size of encoded length
|
|
||||||
n += n0 + n1
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) enc_custom_bytes(p *Properties, base structPointer) error {
|
|
||||||
i := structPointer_InterfaceRef(base, p.field, p.ctype)
|
|
||||||
if i == nil {
|
|
||||||
return ErrNil
|
|
||||||
}
|
|
||||||
custom := i.(Marshaler)
|
|
||||||
data, err := custom.Marshal()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if data == nil {
|
|
||||||
return ErrNil
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeRawBytes(data)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_custom_bytes(p *Properties, base structPointer) (n int) {
|
|
||||||
n += len(p.tagcode)
|
|
||||||
i := structPointer_InterfaceRef(base, p.field, p.ctype)
|
|
||||||
if i == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
custom := i.(Marshaler)
|
|
||||||
data, _ := custom.Marshal()
|
|
||||||
n += sizeRawBytes(data)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) enc_custom_ref_bytes(p *Properties, base structPointer) error {
|
|
||||||
custom := structPointer_InterfaceAt(base, p.field, p.ctype).(Marshaler)
|
|
||||||
data, err := custom.Marshal()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if data == nil {
|
|
||||||
return ErrNil
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeRawBytes(data)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_custom_ref_bytes(p *Properties, base structPointer) (n int) {
|
|
||||||
n += len(p.tagcode)
|
|
||||||
i := structPointer_InterfaceAt(base, p.field, p.ctype)
|
|
||||||
if i == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
custom := i.(Marshaler)
|
|
||||||
data, _ := custom.Marshal()
|
|
||||||
n += sizeRawBytes(data)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) enc_custom_slice_bytes(p *Properties, base structPointer) error {
|
|
||||||
inter := structPointer_InterfaceRef(base, p.field, p.ctype)
|
|
||||||
if inter == nil {
|
|
||||||
return ErrNil
|
|
||||||
}
|
|
||||||
slice := reflect.ValueOf(inter)
|
|
||||||
l := slice.Len()
|
|
||||||
for i := 0; i < l; i++ {
|
|
||||||
v := slice.Index(i)
|
|
||||||
custom := v.Interface().(Marshaler)
|
|
||||||
data, err := custom.Marshal()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeRawBytes(data)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_custom_slice_bytes(p *Properties, base structPointer) (n int) {
|
|
||||||
inter := structPointer_InterfaceRef(base, p.field, p.ctype)
|
|
||||||
if inter == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
slice := reflect.ValueOf(inter)
|
|
||||||
l := slice.Len()
|
|
||||||
n += l * len(p.tagcode)
|
|
||||||
for i := 0; i < l; i++ {
|
|
||||||
v := slice.Index(i)
|
|
||||||
custom := v.Interface().(Marshaler)
|
|
||||||
data, _ := custom.Marshal()
|
|
||||||
n += sizeRawBytes(data)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
84
vendor/github.com/gogo/protobuf/proto/encode_test.go
generated
vendored
84
vendor/github.com/gogo/protobuf/proto/encode_test.go
generated
vendored
@ -1,84 +0,0 @@
|
|||||||
// 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.
|
|
||||||
|
|
||||||
// +build go1.7
|
|
||||||
|
|
||||||
package proto_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/gogo/protobuf/proto"
|
|
||||||
tpb "github.com/gogo/protobuf/proto/proto3_proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
blackhole []byte
|
|
||||||
)
|
|
||||||
|
|
||||||
// Disabled this Benchmark because it is using features (b.Run) from go1.7 and gogoprotobuf still have compatibility with go1.5
|
|
||||||
// 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 := types.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/gogo/protobuf/proto/equal.go
generated
vendored
300
vendor/github.com/gogo/protobuf/proto/equal.go
generated
vendored
@ -1,300 +0,0 @@
|
|||||||
// 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/gogo/protobuf/proto/equal_test.go
generated
vendored
224
vendor/github.com/gogo/protobuf/proto/equal_test.go
generated
vendored
@ -1,224 +0,0 @@
|
|||||||
// 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/gogo/protobuf/proto"
|
|
||||||
proto3pb "github.com/gogo/protobuf/proto/proto3_proto"
|
|
||||||
pb "github.com/gogo/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{Number: 41}},
|
|
||||||
&pb.Communique{Union: &pb.Communique_Number{Number: 41}},
|
|
||||||
true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"oneof one nil",
|
|
||||||
&pb.Communique{Union: &pb.Communique_Number{Number: 41}},
|
|
||||||
&pb.Communique{},
|
|
||||||
false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"oneof different",
|
|
||||||
&pb.Communique{Union: &pb.Communique_Number{Number: 41}},
|
|
||||||
&pb.Communique{Union: &pb.Communique_Name{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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
693
vendor/github.com/gogo/protobuf/proto/extensions.go
generated
vendored
693
vendor/github.com/gogo/protobuf/proto/extensions.go
generated
vendored
@ -1,693 +0,0 @@
|
|||||||
// 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
|
|
||||||
}
|
|
||||||
|
|
||||||
type extensionsBytes interface {
|
|
||||||
Message
|
|
||||||
ExtensionRangeArray() []ExtensionRange
|
|
||||||
GetExtensions() *[]byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
||||||
|
|
||||||
type extensionRange interface {
|
|
||||||
Message
|
|
||||||
ExtensionRangeArray() []ExtensionRange
|
|
||||||
}
|
|
||||||
|
|
||||||
var extendableProtoType = reflect.TypeOf((*extendableProto)(nil)).Elem()
|
|
||||||
var extendableProtoV1Type = reflect.TypeOf((*extendableProtoV1)(nil)).Elem()
|
|
||||||
var extendableBytesType = reflect.TypeOf((*extensionsBytes)(nil)).Elem()
|
|
||||||
var extensionRangeType = reflect.TypeOf((*extensionRange)(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
|
|
||||||
Filename string // name of the file in which the extension is defined
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
|
||||||
if ebase, ok := base.(extensionsBytes); ok {
|
|
||||||
clearExtension(base, id)
|
|
||||||
ext := ebase.GetExtensions()
|
|
||||||
*ext = append(*ext, b...)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
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 extensionRange, 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 {
|
|
||||||
if epb, doki := pb.(extensionsBytes); doki {
|
|
||||||
ext := epb.GetExtensions()
|
|
||||||
buf := *ext
|
|
||||||
o := 0
|
|
||||||
for o < len(buf) {
|
|
||||||
tag, n := DecodeVarint(buf[o:])
|
|
||||||
fieldNum := int32(tag >> 3)
|
|
||||||
if int32(fieldNum) == extension.Field {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
wireType := int(tag & 0x7)
|
|
||||||
o += n
|
|
||||||
l, err := size(buf[o:], wireType)
|
|
||||||
if err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
o += l
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
// 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
|
|
||||||
}
|
|
||||||
|
|
||||||
func deleteExtension(pb extensionsBytes, theFieldNum int32, offset int) int {
|
|
||||||
ext := pb.GetExtensions()
|
|
||||||
for offset < len(*ext) {
|
|
||||||
tag, n1 := DecodeVarint((*ext)[offset:])
|
|
||||||
fieldNum := int32(tag >> 3)
|
|
||||||
wireType := int(tag & 0x7)
|
|
||||||
n2, err := size((*ext)[offset+n1:], wireType)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
newOffset := offset + n1 + n2
|
|
||||||
if fieldNum == theFieldNum {
|
|
||||||
*ext = append((*ext)[:offset], (*ext)[newOffset:]...)
|
|
||||||
return offset
|
|
||||||
}
|
|
||||||
offset = newOffset
|
|
||||||
}
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
|
|
||||||
// ClearExtension removes the given extension from pb.
|
|
||||||
func ClearExtension(pb Message, extension *ExtensionDesc) {
|
|
||||||
clearExtension(pb, extension.Field)
|
|
||||||
}
|
|
||||||
|
|
||||||
func clearExtension(pb Message, fieldNum int32) {
|
|
||||||
if epb, doki := pb.(extensionsBytes); doki {
|
|
||||||
offset := 0
|
|
||||||
for offset != -1 {
|
|
||||||
offset = deleteExtension(epb, fieldNum, offset)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
epb, ok := extendable(pb)
|
|
||||||
if !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// TODO: Check types, field numbers, etc.?
|
|
||||||
extmap := epb.extensionsWrite()
|
|
||||||
delete(extmap, fieldNum)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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) {
|
|
||||||
if epb, doki := pb.(extensionsBytes); doki {
|
|
||||||
ext := epb.GetExtensions()
|
|
||||||
o := 0
|
|
||||||
for o < len(*ext) {
|
|
||||||
tag, n := DecodeVarint((*ext)[o:])
|
|
||||||
fieldNum := int32(tag >> 3)
|
|
||||||
wireType := int(tag & 0x7)
|
|
||||||
l, err := size((*ext)[o+n:], wireType)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if int32(fieldNum) == extension.Field {
|
|
||||||
v, err := decodeExtension((*ext)[o:o+n+l], extension)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return v, nil
|
|
||||||
}
|
|
||||||
o += n + l
|
|
||||||
}
|
|
||||||
return defaultExtensionValue(extension)
|
|
||||||
}
|
|
||||||
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) {
|
|
||||||
extensions = make([]interface{}, len(es))
|
|
||||||
for i, e := range es {
|
|
||||||
extensions[i], err = GetExtension(pb, 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 {
|
|
||||||
if epb, doki := pb.(extensionsBytes); doki {
|
|
||||||
ClearExtension(pb, extension)
|
|
||||||
ext := epb.GetExtensions()
|
|
||||||
et := reflect.TypeOf(extension.ExtensionType)
|
|
||||||
props := extensionProperties(extension)
|
|
||||||
p := NewBuffer(nil)
|
|
||||||
x := reflect.New(et)
|
|
||||||
x.Elem().Set(reflect.ValueOf(value))
|
|
||||||
if err := props.enc(p, props, toStructPointer(x)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
*ext = append(*ext, p.buf...)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
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) {
|
|
||||||
if epb, doki := pb.(extensionsBytes); doki {
|
|
||||||
ext := epb.GetExtensions()
|
|
||||||
*ext = []byte{}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
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()]
|
|
||||||
}
|
|
294
vendor/github.com/gogo/protobuf/proto/extensions_gogo.go
generated
vendored
294
vendor/github.com/gogo/protobuf/proto/extensions_gogo.go
generated
vendored
@ -1,294 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetBoolExtension(pb Message, extension *ExtensionDesc, ifnotset bool) bool {
|
|
||||||
if reflect.ValueOf(pb).IsNil() {
|
|
||||||
return ifnotset
|
|
||||||
}
|
|
||||||
value, err := GetExtension(pb, extension)
|
|
||||||
if err != nil {
|
|
||||||
return ifnotset
|
|
||||||
}
|
|
||||||
if value == nil {
|
|
||||||
return ifnotset
|
|
||||||
}
|
|
||||||
if value.(*bool) == nil {
|
|
||||||
return ifnotset
|
|
||||||
}
|
|
||||||
return *(value.(*bool))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *Extension) Equal(that *Extension) bool {
|
|
||||||
return bytes.Equal(this.enc, that.enc)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *Extension) Compare(that *Extension) int {
|
|
||||||
return bytes.Compare(this.enc, that.enc)
|
|
||||||
}
|
|
||||||
|
|
||||||
func SizeOfInternalExtension(m extendableProto) (n int) {
|
|
||||||
return SizeOfExtensionMap(m.extensionsWrite())
|
|
||||||
}
|
|
||||||
|
|
||||||
func SizeOfExtensionMap(m map[int32]Extension) (n int) {
|
|
||||||
return extensionsMapSize(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
type sortableMapElem struct {
|
|
||||||
field int32
|
|
||||||
ext Extension
|
|
||||||
}
|
|
||||||
|
|
||||||
func newSortableExtensionsFromMap(m map[int32]Extension) sortableExtensions {
|
|
||||||
s := make(sortableExtensions, 0, len(m))
|
|
||||||
for k, v := range m {
|
|
||||||
s = append(s, &sortableMapElem{field: k, ext: v})
|
|
||||||
}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
type sortableExtensions []*sortableMapElem
|
|
||||||
|
|
||||||
func (this sortableExtensions) Len() int { return len(this) }
|
|
||||||
|
|
||||||
func (this sortableExtensions) Swap(i, j int) { this[i], this[j] = this[j], this[i] }
|
|
||||||
|
|
||||||
func (this sortableExtensions) Less(i, j int) bool { return this[i].field < this[j].field }
|
|
||||||
|
|
||||||
func (this sortableExtensions) String() string {
|
|
||||||
sort.Sort(this)
|
|
||||||
ss := make([]string, len(this))
|
|
||||||
for i := range this {
|
|
||||||
ss[i] = fmt.Sprintf("%d: %v", this[i].field, this[i].ext)
|
|
||||||
}
|
|
||||||
return "map[" + strings.Join(ss, ",") + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
func StringFromInternalExtension(m extendableProto) string {
|
|
||||||
return StringFromExtensionsMap(m.extensionsWrite())
|
|
||||||
}
|
|
||||||
|
|
||||||
func StringFromExtensionsMap(m map[int32]Extension) string {
|
|
||||||
return newSortableExtensionsFromMap(m).String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func StringFromExtensionsBytes(ext []byte) string {
|
|
||||||
m, err := BytesToExtensionsMap(ext)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return StringFromExtensionsMap(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func EncodeInternalExtension(m extendableProto, data []byte) (n int, err error) {
|
|
||||||
return EncodeExtensionMap(m.extensionsWrite(), data)
|
|
||||||
}
|
|
||||||
|
|
||||||
func EncodeExtensionMap(m map[int32]Extension, data []byte) (n int, err error) {
|
|
||||||
if err := encodeExtensionsMap(m); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
keys := make([]int, 0, len(m))
|
|
||||||
for k := range m {
|
|
||||||
keys = append(keys, int(k))
|
|
||||||
}
|
|
||||||
sort.Ints(keys)
|
|
||||||
for _, k := range keys {
|
|
||||||
n += copy(data[n:], m[int32(k)].enc)
|
|
||||||
}
|
|
||||||
return n, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetRawExtension(m map[int32]Extension, id int32) ([]byte, error) {
|
|
||||||
if m[id].value == nil || m[id].desc == nil {
|
|
||||||
return m[id].enc, nil
|
|
||||||
}
|
|
||||||
if err := encodeExtensionsMap(m); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return m[id].enc, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size(buf []byte, wire int) (int, error) {
|
|
||||||
switch wire {
|
|
||||||
case WireVarint:
|
|
||||||
_, n := DecodeVarint(buf)
|
|
||||||
return n, nil
|
|
||||||
case WireFixed64:
|
|
||||||
return 8, nil
|
|
||||||
case WireBytes:
|
|
||||||
v, n := DecodeVarint(buf)
|
|
||||||
return int(v) + n, nil
|
|
||||||
case WireFixed32:
|
|
||||||
return 4, nil
|
|
||||||
case WireStartGroup:
|
|
||||||
offset := 0
|
|
||||||
for {
|
|
||||||
u, n := DecodeVarint(buf[offset:])
|
|
||||||
fwire := int(u & 0x7)
|
|
||||||
offset += n
|
|
||||||
if fwire == WireEndGroup {
|
|
||||||
return offset, nil
|
|
||||||
}
|
|
||||||
s, err := size(buf[offset:], wire)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
offset += s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0, fmt.Errorf("proto: can't get size for unknown wire type %d", wire)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BytesToExtensionsMap(buf []byte) (map[int32]Extension, error) {
|
|
||||||
m := make(map[int32]Extension)
|
|
||||||
i := 0
|
|
||||||
for i < len(buf) {
|
|
||||||
tag, n := DecodeVarint(buf[i:])
|
|
||||||
if n <= 0 {
|
|
||||||
return nil, fmt.Errorf("unable to decode varint")
|
|
||||||
}
|
|
||||||
fieldNum := int32(tag >> 3)
|
|
||||||
wireType := int(tag & 0x7)
|
|
||||||
l, err := size(buf[i+n:], wireType)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
end := i + int(l) + n
|
|
||||||
m[int32(fieldNum)] = Extension{enc: buf[i:end]}
|
|
||||||
i = end
|
|
||||||
}
|
|
||||||
return m, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewExtension(e []byte) Extension {
|
|
||||||
ee := Extension{enc: make([]byte, len(e))}
|
|
||||||
copy(ee.enc, e)
|
|
||||||
return ee
|
|
||||||
}
|
|
||||||
|
|
||||||
func AppendExtension(e Message, tag int32, buf []byte) {
|
|
||||||
if ee, eok := e.(extensionsBytes); eok {
|
|
||||||
ext := ee.GetExtensions()
|
|
||||||
*ext = append(*ext, buf...)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if ee, eok := e.(extendableProto); eok {
|
|
||||||
m := ee.extensionsWrite()
|
|
||||||
ext := m[int32(tag)] // may be missing
|
|
||||||
ext.enc = append(ext.enc, buf...)
|
|
||||||
m[int32(tag)] = ext
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func encodeExtension(e *Extension) error {
|
|
||||||
if e.value == nil || e.desc == nil {
|
|
||||||
// Extension is only in its encoded form.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
// 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
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this Extension) GoString() string {
|
|
||||||
if this.enc == nil {
|
|
||||||
if err := encodeExtension(&this); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("proto.NewExtension(%#v)", this.enc)
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetUnsafeExtension(pb Message, fieldNum int32, value interface{}) error {
|
|
||||||
typ := reflect.TypeOf(pb).Elem()
|
|
||||||
ext, ok := extensionMaps[typ]
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String())
|
|
||||||
}
|
|
||||||
desc, ok := ext[fieldNum]
|
|
||||||
if !ok {
|
|
||||||
return errors.New("proto: bad extension number; not in declared ranges")
|
|
||||||
}
|
|
||||||
return SetExtension(pb, desc, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetUnsafeExtension(pb Message, fieldNum int32) (interface{}, error) {
|
|
||||||
typ := reflect.TypeOf(pb).Elem()
|
|
||||||
ext, ok := extensionMaps[typ]
|
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String())
|
|
||||||
}
|
|
||||||
desc, ok := ext[fieldNum]
|
|
||||||
if !ok {
|
|
||||||
return nil, fmt.Errorf("unregistered field number %d", fieldNum)
|
|
||||||
}
|
|
||||||
return GetExtension(pb, desc)
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewUnsafeXXX_InternalExtensions(m map[int32]Extension) XXX_InternalExtensions {
|
|
||||||
x := &XXX_InternalExtensions{
|
|
||||||
p: new(struct {
|
|
||||||
mu sync.Mutex
|
|
||||||
extensionMap map[int32]Extension
|
|
||||||
}),
|
|
||||||
}
|
|
||||||
x.p.extensionMap = m
|
|
||||||
return *x
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetUnsafeExtensionsMap(extendable Message) map[int32]Extension {
|
|
||||||
pb := extendable.(extendableProto)
|
|
||||||
return pb.extensionsWrite()
|
|
||||||
}
|
|
538
vendor/github.com/gogo/protobuf/proto/extensions_test.go
generated
vendored
538
vendor/github.com/gogo/protobuf/proto/extensions_test.go
generated
vendored
@ -1,538 +0,0 @@
|
|||||||
// 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/gogo/protobuf/proto"
|
|
||||||
pb "github.com/gogo/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, {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: %v want: %v\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))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMarshalRace(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{Count: proto.Int32(4)}
|
|
||||||
if err := proto.SetExtension(m, desc, proto.Bool(true)); err != nil {
|
|
||||||
t.Errorf("proto.SetExtension(m, desc, true): got error %q, want nil", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
errChan := make(chan error, 3)
|
|
||||||
for n := 3; n > 0; n-- {
|
|
||||||
go func() {
|
|
||||||
_, err := proto.Marshal(m)
|
|
||||||
errChan <- err
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
for i := 0; i < 3; i++ {
|
|
||||||
err := <-errChan
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
897
vendor/github.com/gogo/protobuf/proto/lib.go
generated
vendored
897
vendor/github.com/gogo/protobuf/proto/lib.go
generated
vendored
@ -1,897 +0,0 @@
|
|||||||
// 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.
|
|
||||||
- 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/gogo/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/gogo/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
|
|
||||||
sindex := 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 = sindex
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 GoGoProtoPackageIsVersion2 = true
|
|
||||||
|
|
||||||
// ProtoPackageIsVersion1 is referenced from generated protocol buffer files
|
|
||||||
// to assert that that code is compatible with this version of the proto package.
|
|
||||||
const GoGoProtoPackageIsVersion1 = true
|
|
42
vendor/github.com/gogo/protobuf/proto/lib_gogo.go
generated
vendored
42
vendor/github.com/gogo/protobuf/proto/lib_gogo.go
generated
vendored
@ -1,42 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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 (
|
|
||||||
"encoding/json"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
func MarshalJSONEnum(m map[int32]string, value int32) ([]byte, error) {
|
|
||||||
s, ok := m[value]
|
|
||||||
if !ok {
|
|
||||||
s = strconv.Itoa(int(value))
|
|
||||||
}
|
|
||||||
return json.Marshal(s)
|
|
||||||
}
|
|
46
vendor/github.com/gogo/protobuf/proto/map_test.go
generated
vendored
46
vendor/github.com/gogo/protobuf/proto/map_test.go
generated
vendored
@ -1,46 +0,0 @@
|
|||||||
package proto_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/gogo/protobuf/proto"
|
|
||||||
ppb "github.com/gogo/protobuf/proto/proto3_proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
func marshalled() []byte {
|
|
||||||
m := &ppb.IntMaps{}
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
m.Maps = append(m.Maps, &ppb.IntMap{
|
|
||||||
Rtt: map[int32]int32{1: 2},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
b, err := proto.Marshal(m)
|
|
||||||
if err != nil {
|
|
||||||
panic(fmt.Sprintf("Can't marshal %+v: %v", m, err))
|
|
||||||
}
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkConcurrentMapUnmarshal(b *testing.B) {
|
|
||||||
in := marshalled()
|
|
||||||
b.RunParallel(func(pb *testing.PB) {
|
|
||||||
for pb.Next() {
|
|
||||||
var out ppb.IntMaps
|
|
||||||
if err := proto.Unmarshal(in, &out); err != nil {
|
|
||||||
b.Errorf("Can't unmarshal ppb.IntMaps: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkSequentialMapUnmarshal(b *testing.B) {
|
|
||||||
in := marshalled()
|
|
||||||
b.ResetTimer()
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
var out ppb.IntMaps
|
|
||||||
if err := proto.Unmarshal(in, &out); err != nil {
|
|
||||||
b.Errorf("Can't unmarshal ppb.IntMaps: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
311
vendor/github.com/gogo/protobuf/proto/message_set.go
generated
vendored
311
vendor/github.com/gogo/protobuf/proto/message_set.go
generated
vendored
@ -1,311 +0,0 @@
|
|||||||
// 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/gogo/protobuf/proto/message_set_test.go
generated
vendored
66
vendor/github.com/gogo/protobuf/proto/message_set_test.go
generated
vendored
@ -1,66 +0,0 @@
|
|||||||
// 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/gogo/protobuf/proto/pointer_reflect.go
generated
vendored
484
vendor/github.com/gogo/protobuf/proto/pointer_reflect.go
generated
vendored
@ -1,484 +0,0 @@
|
|||||||
// 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)}
|
|
||||||
}
|
|
85
vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go
generated
vendored
85
vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go
generated
vendored
@ -1,85 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2016, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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
|
|
||||||
|
|
||||||
package proto
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
func structPointer_FieldPointer(p structPointer, f field) structPointer {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func appendStructPointer(base structPointer, f field, typ reflect.Type) structPointer {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_InterfaceAt(p structPointer, f field, t reflect.Type) interface{} {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_InterfaceRef(p structPointer, f field, t reflect.Type) interface{} {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_GetRefStructPointer(p structPointer, f field) structPointer {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_Add(p structPointer, size field) structPointer {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_Len(p structPointer, f field) int {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_GetSliceHeader(p structPointer, f field) *reflect.SliceHeader {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_Copy(oldptr structPointer, newptr structPointer, size int) {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_StructRefSlice(p structPointer, f field, size uintptr) *structRefSlice {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
type structRefSlice struct{}
|
|
||||||
|
|
||||||
func (v *structRefSlice) Len() int {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *structRefSlice) Index(i int) structPointer {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
270
vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go
generated
vendored
270
vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go
generated
vendored
@ -1,270 +0,0 @@
|
|||||||
// 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)))
|
|
||||||
}
|
|
128
vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go
generated
vendored
128
vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go
generated
vendored
@ -1,128 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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"
|
|
||||||
)
|
|
||||||
|
|
||||||
func structPointer_InterfaceAt(p structPointer, f field, t reflect.Type) interface{} {
|
|
||||||
point := unsafe.Pointer(uintptr(p) + uintptr(f))
|
|
||||||
r := reflect.NewAt(t, point)
|
|
||||||
return r.Interface()
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_InterfaceRef(p structPointer, f field, t reflect.Type) interface{} {
|
|
||||||
point := unsafe.Pointer(uintptr(p) + uintptr(f))
|
|
||||||
r := reflect.NewAt(t, point)
|
|
||||||
if r.Elem().IsNil() {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return r.Elem().Interface()
|
|
||||||
}
|
|
||||||
|
|
||||||
func copyUintPtr(oldptr, newptr uintptr, size int) {
|
|
||||||
oldbytes := make([]byte, 0)
|
|
||||||
oldslice := (*reflect.SliceHeader)(unsafe.Pointer(&oldbytes))
|
|
||||||
oldslice.Data = oldptr
|
|
||||||
oldslice.Len = size
|
|
||||||
oldslice.Cap = size
|
|
||||||
newbytes := make([]byte, 0)
|
|
||||||
newslice := (*reflect.SliceHeader)(unsafe.Pointer(&newbytes))
|
|
||||||
newslice.Data = newptr
|
|
||||||
newslice.Len = size
|
|
||||||
newslice.Cap = size
|
|
||||||
copy(newbytes, oldbytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_Copy(oldptr structPointer, newptr structPointer, size int) {
|
|
||||||
copyUintPtr(uintptr(oldptr), uintptr(newptr), size)
|
|
||||||
}
|
|
||||||
|
|
||||||
func appendStructPointer(base structPointer, f field, typ reflect.Type) structPointer {
|
|
||||||
size := typ.Elem().Size()
|
|
||||||
|
|
||||||
oldHeader := structPointer_GetSliceHeader(base, f)
|
|
||||||
oldSlice := reflect.NewAt(typ, unsafe.Pointer(oldHeader)).Elem()
|
|
||||||
newLen := oldHeader.Len + 1
|
|
||||||
newSlice := reflect.MakeSlice(typ, newLen, newLen)
|
|
||||||
reflect.Copy(newSlice, oldSlice)
|
|
||||||
bas := toStructPointer(newSlice)
|
|
||||||
oldHeader.Data = uintptr(bas)
|
|
||||||
oldHeader.Len = newLen
|
|
||||||
oldHeader.Cap = newLen
|
|
||||||
|
|
||||||
return structPointer(unsafe.Pointer(uintptr(unsafe.Pointer(bas)) + uintptr(uintptr(newLen-1)*size)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_FieldPointer(p structPointer, f field) structPointer {
|
|
||||||
return structPointer(unsafe.Pointer(uintptr(p) + uintptr(f)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_GetRefStructPointer(p structPointer, f field) structPointer {
|
|
||||||
return structPointer((*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))))
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_GetSliceHeader(p structPointer, f field) *reflect.SliceHeader {
|
|
||||||
return (*reflect.SliceHeader)(unsafe.Pointer(uintptr(p) + uintptr(f)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_Add(p structPointer, size field) structPointer {
|
|
||||||
return structPointer(unsafe.Pointer(uintptr(p) + uintptr(size)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_Len(p structPointer, f field) int {
|
|
||||||
return len(*(*[]interface{})(unsafe.Pointer(structPointer_GetRefStructPointer(p, f))))
|
|
||||||
}
|
|
||||||
|
|
||||||
func structPointer_StructRefSlice(p structPointer, f field, size uintptr) *structRefSlice {
|
|
||||||
return &structRefSlice{p: p, f: f, size: size}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A structRefSlice represents a slice of structs (themselves submessages or groups).
|
|
||||||
type structRefSlice struct {
|
|
||||||
p structPointer
|
|
||||||
f field
|
|
||||||
size uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *structRefSlice) Len() int {
|
|
||||||
return structPointer_Len(v.p, v.f)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *structRefSlice) Index(i int) structPointer {
|
|
||||||
ss := structPointer_GetStructPointer(v.p, v.f)
|
|
||||||
ss1 := structPointer_GetRefStructPointer(ss, 0)
|
|
||||||
return structPointer_Add(ss1, field(uintptr(i)*v.size))
|
|
||||||
}
|
|
971
vendor/github.com/gogo/protobuf/proto/properties.go
generated
vendored
971
vendor/github.com/gogo/protobuf/proto/properties.go
generated
vendored
@ -1,971 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/protobuf
|
|
||||||
//
|
|
||||||
// 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
|
|
||||||
CustomType string
|
|
||||||
CastType string
|
|
||||||
StdTime bool
|
|
||||||
StdDuration bool
|
|
||||||
|
|
||||||
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
|
|
||||||
sstype reflect.Type // set for slices of structs types only
|
|
||||||
ctype reflect.Type // set for custom 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
|
|
||||||
}
|
|
||||||
case strings.HasPrefix(f, "embedded="):
|
|
||||||
p.OrigName = strings.Split(f, "=")[1]
|
|
||||||
case strings.HasPrefix(f, "customtype="):
|
|
||||||
p.CustomType = strings.Split(f, "=")[1]
|
|
||||||
case strings.HasPrefix(f, "casttype="):
|
|
||||||
p.CastType = strings.Split(f, "=")[1]
|
|
||||||
case f == "stdtime":
|
|
||||||
p.StdTime = true
|
|
||||||
case f == "stdduration":
|
|
||||||
p.StdDuration = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
isMap := typ.Kind() == reflect.Map
|
|
||||||
if len(p.CustomType) > 0 && !isMap {
|
|
||||||
p.setCustomEncAndDec(typ)
|
|
||||||
p.setTag(lockGetProp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if p.StdTime && !isMap {
|
|
||||||
p.setTimeEncAndDec(typ)
|
|
||||||
p.setTag(lockGetProp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if p.StdDuration && !isMap {
|
|
||||||
p.setDurationEncAndDec(typ)
|
|
||||||
p.setTag(lockGetProp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
switch t1 := typ; t1.Kind() {
|
|
||||||
default:
|
|
||||||
fmt.Fprintf(os.Stderr, "proto: no coders for %v\n", t1)
|
|
||||||
|
|
||||||
// proto3 scalar types
|
|
||||||
|
|
||||||
case reflect.Bool:
|
|
||||||
if p.proto3 {
|
|
||||||
p.enc = (*Buffer).enc_proto3_bool
|
|
||||||
p.dec = (*Buffer).dec_proto3_bool
|
|
||||||
p.size = size_proto3_bool
|
|
||||||
} else {
|
|
||||||
p.enc = (*Buffer).enc_ref_bool
|
|
||||||
p.dec = (*Buffer).dec_proto3_bool
|
|
||||||
p.size = size_ref_bool
|
|
||||||
}
|
|
||||||
case reflect.Int32:
|
|
||||||
if p.proto3 {
|
|
||||||
p.enc = (*Buffer).enc_proto3_int32
|
|
||||||
p.dec = (*Buffer).dec_proto3_int32
|
|
||||||
p.size = size_proto3_int32
|
|
||||||
} else {
|
|
||||||
p.enc = (*Buffer).enc_ref_int32
|
|
||||||
p.dec = (*Buffer).dec_proto3_int32
|
|
||||||
p.size = size_ref_int32
|
|
||||||
}
|
|
||||||
case reflect.Uint32:
|
|
||||||
if p.proto3 {
|
|
||||||
p.enc = (*Buffer).enc_proto3_uint32
|
|
||||||
p.dec = (*Buffer).dec_proto3_int32 // can reuse
|
|
||||||
p.size = size_proto3_uint32
|
|
||||||
} else {
|
|
||||||
p.enc = (*Buffer).enc_ref_uint32
|
|
||||||
p.dec = (*Buffer).dec_proto3_int32 // can reuse
|
|
||||||
p.size = size_ref_uint32
|
|
||||||
}
|
|
||||||
case reflect.Int64, reflect.Uint64:
|
|
||||||
if p.proto3 {
|
|
||||||
p.enc = (*Buffer).enc_proto3_int64
|
|
||||||
p.dec = (*Buffer).dec_proto3_int64
|
|
||||||
p.size = size_proto3_int64
|
|
||||||
} else {
|
|
||||||
p.enc = (*Buffer).enc_ref_int64
|
|
||||||
p.dec = (*Buffer).dec_proto3_int64
|
|
||||||
p.size = size_ref_int64
|
|
||||||
}
|
|
||||||
case reflect.Float32:
|
|
||||||
if p.proto3 {
|
|
||||||
p.enc = (*Buffer).enc_proto3_uint32 // can just treat them as bits
|
|
||||||
p.dec = (*Buffer).dec_proto3_int32
|
|
||||||
p.size = size_proto3_uint32
|
|
||||||
} else {
|
|
||||||
p.enc = (*Buffer).enc_ref_uint32 // can just treat them as bits
|
|
||||||
p.dec = (*Buffer).dec_proto3_int32
|
|
||||||
p.size = size_ref_uint32
|
|
||||||
}
|
|
||||||
case reflect.Float64:
|
|
||||||
if p.proto3 {
|
|
||||||
p.enc = (*Buffer).enc_proto3_int64 // can just treat them as bits
|
|
||||||
p.dec = (*Buffer).dec_proto3_int64
|
|
||||||
p.size = size_proto3_int64
|
|
||||||
} else {
|
|
||||||
p.enc = (*Buffer).enc_ref_int64 // can just treat them as bits
|
|
||||||
p.dec = (*Buffer).dec_proto3_int64
|
|
||||||
p.size = size_ref_int64
|
|
||||||
}
|
|
||||||
case reflect.String:
|
|
||||||
if p.proto3 {
|
|
||||||
p.enc = (*Buffer).enc_proto3_string
|
|
||||||
p.dec = (*Buffer).dec_proto3_string
|
|
||||||
p.size = size_proto3_string
|
|
||||||
} else {
|
|
||||||
p.enc = (*Buffer).enc_ref_string
|
|
||||||
p.dec = (*Buffer).dec_proto3_string
|
|
||||||
p.size = size_ref_string
|
|
||||||
}
|
|
||||||
case reflect.Struct:
|
|
||||||
p.stype = typ
|
|
||||||
p.isMarshaler = isMarshaler(typ)
|
|
||||||
p.isUnmarshaler = isUnmarshaler(typ)
|
|
||||||
if p.Wire == "bytes" {
|
|
||||||
p.enc = (*Buffer).enc_ref_struct_message
|
|
||||||
p.dec = (*Buffer).dec_ref_struct_message
|
|
||||||
p.size = size_ref_struct_message
|
|
||||||
} else {
|
|
||||||
fmt.Fprintf(os.Stderr, "proto: no coders for struct %T\n", typ)
|
|
||||||
}
|
|
||||||
|
|
||||||
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.Struct:
|
|
||||||
p.setSliceOfNonPointerStructs(t1)
|
|
||||||
}
|
|
||||||
|
|
||||||
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.CustomType = p.CustomType
|
|
||||||
p.mvalprop.StdDuration = p.StdDuration
|
|
||||||
p.mvalprop.StdTime = p.StdTime
|
|
||||||
p.mvalprop.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp)
|
|
||||||
}
|
|
||||||
p.setTag(lockGetProp)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Properties) setTag(lockGetProp bool) {
|
|
||||||
// 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 {
|
|
||||||
return t.Implements(marshalerType)
|
|
||||||
}
|
|
||||||
|
|
||||||
// isUnmarshaler reports whether type t implements Unmarshaler.
|
|
||||||
func isUnmarshaler(t reflect.Type) bool {
|
|
||||||
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) ||
|
|
||||||
reflect.PtrTo(t).Implements(extendableBytesType)
|
|
||||||
prop.unrecField = invalidField
|
|
||||||
prop.Prop = make([]*Properties, t.NumField())
|
|
||||||
prop.order = make([]int, t.NumField())
|
|
||||||
|
|
||||||
isOneofMessage := false
|
|
||||||
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
|
|
||||||
if len(f.Tag.Get("protobuf")) > 0 {
|
|
||||||
p.enc = (*Buffer).enc_ext_slice_byte
|
|
||||||
p.dec = nil // not needed
|
|
||||||
p.size = size_ext_slice_byte
|
|
||||||
} else {
|
|
||||||
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 != "" {
|
|
||||||
isOneofMessage = true
|
|
||||||
// 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); isOneofMessage && 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)
|
|
||||||
var enumStringMaps = make(map[string]map[int32]string)
|
|
||||||
|
|
||||||
// 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
|
|
||||||
if _, ok := enumStringMaps[typeName]; ok {
|
|
||||||
panic("proto: duplicate enum registered: " + typeName)
|
|
||||||
}
|
|
||||||
enumStringMaps[typeName] = unusedNameMap
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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] }
|
|
111
vendor/github.com/gogo/protobuf/proto/properties_gogo.go
generated
vendored
111
vendor/github.com/gogo/protobuf/proto/properties_gogo.go
generated
vendored
@ -1,111 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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 (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (p *Properties) setCustomEncAndDec(typ reflect.Type) {
|
|
||||||
p.ctype = typ
|
|
||||||
if p.Repeated {
|
|
||||||
p.enc = (*Buffer).enc_custom_slice_bytes
|
|
||||||
p.dec = (*Buffer).dec_custom_slice_bytes
|
|
||||||
p.size = size_custom_slice_bytes
|
|
||||||
} else if typ.Kind() == reflect.Ptr {
|
|
||||||
p.enc = (*Buffer).enc_custom_bytes
|
|
||||||
p.dec = (*Buffer).dec_custom_bytes
|
|
||||||
p.size = size_custom_bytes
|
|
||||||
} else {
|
|
||||||
p.enc = (*Buffer).enc_custom_ref_bytes
|
|
||||||
p.dec = (*Buffer).dec_custom_ref_bytes
|
|
||||||
p.size = size_custom_ref_bytes
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Properties) setDurationEncAndDec(typ reflect.Type) {
|
|
||||||
if p.Repeated {
|
|
||||||
if typ.Elem().Kind() == reflect.Ptr {
|
|
||||||
p.enc = (*Buffer).enc_slice_duration
|
|
||||||
p.dec = (*Buffer).dec_slice_duration
|
|
||||||
p.size = size_slice_duration
|
|
||||||
} else {
|
|
||||||
p.enc = (*Buffer).enc_slice_ref_duration
|
|
||||||
p.dec = (*Buffer).dec_slice_ref_duration
|
|
||||||
p.size = size_slice_ref_duration
|
|
||||||
}
|
|
||||||
} else if typ.Kind() == reflect.Ptr {
|
|
||||||
p.enc = (*Buffer).enc_duration
|
|
||||||
p.dec = (*Buffer).dec_duration
|
|
||||||
p.size = size_duration
|
|
||||||
} else {
|
|
||||||
p.enc = (*Buffer).enc_ref_duration
|
|
||||||
p.dec = (*Buffer).dec_ref_duration
|
|
||||||
p.size = size_ref_duration
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Properties) setTimeEncAndDec(typ reflect.Type) {
|
|
||||||
if p.Repeated {
|
|
||||||
if typ.Elem().Kind() == reflect.Ptr {
|
|
||||||
p.enc = (*Buffer).enc_slice_time
|
|
||||||
p.dec = (*Buffer).dec_slice_time
|
|
||||||
p.size = size_slice_time
|
|
||||||
} else {
|
|
||||||
p.enc = (*Buffer).enc_slice_ref_time
|
|
||||||
p.dec = (*Buffer).dec_slice_ref_time
|
|
||||||
p.size = size_slice_ref_time
|
|
||||||
}
|
|
||||||
} else if typ.Kind() == reflect.Ptr {
|
|
||||||
p.enc = (*Buffer).enc_time
|
|
||||||
p.dec = (*Buffer).dec_time
|
|
||||||
p.size = size_time
|
|
||||||
} else {
|
|
||||||
p.enc = (*Buffer).enc_ref_time
|
|
||||||
p.dec = (*Buffer).dec_ref_time
|
|
||||||
p.size = size_ref_time
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Properties) setSliceOfNonPointerStructs(typ reflect.Type) {
|
|
||||||
t2 := typ.Elem()
|
|
||||||
p.sstype = typ
|
|
||||||
p.stype = t2
|
|
||||||
p.isMarshaler = isMarshaler(t2)
|
|
||||||
p.isUnmarshaler = isUnmarshaler(t2)
|
|
||||||
p.enc = (*Buffer).enc_slice_ref_struct_message
|
|
||||||
p.dec = (*Buffer).dec_slice_ref_struct_message
|
|
||||||
p.size = size_slice_ref_struct_message
|
|
||||||
if p.Wire != "bytes" {
|
|
||||||
fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T \n", typ, t2)
|
|
||||||
}
|
|
||||||
}
|
|
346
vendor/github.com/gogo/protobuf/proto/proto3_proto/proto3.pb.go
generated
vendored
346
vendor/github.com/gogo/protobuf/proto/proto3_proto/proto3.pb.go
generated
vendored
@ -1,346 +0,0 @@
|
|||||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
|
||||||
// source: proto3_proto/proto3.proto
|
|
||||||
|
|
||||||
/*
|
|
||||||
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
|
|
||||||
IntMap
|
|
||||||
IntMaps
|
|
||||||
*/
|
|
||||||
package proto3_proto
|
|
||||||
|
|
||||||
import proto "github.com/gogo/protobuf/proto"
|
|
||||||
import fmt "fmt"
|
|
||||||
import math "math"
|
|
||||||
import google_protobuf "github.com/gogo/protobuf/types"
|
|
||||||
import testdata "github.com/gogo/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.
|
|
||||||
// A compilation error at this line likely means your copy of the
|
|
||||||
// proto package needs to be updated.
|
|
||||||
const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
|
|
||||||
|
|
||||||
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 fileDescriptorProto3, []int{0, 0} }
|
|
||||||
|
|
||||||
type Message struct {
|
|
||||||
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
|
||||||
Hilarity Message_Humour `protobuf:"varint,2,opt,name=hilarity,proto3,enum=proto3_proto.Message_Humour" json:"hilarity,omitempty"`
|
|
||||||
HeightInCm uint32 `protobuf:"varint,3,opt,name=height_in_cm,json=heightInCm,proto3" 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,proto3" json:"result_count,omitempty"`
|
|
||||||
TrueScotsman bool `protobuf:"varint,8,opt,name=true_scotsman,json=trueScotsman,proto3" json:"true_scotsman,omitempty"`
|
|
||||||
Score float32 `protobuf:"fixed32,9,opt,name=score,proto3" json:"score,omitempty"`
|
|
||||||
Key []uint64 `protobuf:"varint,5,rep,packed,name=key" json:"key,omitempty"`
|
|
||||||
ShortKey []int32 `protobuf:"varint,19,rep,packed,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,packed,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,proto3" 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,proto3" 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 fileDescriptorProto3, []int{0} }
|
|
||||||
|
|
||||||
func (m *Message) GetName() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Name
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetHilarity() Message_Humour {
|
|
||||||
if m != nil {
|
|
||||||
return m.Hilarity
|
|
||||||
}
|
|
||||||
return Message_UNKNOWN
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetHeightInCm() uint32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.HeightInCm
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetData() []byte {
|
|
||||||
if m != nil {
|
|
||||||
return m.Data
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetResultCount() int64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.ResultCount
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetTrueScotsman() bool {
|
|
||||||
if m != nil {
|
|
||||||
return m.TrueScotsman
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetScore() float32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Score
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetKey() []uint64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Key
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetShortKey() []int32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.ShortKey
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetNested() *Nested {
|
|
||||||
if m != nil {
|
|
||||||
return m.Nested
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Message) GetRFunny() []Message_Humour {
|
|
||||||
if m != nil {
|
|
||||||
return m.RFunny
|
|
||||||
}
|
|
||||||
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,proto3" json:"bunny,omitempty"`
|
|
||||||
Cute bool `protobuf:"varint,2,opt,name=cute,proto3" 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 fileDescriptorProto3, []int{1} }
|
|
||||||
|
|
||||||
func (m *Nested) GetBunny() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Bunny
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Nested) GetCute() bool {
|
|
||||||
if m != nil {
|
|
||||||
return m.Cute
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
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,proto3" 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 fileDescriptorProto3, []int{2} }
|
|
||||||
|
|
||||||
func (m *MessageWithMap) GetByteMapping() map[bool][]byte {
|
|
||||||
if m != nil {
|
|
||||||
return m.ByteMapping
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type IntMap struct {
|
|
||||||
Rtt map[int32]int32 `protobuf:"bytes,1,rep,name=rtt" json:"rtt,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *IntMap) Reset() { *m = IntMap{} }
|
|
||||||
func (m *IntMap) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*IntMap) ProtoMessage() {}
|
|
||||||
func (*IntMap) Descriptor() ([]byte, []int) { return fileDescriptorProto3, []int{3} }
|
|
||||||
|
|
||||||
func (m *IntMap) GetRtt() map[int32]int32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Rtt
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type IntMaps struct {
|
|
||||||
Maps []*IntMap `protobuf:"bytes,1,rep,name=maps" json:"maps,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *IntMaps) Reset() { *m = IntMaps{} }
|
|
||||||
func (m *IntMaps) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*IntMaps) ProtoMessage() {}
|
|
||||||
func (*IntMaps) Descriptor() ([]byte, []int) { return fileDescriptorProto3, []int{4} }
|
|
||||||
|
|
||||||
func (m *IntMaps) GetMaps() []*IntMap {
|
|
||||||
if m != nil {
|
|
||||||
return m.Maps
|
|
||||||
}
|
|
||||||
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.RegisterType((*IntMap)(nil), "proto3_proto.IntMap")
|
|
||||||
proto.RegisterType((*IntMaps)(nil), "proto3_proto.IntMaps")
|
|
||||||
proto.RegisterEnum("proto3_proto.Message_Humour", Message_Humour_name, Message_Humour_value)
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { proto.RegisterFile("proto3_proto/proto3.proto", fileDescriptorProto3) }
|
|
||||||
|
|
||||||
var fileDescriptorProto3 = []byte{
|
|
||||||
// 733 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x53, 0x6d, 0x6f, 0xf3, 0x34,
|
|
||||||
0x14, 0x25, 0x4d, 0x5f, 0xd2, 0x9b, 0x74, 0x0b, 0x5e, 0x91, 0xbc, 0x02, 0x52, 0x28, 0x12, 0x8a,
|
|
||||||
0x78, 0x49, 0xa1, 0xd3, 0xd0, 0x84, 0x10, 0x68, 0x1b, 0x9b, 0xa8, 0xd6, 0x95, 0xca, 0xdd, 0x98,
|
|
||||||
0xf8, 0x14, 0xa5, 0xad, 0xdb, 0x46, 0x34, 0x4e, 0x49, 0x1c, 0xa4, 0xfc, 0x1d, 0xfe, 0x28, 0x8f,
|
|
||||||
0x6c, 0xa7, 0x5d, 0x36, 0x65, 0xcf, 0xf3, 0x29, 0xf6, 0xf1, 0xb9, 0xf7, 0x9c, 0x1c, 0x5f, 0xc3,
|
|
||||||
0xe9, 0x2e, 0x89, 0x79, 0x7c, 0xe6, 0xcb, 0xcf, 0x40, 0x6d, 0x3c, 0xf9, 0x41, 0x56, 0xf9, 0xa8,
|
|
||||||
0x77, 0xba, 0x8e, 0xe3, 0xf5, 0x96, 0x2a, 0xca, 0x3c, 0x5b, 0x0d, 0x02, 0x96, 0x2b, 0x62, 0xef,
|
|
||||||
0x84, 0xd3, 0x94, 0x2f, 0x03, 0x1e, 0x0c, 0xc4, 0x42, 0x81, 0xfd, 0xff, 0x5b, 0xd0, 0xba, 0xa7,
|
|
||||||
0x69, 0x1a, 0xac, 0x29, 0x42, 0x50, 0x67, 0x41, 0x44, 0xb1, 0xe6, 0x68, 0x6e, 0x9b, 0xc8, 0x35,
|
|
||||||
0xba, 0x00, 0x63, 0x13, 0x6e, 0x83, 0x24, 0xe4, 0x39, 0xae, 0x39, 0x9a, 0x7b, 0x34, 0xfc, 0xcc,
|
|
||||||
0x2b, 0x0b, 0x7a, 0x45, 0xb1, 0xf7, 0x7b, 0x16, 0xc5, 0x59, 0x42, 0x0e, 0x6c, 0xe4, 0x80, 0xb5,
|
|
||||||
0xa1, 0xe1, 0x7a, 0xc3, 0xfd, 0x90, 0xf9, 0x8b, 0x08, 0xeb, 0x8e, 0xe6, 0x76, 0x08, 0x28, 0x6c,
|
|
||||||
0xc4, 0xae, 0x23, 0xa1, 0x27, 0xec, 0xe0, 0xba, 0xa3, 0xb9, 0x16, 0x91, 0x6b, 0xf4, 0x05, 0x58,
|
|
||||||
0x09, 0x4d, 0xb3, 0x2d, 0xf7, 0x17, 0x71, 0xc6, 0x38, 0x6e, 0x39, 0x9a, 0xab, 0x13, 0x53, 0x61,
|
|
||||||
0xd7, 0x02, 0x42, 0x5f, 0x42, 0x87, 0x27, 0x19, 0xf5, 0xd3, 0x45, 0xcc, 0xd3, 0x28, 0x60, 0xd8,
|
|
||||||
0x70, 0x34, 0xd7, 0x20, 0x96, 0x00, 0x67, 0x05, 0x86, 0xba, 0xd0, 0x48, 0x17, 0x71, 0x42, 0x71,
|
|
||||||
0xdb, 0xd1, 0xdc, 0x1a, 0x51, 0x1b, 0x64, 0x83, 0xfe, 0x37, 0xcd, 0x71, 0xc3, 0xd1, 0xdd, 0x3a,
|
|
||||||
0x11, 0x4b, 0xf4, 0x29, 0xb4, 0xd3, 0x4d, 0x9c, 0x70, 0x5f, 0xe0, 0x27, 0x8e, 0xee, 0x36, 0x88,
|
|
||||||
0x21, 0x81, 0x3b, 0x9a, 0xa3, 0x6f, 0xa1, 0xc9, 0x68, 0xca, 0xe9, 0x12, 0x37, 0x1d, 0xcd, 0x35,
|
|
||||||
0x87, 0xdd, 0x97, 0xbf, 0x3e, 0x91, 0x67, 0xa4, 0xe0, 0xa0, 0x73, 0x68, 0x25, 0xfe, 0x2a, 0x63,
|
|
||||||
0x2c, 0xc7, 0xb6, 0xa3, 0x7f, 0x30, 0xa9, 0x66, 0x72, 0x2b, 0xb8, 0xe8, 0x67, 0x68, 0x71, 0x9a,
|
|
||||||
0x24, 0x41, 0xc8, 0x30, 0x38, 0xba, 0x6b, 0x0e, 0xfb, 0xd5, 0x65, 0x0f, 0x8a, 0x74, 0xc3, 0x78,
|
|
||||||
0x92, 0x93, 0x7d, 0x09, 0xba, 0x00, 0x75, 0xff, 0x43, 0x7f, 0x15, 0xd2, 0xed, 0x12, 0x9b, 0xd2,
|
|
||||||
0xe8, 0x27, 0xde, 0xfe, 0xae, 0xbd, 0x59, 0x36, 0xff, 0x8d, 0xae, 0x82, 0x6c, 0xcb, 0x53, 0x62,
|
|
||||||
0x2a, 0xea, 0xad, 0x60, 0xa2, 0xd1, 0xa1, 0xf2, 0xdf, 0x60, 0x9b, 0x51, 0xdc, 0x91, 0xe2, 0x5f,
|
|
||||||
0x55, 0x8b, 0x4f, 0x25, 0xf3, 0x4f, 0x41, 0x54, 0x06, 0x8a, 0x56, 0x12, 0x41, 0xdf, 0x83, 0x11,
|
|
||||||
0xb0, 0x9c, 0x6f, 0x42, 0xb6, 0xc6, 0x47, 0x45, 0x52, 0x6a, 0x0e, 0xbd, 0xfd, 0x1c, 0x7a, 0x97,
|
|
||||||
0x2c, 0x27, 0x07, 0x16, 0x3a, 0x07, 0x33, 0x0a, 0x58, 0xee, 0xcb, 0x5d, 0x8a, 0x8f, 0xa5, 0x76,
|
|
||||||
0x75, 0x11, 0x08, 0xe2, 0x83, 0xe4, 0xa1, 0x73, 0x80, 0x34, 0x9b, 0x47, 0xca, 0x14, 0xfe, 0xb8,
|
|
||||||
0xf8, 0xd7, 0x2a, 0xc7, 0xa4, 0x44, 0x44, 0x3f, 0x80, 0xb1, 0xd8, 0x84, 0xdb, 0x65, 0x42, 0x19,
|
|
||||||
0x46, 0x52, 0xea, 0x8d, 0xa2, 0x03, 0xad, 0x37, 0x05, 0xab, 0x1c, 0xf8, 0x7e, 0x72, 0xd4, 0xd3,
|
|
||||||
0x90, 0x93, 0xf3, 0x35, 0x34, 0x54, 0x70, 0xb5, 0xf7, 0xcc, 0x86, 0xa2, 0xfc, 0x54, 0xbb, 0xd0,
|
|
||||||
0x7a, 0x8f, 0x60, 0xbf, 0x4e, 0xb1, 0xa2, 0xeb, 0x37, 0x2f, 0xbb, 0xbe, 0x71, 0x91, 0xcf, 0x6d,
|
|
||||||
0xfb, 0xbf, 0x42, 0x53, 0x0d, 0x14, 0x32, 0xa1, 0xf5, 0x38, 0xb9, 0x9b, 0xfc, 0xf1, 0x34, 0xb1,
|
|
||||||
0x3f, 0x42, 0x06, 0xd4, 0xa7, 0x8f, 0x93, 0x99, 0xad, 0xa1, 0x0e, 0xb4, 0x67, 0xe3, 0xcb, 0xe9,
|
|
||||||
0xec, 0x61, 0x74, 0x7d, 0x67, 0xd7, 0xd0, 0x31, 0x98, 0x57, 0xa3, 0xf1, 0xd8, 0xbf, 0xba, 0x1c,
|
|
||||||
0x8d, 0x6f, 0xfe, 0xb2, 0xf5, 0xfe, 0x10, 0x9a, 0xca, 0xac, 0x78, 0x33, 0x73, 0x39, 0xbe, 0xca,
|
|
||||||
0x8f, 0xda, 0x88, 0x57, 0xba, 0xc8, 0xb8, 0x32, 0x64, 0x10, 0xb9, 0xee, 0xff, 0xa7, 0xc1, 0x51,
|
|
||||||
0x91, 0xd9, 0x53, 0xc8, 0x37, 0xf7, 0xc1, 0x0e, 0x4d, 0xc1, 0x9a, 0xe7, 0x9c, 0xfa, 0x51, 0xb0,
|
|
||||||
0xdb, 0x89, 0x39, 0xd0, 0x64, 0xce, 0xdf, 0x55, 0xe6, 0x5c, 0xd4, 0x78, 0x57, 0x39, 0xa7, 0xf7,
|
|
||||||
0x8a, 0x5f, 0x4c, 0xd5, 0xfc, 0x19, 0xe9, 0xfd, 0x02, 0xf6, 0x6b, 0x42, 0x39, 0x30, 0x43, 0x05,
|
|
||||||
0xd6, 0x2d, 0x07, 0x66, 0x95, 0x93, 0xf9, 0x07, 0x9a, 0x23, 0xc6, 0x85, 0xb7, 0x01, 0xe8, 0x09,
|
|
||||||
0xe7, 0x85, 0xa5, 0xcf, 0x5f, 0x5a, 0x52, 0x14, 0x8f, 0x70, 0xae, 0x2c, 0x08, 0x66, 0xef, 0x47,
|
|
||||||
0x30, 0xf6, 0x40, 0x59, 0xb2, 0x51, 0x21, 0xd9, 0x28, 0x4b, 0x9e, 0x41, 0x4b, 0xf5, 0x4b, 0x91,
|
|
||||||
0x0b, 0xf5, 0x28, 0xd8, 0xa5, 0x85, 0x68, 0xb7, 0x4a, 0x94, 0x48, 0xc6, 0xbc, 0xa9, 0x8e, 0xde,
|
|
||||||
0x05, 0x00, 0x00, 0xff, 0xff, 0x75, 0x38, 0xad, 0x84, 0xe4, 0x05, 0x00, 0x00,
|
|
||||||
}
|
|
135
vendor/github.com/gogo/protobuf/proto/proto3_test.go
generated
vendored
135
vendor/github.com/gogo/protobuf/proto/proto3_test.go
generated
vendored
@ -1,135 +0,0 @@
|
|||||||
// 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/gogo/protobuf/proto"
|
|
||||||
pb "github.com/gogo/protobuf/proto/proto3_proto"
|
|
||||||
tpb "github.com/gogo/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 TestGettersForBasicTypesExist(t *testing.T) {
|
|
||||||
var m pb.Message
|
|
||||||
if got := m.GetNested().GetBunny(); got != "" {
|
|
||||||
t.Errorf("m.GetNested().GetBunny() = %q, want empty string", got)
|
|
||||||
}
|
|
||||||
if got := m.GetNested().GetCute(); got {
|
|
||||||
t.Errorf("m.GetNested().GetCute() = %t, want false", got)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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": {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/gogo/protobuf/proto/size2_test.go
generated
vendored
63
vendor/github.com/gogo/protobuf/proto/size2_test.go
generated
vendored
@ -1,63 +0,0 @@
|
|||||||
// 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/gogo/protobuf/proto/size_test.go
generated
vendored
164
vendor/github.com/gogo/protobuf/proto/size_test.go
generated
vendored
@ -1,164 +0,0 @@
|
|||||||
// 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/gogo/protobuf/proto"
|
|
||||||
proto3pb "github.com/gogo/protobuf/proto/proto3_proto"
|
|
||||||
pb "github.com/gogo/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: {}}}},
|
|
||||||
|
|
||||||
{"map field", &pb.MessageWithMap{NameMapping: map[int32]string{1: "Rob", 7: "Andrew"}}},
|
|
||||||
{"map field with message", &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{0x7001: {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: {}}}},
|
|
||||||
|
|
||||||
{"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{F_Bool: true}}},
|
|
||||||
{"oneof zero int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{F_Int32: 0}}},
|
|
||||||
{"oneof big int32", &pb.Oneof{Union: &pb.Oneof_F_Int32{F_Int32: 1 << 20}}},
|
|
||||||
{"oneof int64", &pb.Oneof{Union: &pb.Oneof_F_Int64{F_Int64: 42}}},
|
|
||||||
{"oneof fixed32", &pb.Oneof{Union: &pb.Oneof_F_Fixed32{F_Fixed32: 43}}},
|
|
||||||
{"oneof fixed64", &pb.Oneof{Union: &pb.Oneof_F_Fixed64{F_Fixed64: 44}}},
|
|
||||||
{"oneof uint32", &pb.Oneof{Union: &pb.Oneof_F_Uint32{F_Uint32: 45}}},
|
|
||||||
{"oneof uint64", &pb.Oneof{Union: &pb.Oneof_F_Uint64{F_Uint64: 46}}},
|
|
||||||
{"oneof float", &pb.Oneof{Union: &pb.Oneof_F_Float{F_Float: 47.1}}},
|
|
||||||
{"oneof double", &pb.Oneof{Union: &pb.Oneof_F_Double{F_Double: 48.9}}},
|
|
||||||
{"oneof string", &pb.Oneof{Union: &pb.Oneof_F_String{F_String: "Rhythmic Fman"}}},
|
|
||||||
{"oneof bytes", &pb.Oneof{Union: &pb.Oneof_F_Bytes{F_Bytes: []byte("let go")}}},
|
|
||||||
{"oneof sint32", &pb.Oneof{Union: &pb.Oneof_F_Sint32{F_Sint32: 50}}},
|
|
||||||
{"oneof sint64", &pb.Oneof{Union: &pb.Oneof_F_Sint64{F_Sint64: 51}}},
|
|
||||||
{"oneof enum", &pb.Oneof{Union: &pb.Oneof_F_Enum{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{F_Message: &pb.GoTestField{Label: String("k"), Type: String("v")}}}},
|
|
||||||
{"oneof group", &pb.Oneof{Union: &pb.Oneof_FGroup{FGroup: &pb.Oneof_F_Group{X: Int32(52)}}}},
|
|
||||||
{"oneof largest tag", &pb.Oneof{Union: &pb.Oneof_F_Largest_Tag{F_Largest_Tag: 1}}},
|
|
||||||
{"multiple oneofs", &pb.Oneof{Union: &pb.Oneof_F_Int32{F_Int32: 1}, Tormato: &pb.Oneof_Value{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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
119
vendor/github.com/gogo/protobuf/proto/skip_gogo.go
generated
vendored
119
vendor/github.com/gogo/protobuf/proto/skip_gogo.go
generated
vendored
@ -1,119 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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 (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Skip(data []byte) (n int, err error) {
|
|
||||||
l := len(data)
|
|
||||||
index := 0
|
|
||||||
for index < l {
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if index >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := data[index]
|
|
||||||
index++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
switch wireType {
|
|
||||||
case 0:
|
|
||||||
for {
|
|
||||||
if index >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
index++
|
|
||||||
if data[index-1] < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return index, nil
|
|
||||||
case 1:
|
|
||||||
index += 8
|
|
||||||
return index, nil
|
|
||||||
case 2:
|
|
||||||
var length int
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if index >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := data[index]
|
|
||||||
index++
|
|
||||||
length |= (int(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
index += length
|
|
||||||
return index, nil
|
|
||||||
case 3:
|
|
||||||
for {
|
|
||||||
var innerWire uint64
|
|
||||||
var start int = index
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if index >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := data[index]
|
|
||||||
index++
|
|
||||||
innerWire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
innerWireType := int(innerWire & 0x7)
|
|
||||||
if innerWireType == 4 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
next, err := Skip(data[start:])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
index = start + next
|
|
||||||
}
|
|
||||||
return index, nil
|
|
||||||
case 4:
|
|
||||||
return index, nil
|
|
||||||
case 5:
|
|
||||||
index += 4
|
|
||||||
return index, nil
|
|
||||||
default:
|
|
||||||
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
panic("unreachable")
|
|
||||||
}
|
|
37
vendor/github.com/gogo/protobuf/proto/testdata/Makefile
generated
vendored
37
vendor/github.com/gogo/protobuf/proto/testdata/Makefile
generated
vendored
@ -1,37 +0,0 @@
|
|||||||
# 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: regenerate
|
|
||||||
|
|
||||||
regenerate:
|
|
||||||
go install github.com/gogo/protobuf/protoc-min-version
|
|
||||||
protoc-min-version --version="3.0.0" --gogo_out=. test.proto
|
|
||||||
|
|
86
vendor/github.com/gogo/protobuf/proto/testdata/golden_test.go
generated
vendored
86
vendor/github.com/gogo/protobuf/proto/testdata/golden_test.go
generated
vendored
@ -1,86 +0,0 @@
|
|||||||
// 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", "--gogo_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")
|
|
||||||
}
|
|
||||||
}
|
|
4147
vendor/github.com/gogo/protobuf/proto/testdata/test.pb.go
generated
vendored
4147
vendor/github.com/gogo/protobuf/proto/testdata/test.pb.go
generated
vendored
File diff suppressed because it is too large
Load Diff
1737
vendor/github.com/gogo/protobuf/proto/testdata/test.pb.go.golden
generated
vendored
1737
vendor/github.com/gogo/protobuf/proto/testdata/test.pb.go.golden
generated
vendored
File diff suppressed because it is too large
Load Diff
548
vendor/github.com/gogo/protobuf/proto/testdata/test.proto
generated
vendored
548
vendor/github.com/gogo/protobuf/proto/testdata/test.proto
generated
vendored
@ -1,548 +0,0 @@
|
|||||||
// 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;
|
|
||||||
}
|
|
||||||
}
|
|
939
vendor/github.com/gogo/protobuf/proto/text.go
generated
vendored
939
vendor/github.com/gogo/protobuf/proto/text.go
generated
vendored
@ -1,939 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/protobuf
|
|
||||||
//
|
|
||||||
// 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"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
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 len(props.Enum) > 0 {
|
|
||||||
if err := tm.writeEnum(w, v, props); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else 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 props.proto3 && 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
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(props.Enum) > 0 {
|
|
||||||
if err := tm.writeEnum(w, fv, props); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else 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
|
|
||||||
if pv.CanAddr() {
|
|
||||||
pv = sv.Addr()
|
|
||||||
} else {
|
|
||||||
pv = reflect.New(sv.Type())
|
|
||||||
pv.Elem().Set(sv)
|
|
||||||
}
|
|
||||||
if pv.Type().Implements(extensionRangeType) {
|
|
||||||
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)
|
|
||||||
|
|
||||||
if props != nil {
|
|
||||||
if len(props.CustomType) > 0 {
|
|
||||||
custom, ok := v.Interface().(Marshaler)
|
|
||||||
if ok {
|
|
||||||
data, err := custom.Marshal()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := writeString(w, string(data)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
} else if len(props.CastType) > 0 {
|
|
||||||
if _, ok := v.Interface().(interface {
|
|
||||||
String() string
|
|
||||||
}); ok {
|
|
||||||
switch v.Kind() {
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
|
|
||||||
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
|
||||||
_, err := fmt.Fprintf(w, "%d", v.Interface())
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if props.StdTime {
|
|
||||||
t, ok := v.Interface().(time.Time)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("stdtime is not time.Time, but %T", v.Interface())
|
|
||||||
}
|
|
||||||
tproto, err := timestampProto(t)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
propsCopy := *props // Make a copy so that this is goroutine-safe
|
|
||||||
propsCopy.StdTime = false
|
|
||||||
err = tm.writeAny(w, reflect.ValueOf(tproto), &propsCopy)
|
|
||||||
return err
|
|
||||||
} else if props.StdDuration {
|
|
||||||
d, ok := v.Interface().(time.Duration)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("stdtime is not time.Duration, but %T", v.Interface())
|
|
||||||
}
|
|
||||||
dproto := durationProto(d)
|
|
||||||
propsCopy := *props // Make a copy so that this is goroutine-safe
|
|
||||||
propsCopy.StdDuration = false
|
|
||||||
err := tm.writeAny(w, reflect.ValueOf(dproto), &propsCopy)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 {
|
|
||||||
_, ferr := fmt.Fprintf(w, "/* %v */\n", err)
|
|
||||||
return ferr
|
|
||||||
}
|
|
||||||
wire, tag := x&7, x>>3
|
|
||||||
if wire == WireEndGroup {
|
|
||||||
w.unindent()
|
|
||||||
if _, werr := w.Write(endBraceNewline); werr != nil {
|
|
||||||
return werr
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if _, ferr := fmt.Fprint(w, tag); ferr != nil {
|
|
||||||
return ferr
|
|
||||||
}
|
|
||||||
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()]
|
|
||||||
e := pv.Interface().(Message)
|
|
||||||
|
|
||||||
var m map[int32]Extension
|
|
||||||
var mu sync.Locker
|
|
||||||
if em, ok := e.(extensionsBytes); ok {
|
|
||||||
eb := em.GetExtensions()
|
|
||||||
var err error
|
|
||||||
m, err = BytesToExtensionsMap(*eb)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
mu = notLocker{}
|
|
||||||
} else if _, ok := e.(extendableProto); ok {
|
|
||||||
ep, _ := extendable(e)
|
|
||||||
m, mu = ep.extensionsRead()
|
|
||||||
if m == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Order the extensions by ID.
|
|
||||||
// This isn't strictly necessary, but it will give us
|
|
||||||
// canonical output, which will also make testing easier.
|
|
||||||
|
|
||||||
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(e, 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) }
|
|
57
vendor/github.com/gogo/protobuf/proto/text_gogo.go
generated
vendored
57
vendor/github.com/gogo/protobuf/proto/text_gogo.go
generated
vendored
@ -1,57 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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 (
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (tm *TextMarshaler) writeEnum(w *textWriter, v reflect.Value, props *Properties) error {
|
|
||||||
m, ok := enumStringMaps[props.Enum]
|
|
||||||
if !ok {
|
|
||||||
if err := tm.writeAny(w, v, props); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
key := int32(0)
|
|
||||||
if v.Kind() == reflect.Ptr {
|
|
||||||
key = int32(v.Elem().Int())
|
|
||||||
} else {
|
|
||||||
key = int32(v.Int())
|
|
||||||
}
|
|
||||||
s, ok := m[key]
|
|
||||||
if !ok {
|
|
||||||
if err := tm.writeAny(w, v, props); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, err := fmt.Fprint(w, s)
|
|
||||||
return err
|
|
||||||
}
|
|
1013
vendor/github.com/gogo/protobuf/proto/text_parser.go
generated
vendored
1013
vendor/github.com/gogo/protobuf/proto/text_parser.go
generated
vendored
File diff suppressed because it is too large
Load Diff
673
vendor/github.com/gogo/protobuf/proto/text_parser_test.go
generated
vendored
673
vendor/github.com/gogo/protobuf/proto/text_parser_test.go
generated
vendored
@ -1,673 +0,0 @@
|
|||||||
// 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/gogo/protobuf/proto"
|
|
||||||
proto3pb "github.com/gogo/protobuf/proto/proto3_proto"
|
|
||||||
. "github.com/gogo/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{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)
|
|
||||||
}
|
|
||||||
|
|
||||||
const inOverwrite = `name:"Shrek" number:42`
|
|
||||||
m = new(Communique)
|
|
||||||
testErr := "line 1.13: field 'number' would overwrite already parsed oneof 'Union'"
|
|
||||||
if err := UnmarshalText(inOverwrite, m); err == nil {
|
|
||||||
t.Errorf("TestOneofParsing: Didn't get expected error: %v", testErr)
|
|
||||||
} else if err.Error() != testErr {
|
|
||||||
t.Errorf("TestOneofParsing: Incorrect error.\nHave: %v\nWant: %v",
|
|
||||||
err.Error(), testErr)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
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/gogo/protobuf/proto/text_test.go
generated
vendored
474
vendor/github.com/gogo/protobuf/proto/text_test.go
generated
vendored
@ -1,474 +0,0 @@
|
|||||||
// 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/gogo/protobuf/proto"
|
|
||||||
|
|
||||||
proto3pb "github.com/gogo/protobuf/proto/proto3_proto"
|
|
||||||
pb "github.com/gogo/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{Number: 4}}, `number:4`},
|
|
||||||
// message field
|
|
||||||
{&pb.Communique{Union: &pb.Communique_Msg{
|
|
||||||
Msg: &pb.Strings{StringField: proto.String("why hello!")},
|
|
||||||
}}, `msg:<string_field:"why hello!" >`},
|
|
||||||
// bad oneof (should not panic)
|
|
||||||
{&pb.Communique{Union: &pb.Communique_Msg{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.
|
|
||||||
pbStrings := new(pb.Strings)
|
|
||||||
if err := proto.UnmarshalText(s, pbStrings); err != nil {
|
|
||||||
t.Errorf("#%d: UnmarshalText: %v", i, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if !proto.Equal(pbStrings, tc.in) {
|
|
||||||
t.Errorf("#%d: Round-trip failed:\nstart: %v\n end: %v", i, tc.in, pbStrings)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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,
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
113
vendor/github.com/gogo/protobuf/proto/timestamp.go
generated
vendored
113
vendor/github.com/gogo/protobuf/proto/timestamp.go
generated
vendored
@ -1,113 +0,0 @@
|
|||||||
// 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
|
|
||||||
|
|
||||||
// This file implements operations on google.protobuf.Timestamp.
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
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 *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
|
|
||||||
}
|
|
||||||
|
|
||||||
// TimestampFromProto 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 timestampFromProto(ts *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) (*timestamp, error) {
|
|
||||||
seconds := t.Unix()
|
|
||||||
nanos := int32(t.Sub(time.Unix(seconds, 0)))
|
|
||||||
ts := ×tamp{
|
|
||||||
Seconds: seconds,
|
|
||||||
Nanos: nanos,
|
|
||||||
}
|
|
||||||
if err := validateTimestamp(ts); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return ts, nil
|
|
||||||
}
|
|
229
vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go
generated
vendored
229
vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go
generated
vendored
@ -1,229 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2016, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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 (
|
|
||||||
"reflect"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
var timeType = reflect.TypeOf((*time.Time)(nil)).Elem()
|
|
||||||
|
|
||||||
type timestamp struct {
|
|
||||||
Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"`
|
|
||||||
Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *timestamp) Reset() { *m = timestamp{} }
|
|
||||||
func (*timestamp) ProtoMessage() {}
|
|
||||||
func (*timestamp) String() string { return "timestamp<string>" }
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
RegisterType((*timestamp)(nil), "gogo.protobuf.proto.timestamp")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) decTimestamp() (time.Time, error) {
|
|
||||||
b, err := o.DecodeRawBytes(true)
|
|
||||||
if err != nil {
|
|
||||||
return time.Time{}, err
|
|
||||||
}
|
|
||||||
tproto := ×tamp{}
|
|
||||||
if err := Unmarshal(b, tproto); err != nil {
|
|
||||||
return time.Time{}, err
|
|
||||||
}
|
|
||||||
return timestampFromProto(tproto)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) dec_time(p *Properties, base structPointer) error {
|
|
||||||
t, err := o.decTimestamp()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
setPtrCustomType(base, p.field, &t)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) dec_ref_time(p *Properties, base structPointer) error {
|
|
||||||
t, err := o.decTimestamp()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
setCustomType(base, p.field, &t)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) dec_slice_time(p *Properties, base structPointer) error {
|
|
||||||
t, err := o.decTimestamp()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
newBas := appendStructPointer(base, p.field, reflect.SliceOf(reflect.PtrTo(timeType)))
|
|
||||||
var zero field
|
|
||||||
setPtrCustomType(newBas, zero, &t)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) dec_slice_ref_time(p *Properties, base structPointer) error {
|
|
||||||
t, err := o.decTimestamp()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
newBas := appendStructPointer(base, p.field, reflect.SliceOf(timeType))
|
|
||||||
var zero field
|
|
||||||
setCustomType(newBas, zero, &t)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_time(p *Properties, base structPointer) (n int) {
|
|
||||||
structp := structPointer_GetStructPointer(base, p.field)
|
|
||||||
if structPointer_IsNil(structp) {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
tim := structPointer_Interface(structp, timeType).(*time.Time)
|
|
||||||
t, err := timestampProto(*tim)
|
|
||||||
if err != nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
size := Size(t)
|
|
||||||
return size + sizeVarint(uint64(size)) + len(p.tagcode)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) enc_time(p *Properties, base structPointer) error {
|
|
||||||
structp := structPointer_GetStructPointer(base, p.field)
|
|
||||||
if structPointer_IsNil(structp) {
|
|
||||||
return ErrNil
|
|
||||||
}
|
|
||||||
tim := structPointer_Interface(structp, timeType).(*time.Time)
|
|
||||||
t, err := timestampProto(*tim)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
data, err := Marshal(t)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeRawBytes(data)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_ref_time(p *Properties, base structPointer) (n int) {
|
|
||||||
tim := structPointer_InterfaceAt(base, p.field, timeType).(*time.Time)
|
|
||||||
t, err := timestampProto(*tim)
|
|
||||||
if err != nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
size := Size(t)
|
|
||||||
return size + sizeVarint(uint64(size)) + len(p.tagcode)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) enc_ref_time(p *Properties, base structPointer) error {
|
|
||||||
tim := structPointer_InterfaceAt(base, p.field, timeType).(*time.Time)
|
|
||||||
t, err := timestampProto(*tim)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
data, err := Marshal(t)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeRawBytes(data)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_slice_time(p *Properties, base structPointer) (n int) {
|
|
||||||
ptims := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(reflect.PtrTo(timeType))).(*[]*time.Time)
|
|
||||||
tims := *ptims
|
|
||||||
for i := 0; i < len(tims); i++ {
|
|
||||||
if tims[i] == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
tproto, err := timestampProto(*tims[i])
|
|
||||||
if err != nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
size := Size(tproto)
|
|
||||||
n += len(p.tagcode) + size + sizeVarint(uint64(size))
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) enc_slice_time(p *Properties, base structPointer) error {
|
|
||||||
ptims := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(reflect.PtrTo(timeType))).(*[]*time.Time)
|
|
||||||
tims := *ptims
|
|
||||||
for i := 0; i < len(tims); i++ {
|
|
||||||
if tims[i] == nil {
|
|
||||||
return errRepeatedHasNil
|
|
||||||
}
|
|
||||||
tproto, err := timestampProto(*tims[i])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
data, err := Marshal(tproto)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeRawBytes(data)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func size_slice_ref_time(p *Properties, base structPointer) (n int) {
|
|
||||||
ptims := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(timeType)).(*[]time.Time)
|
|
||||||
tims := *ptims
|
|
||||||
for i := 0; i < len(tims); i++ {
|
|
||||||
tproto, err := timestampProto(tims[i])
|
|
||||||
if err != nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
size := Size(tproto)
|
|
||||||
n += len(p.tagcode) + size + sizeVarint(uint64(size))
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Buffer) enc_slice_ref_time(p *Properties, base structPointer) error {
|
|
||||||
ptims := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(timeType)).(*[]time.Time)
|
|
||||||
tims := *ptims
|
|
||||||
for i := 0; i < len(tims); i++ {
|
|
||||||
tproto, err := timestampProto(tims[i])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
data, err := Marshal(tproto)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
o.buf = append(o.buf, p.tagcode...)
|
|
||||||
o.EncodeRawBytes(data)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
36
vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/Makefile
generated
vendored
36
vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/Makefile
generated
vendored
@ -1,36 +0,0 @@
|
|||||||
# 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.
|
|
||||||
|
|
||||||
regenerate:
|
|
||||||
go install github.com/gogo/protobuf/protoc-gen-gogo
|
|
||||||
go install github.com/gogo/protobuf/protoc-gen-gostring
|
|
||||||
protoc --gogo_out=. -I=../../protobuf/google/protobuf ../../protobuf/google/protobuf/descriptor.proto
|
|
||||||
protoc --gostring_out=. -I=../../protobuf/google/protobuf ../../protobuf/google/protobuf/descriptor.proto
|
|
118
vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.go
generated
vendored
118
vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.go
generated
vendored
@ -1,118 +0,0 @@
|
|||||||
// 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 descriptor provides functions for obtaining protocol buffer
|
|
||||||
// descriptors for generated Go types.
|
|
||||||
//
|
|
||||||
// These functions cannot go in package proto because they depend on the
|
|
||||||
// generated protobuf descriptor messages, which themselves depend on proto.
|
|
||||||
package descriptor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"compress/gzip"
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
|
|
||||||
"github.com/gogo/protobuf/proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
// extractFile extracts a FileDescriptorProto from a gzip'd buffer.
|
|
||||||
func extractFile(gz []byte) (*FileDescriptorProto, error) {
|
|
||||||
r, err := gzip.NewReader(bytes.NewReader(gz))
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to open gzip reader: %v", err)
|
|
||||||
}
|
|
||||||
defer r.Close()
|
|
||||||
|
|
||||||
b, err := ioutil.ReadAll(r)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to uncompress descriptor: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fd := new(FileDescriptorProto)
|
|
||||||
if err := proto.Unmarshal(b, fd); err != nil {
|
|
||||||
return nil, fmt.Errorf("malformed FileDescriptorProto: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return fd, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Message is a proto.Message with a method to return its descriptor.
|
|
||||||
//
|
|
||||||
// Message types generated by the protocol compiler always satisfy
|
|
||||||
// the Message interface.
|
|
||||||
type Message interface {
|
|
||||||
proto.Message
|
|
||||||
Descriptor() ([]byte, []int)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ForMessage returns a FileDescriptorProto and a DescriptorProto from within it
|
|
||||||
// describing the given message.
|
|
||||||
func ForMessage(msg Message) (fd *FileDescriptorProto, md *DescriptorProto) {
|
|
||||||
gz, path := msg.Descriptor()
|
|
||||||
fd, err := extractFile(gz)
|
|
||||||
if err != nil {
|
|
||||||
panic(fmt.Sprintf("invalid FileDescriptorProto for %T: %v", msg, err))
|
|
||||||
}
|
|
||||||
|
|
||||||
md = fd.MessageType[path[0]]
|
|
||||||
for _, i := range path[1:] {
|
|
||||||
md = md.NestedType[i]
|
|
||||||
}
|
|
||||||
return fd, md
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is this field a scalar numeric type?
|
|
||||||
func (field *FieldDescriptorProto) IsScalar() bool {
|
|
||||||
if field.Type == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
switch *field.Type {
|
|
||||||
case FieldDescriptorProto_TYPE_DOUBLE,
|
|
||||||
FieldDescriptorProto_TYPE_FLOAT,
|
|
||||||
FieldDescriptorProto_TYPE_INT64,
|
|
||||||
FieldDescriptorProto_TYPE_UINT64,
|
|
||||||
FieldDescriptorProto_TYPE_INT32,
|
|
||||||
FieldDescriptorProto_TYPE_FIXED64,
|
|
||||||
FieldDescriptorProto_TYPE_FIXED32,
|
|
||||||
FieldDescriptorProto_TYPE_BOOL,
|
|
||||||
FieldDescriptorProto_TYPE_UINT32,
|
|
||||||
FieldDescriptorProto_TYPE_ENUM,
|
|
||||||
FieldDescriptorProto_TYPE_SFIXED32,
|
|
||||||
FieldDescriptorProto_TYPE_SFIXED64,
|
|
||||||
FieldDescriptorProto_TYPE_SINT32,
|
|
||||||
FieldDescriptorProto_TYPE_SINT64:
|
|
||||||
return true
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
2280
vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.pb.go
generated
vendored
2280
vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor.pb.go
generated
vendored
File diff suppressed because it is too large
Load Diff
772
vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_gostring.gen.go
generated
vendored
772
vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_gostring.gen.go
generated
vendored
@ -1,772 +0,0 @@
|
|||||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
|
||||||
// source: descriptor.proto
|
|
||||||
|
|
||||||
/*
|
|
||||||
Package descriptor is a generated protocol buffer package.
|
|
||||||
|
|
||||||
It is generated from these files:
|
|
||||||
descriptor.proto
|
|
||||||
|
|
||||||
It has these top-level messages:
|
|
||||||
FileDescriptorSet
|
|
||||||
FileDescriptorProto
|
|
||||||
DescriptorProto
|
|
||||||
ExtensionRangeOptions
|
|
||||||
FieldDescriptorProto
|
|
||||||
OneofDescriptorProto
|
|
||||||
EnumDescriptorProto
|
|
||||||
EnumValueDescriptorProto
|
|
||||||
ServiceDescriptorProto
|
|
||||||
MethodDescriptorProto
|
|
||||||
FileOptions
|
|
||||||
MessageOptions
|
|
||||||
FieldOptions
|
|
||||||
OneofOptions
|
|
||||||
EnumOptions
|
|
||||||
EnumValueOptions
|
|
||||||
ServiceOptions
|
|
||||||
MethodOptions
|
|
||||||
UninterpretedOption
|
|
||||||
SourceCodeInfo
|
|
||||||
GeneratedCodeInfo
|
|
||||||
*/
|
|
||||||
package descriptor
|
|
||||||
|
|
||||||
import fmt "fmt"
|
|
||||||
import strings "strings"
|
|
||||||
import proto "github.com/gogo/protobuf/proto"
|
|
||||||
import sort "sort"
|
|
||||||
import strconv "strconv"
|
|
||||||
import reflect "reflect"
|
|
||||||
import math "math"
|
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
|
||||||
var _ = proto.Marshal
|
|
||||||
var _ = fmt.Errorf
|
|
||||||
var _ = math.Inf
|
|
||||||
|
|
||||||
func (this *FileDescriptorSet) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 5)
|
|
||||||
s = append(s, "&descriptor.FileDescriptorSet{")
|
|
||||||
if this.File != nil {
|
|
||||||
s = append(s, "File: "+fmt.Sprintf("%#v", this.File)+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *FileDescriptorProto) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 16)
|
|
||||||
s = append(s, "&descriptor.FileDescriptorProto{")
|
|
||||||
if this.Name != nil {
|
|
||||||
s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.Package != nil {
|
|
||||||
s = append(s, "Package: "+valueToGoStringDescriptor(this.Package, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.Dependency != nil {
|
|
||||||
s = append(s, "Dependency: "+fmt.Sprintf("%#v", this.Dependency)+",\n")
|
|
||||||
}
|
|
||||||
if this.PublicDependency != nil {
|
|
||||||
s = append(s, "PublicDependency: "+fmt.Sprintf("%#v", this.PublicDependency)+",\n")
|
|
||||||
}
|
|
||||||
if this.WeakDependency != nil {
|
|
||||||
s = append(s, "WeakDependency: "+fmt.Sprintf("%#v", this.WeakDependency)+",\n")
|
|
||||||
}
|
|
||||||
if this.MessageType != nil {
|
|
||||||
s = append(s, "MessageType: "+fmt.Sprintf("%#v", this.MessageType)+",\n")
|
|
||||||
}
|
|
||||||
if this.EnumType != nil {
|
|
||||||
s = append(s, "EnumType: "+fmt.Sprintf("%#v", this.EnumType)+",\n")
|
|
||||||
}
|
|
||||||
if this.Service != nil {
|
|
||||||
s = append(s, "Service: "+fmt.Sprintf("%#v", this.Service)+",\n")
|
|
||||||
}
|
|
||||||
if this.Extension != nil {
|
|
||||||
s = append(s, "Extension: "+fmt.Sprintf("%#v", this.Extension)+",\n")
|
|
||||||
}
|
|
||||||
if this.Options != nil {
|
|
||||||
s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n")
|
|
||||||
}
|
|
||||||
if this.SourceCodeInfo != nil {
|
|
||||||
s = append(s, "SourceCodeInfo: "+fmt.Sprintf("%#v", this.SourceCodeInfo)+",\n")
|
|
||||||
}
|
|
||||||
if this.Syntax != nil {
|
|
||||||
s = append(s, "Syntax: "+valueToGoStringDescriptor(this.Syntax, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *DescriptorProto) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 14)
|
|
||||||
s = append(s, "&descriptor.DescriptorProto{")
|
|
||||||
if this.Name != nil {
|
|
||||||
s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.Field != nil {
|
|
||||||
s = append(s, "Field: "+fmt.Sprintf("%#v", this.Field)+",\n")
|
|
||||||
}
|
|
||||||
if this.Extension != nil {
|
|
||||||
s = append(s, "Extension: "+fmt.Sprintf("%#v", this.Extension)+",\n")
|
|
||||||
}
|
|
||||||
if this.NestedType != nil {
|
|
||||||
s = append(s, "NestedType: "+fmt.Sprintf("%#v", this.NestedType)+",\n")
|
|
||||||
}
|
|
||||||
if this.EnumType != nil {
|
|
||||||
s = append(s, "EnumType: "+fmt.Sprintf("%#v", this.EnumType)+",\n")
|
|
||||||
}
|
|
||||||
if this.ExtensionRange != nil {
|
|
||||||
s = append(s, "ExtensionRange: "+fmt.Sprintf("%#v", this.ExtensionRange)+",\n")
|
|
||||||
}
|
|
||||||
if this.OneofDecl != nil {
|
|
||||||
s = append(s, "OneofDecl: "+fmt.Sprintf("%#v", this.OneofDecl)+",\n")
|
|
||||||
}
|
|
||||||
if this.Options != nil {
|
|
||||||
s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n")
|
|
||||||
}
|
|
||||||
if this.ReservedRange != nil {
|
|
||||||
s = append(s, "ReservedRange: "+fmt.Sprintf("%#v", this.ReservedRange)+",\n")
|
|
||||||
}
|
|
||||||
if this.ReservedName != nil {
|
|
||||||
s = append(s, "ReservedName: "+fmt.Sprintf("%#v", this.ReservedName)+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *DescriptorProto_ExtensionRange) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 7)
|
|
||||||
s = append(s, "&descriptor.DescriptorProto_ExtensionRange{")
|
|
||||||
if this.Start != nil {
|
|
||||||
s = append(s, "Start: "+valueToGoStringDescriptor(this.Start, "int32")+",\n")
|
|
||||||
}
|
|
||||||
if this.End != nil {
|
|
||||||
s = append(s, "End: "+valueToGoStringDescriptor(this.End, "int32")+",\n")
|
|
||||||
}
|
|
||||||
if this.Options != nil {
|
|
||||||
s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *DescriptorProto_ReservedRange) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 6)
|
|
||||||
s = append(s, "&descriptor.DescriptorProto_ReservedRange{")
|
|
||||||
if this.Start != nil {
|
|
||||||
s = append(s, "Start: "+valueToGoStringDescriptor(this.Start, "int32")+",\n")
|
|
||||||
}
|
|
||||||
if this.End != nil {
|
|
||||||
s = append(s, "End: "+valueToGoStringDescriptor(this.End, "int32")+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *ExtensionRangeOptions) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 5)
|
|
||||||
s = append(s, "&descriptor.ExtensionRangeOptions{")
|
|
||||||
if this.UninterpretedOption != nil {
|
|
||||||
s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n")
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *FieldDescriptorProto) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 14)
|
|
||||||
s = append(s, "&descriptor.FieldDescriptorProto{")
|
|
||||||
if this.Name != nil {
|
|
||||||
s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.Number != nil {
|
|
||||||
s = append(s, "Number: "+valueToGoStringDescriptor(this.Number, "int32")+",\n")
|
|
||||||
}
|
|
||||||
if this.Label != nil {
|
|
||||||
s = append(s, "Label: "+valueToGoStringDescriptor(this.Label, "FieldDescriptorProto_Label")+",\n")
|
|
||||||
}
|
|
||||||
if this.Type != nil {
|
|
||||||
s = append(s, "Type: "+valueToGoStringDescriptor(this.Type, "FieldDescriptorProto_Type")+",\n")
|
|
||||||
}
|
|
||||||
if this.TypeName != nil {
|
|
||||||
s = append(s, "TypeName: "+valueToGoStringDescriptor(this.TypeName, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.Extendee != nil {
|
|
||||||
s = append(s, "Extendee: "+valueToGoStringDescriptor(this.Extendee, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.DefaultValue != nil {
|
|
||||||
s = append(s, "DefaultValue: "+valueToGoStringDescriptor(this.DefaultValue, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.OneofIndex != nil {
|
|
||||||
s = append(s, "OneofIndex: "+valueToGoStringDescriptor(this.OneofIndex, "int32")+",\n")
|
|
||||||
}
|
|
||||||
if this.JsonName != nil {
|
|
||||||
s = append(s, "JsonName: "+valueToGoStringDescriptor(this.JsonName, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.Options != nil {
|
|
||||||
s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *OneofDescriptorProto) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 6)
|
|
||||||
s = append(s, "&descriptor.OneofDescriptorProto{")
|
|
||||||
if this.Name != nil {
|
|
||||||
s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.Options != nil {
|
|
||||||
s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *EnumDescriptorProto) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 9)
|
|
||||||
s = append(s, "&descriptor.EnumDescriptorProto{")
|
|
||||||
if this.Name != nil {
|
|
||||||
s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.Value != nil {
|
|
||||||
s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n")
|
|
||||||
}
|
|
||||||
if this.Options != nil {
|
|
||||||
s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n")
|
|
||||||
}
|
|
||||||
if this.ReservedRange != nil {
|
|
||||||
s = append(s, "ReservedRange: "+fmt.Sprintf("%#v", this.ReservedRange)+",\n")
|
|
||||||
}
|
|
||||||
if this.ReservedName != nil {
|
|
||||||
s = append(s, "ReservedName: "+fmt.Sprintf("%#v", this.ReservedName)+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *EnumDescriptorProto_EnumReservedRange) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 6)
|
|
||||||
s = append(s, "&descriptor.EnumDescriptorProto_EnumReservedRange{")
|
|
||||||
if this.Start != nil {
|
|
||||||
s = append(s, "Start: "+valueToGoStringDescriptor(this.Start, "int32")+",\n")
|
|
||||||
}
|
|
||||||
if this.End != nil {
|
|
||||||
s = append(s, "End: "+valueToGoStringDescriptor(this.End, "int32")+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *EnumValueDescriptorProto) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 7)
|
|
||||||
s = append(s, "&descriptor.EnumValueDescriptorProto{")
|
|
||||||
if this.Name != nil {
|
|
||||||
s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.Number != nil {
|
|
||||||
s = append(s, "Number: "+valueToGoStringDescriptor(this.Number, "int32")+",\n")
|
|
||||||
}
|
|
||||||
if this.Options != nil {
|
|
||||||
s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *ServiceDescriptorProto) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 7)
|
|
||||||
s = append(s, "&descriptor.ServiceDescriptorProto{")
|
|
||||||
if this.Name != nil {
|
|
||||||
s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.Method != nil {
|
|
||||||
s = append(s, "Method: "+fmt.Sprintf("%#v", this.Method)+",\n")
|
|
||||||
}
|
|
||||||
if this.Options != nil {
|
|
||||||
s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *MethodDescriptorProto) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 10)
|
|
||||||
s = append(s, "&descriptor.MethodDescriptorProto{")
|
|
||||||
if this.Name != nil {
|
|
||||||
s = append(s, "Name: "+valueToGoStringDescriptor(this.Name, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.InputType != nil {
|
|
||||||
s = append(s, "InputType: "+valueToGoStringDescriptor(this.InputType, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.OutputType != nil {
|
|
||||||
s = append(s, "OutputType: "+valueToGoStringDescriptor(this.OutputType, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.Options != nil {
|
|
||||||
s = append(s, "Options: "+fmt.Sprintf("%#v", this.Options)+",\n")
|
|
||||||
}
|
|
||||||
if this.ClientStreaming != nil {
|
|
||||||
s = append(s, "ClientStreaming: "+valueToGoStringDescriptor(this.ClientStreaming, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.ServerStreaming != nil {
|
|
||||||
s = append(s, "ServerStreaming: "+valueToGoStringDescriptor(this.ServerStreaming, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *FileOptions) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 23)
|
|
||||||
s = append(s, "&descriptor.FileOptions{")
|
|
||||||
if this.JavaPackage != nil {
|
|
||||||
s = append(s, "JavaPackage: "+valueToGoStringDescriptor(this.JavaPackage, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.JavaOuterClassname != nil {
|
|
||||||
s = append(s, "JavaOuterClassname: "+valueToGoStringDescriptor(this.JavaOuterClassname, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.JavaMultipleFiles != nil {
|
|
||||||
s = append(s, "JavaMultipleFiles: "+valueToGoStringDescriptor(this.JavaMultipleFiles, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.JavaGenerateEqualsAndHash != nil {
|
|
||||||
s = append(s, "JavaGenerateEqualsAndHash: "+valueToGoStringDescriptor(this.JavaGenerateEqualsAndHash, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.JavaStringCheckUtf8 != nil {
|
|
||||||
s = append(s, "JavaStringCheckUtf8: "+valueToGoStringDescriptor(this.JavaStringCheckUtf8, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.OptimizeFor != nil {
|
|
||||||
s = append(s, "OptimizeFor: "+valueToGoStringDescriptor(this.OptimizeFor, "FileOptions_OptimizeMode")+",\n")
|
|
||||||
}
|
|
||||||
if this.GoPackage != nil {
|
|
||||||
s = append(s, "GoPackage: "+valueToGoStringDescriptor(this.GoPackage, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.CcGenericServices != nil {
|
|
||||||
s = append(s, "CcGenericServices: "+valueToGoStringDescriptor(this.CcGenericServices, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.JavaGenericServices != nil {
|
|
||||||
s = append(s, "JavaGenericServices: "+valueToGoStringDescriptor(this.JavaGenericServices, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.PyGenericServices != nil {
|
|
||||||
s = append(s, "PyGenericServices: "+valueToGoStringDescriptor(this.PyGenericServices, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.PhpGenericServices != nil {
|
|
||||||
s = append(s, "PhpGenericServices: "+valueToGoStringDescriptor(this.PhpGenericServices, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.Deprecated != nil {
|
|
||||||
s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.CcEnableArenas != nil {
|
|
||||||
s = append(s, "CcEnableArenas: "+valueToGoStringDescriptor(this.CcEnableArenas, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.ObjcClassPrefix != nil {
|
|
||||||
s = append(s, "ObjcClassPrefix: "+valueToGoStringDescriptor(this.ObjcClassPrefix, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.CsharpNamespace != nil {
|
|
||||||
s = append(s, "CsharpNamespace: "+valueToGoStringDescriptor(this.CsharpNamespace, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.SwiftPrefix != nil {
|
|
||||||
s = append(s, "SwiftPrefix: "+valueToGoStringDescriptor(this.SwiftPrefix, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.PhpClassPrefix != nil {
|
|
||||||
s = append(s, "PhpClassPrefix: "+valueToGoStringDescriptor(this.PhpClassPrefix, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.PhpNamespace != nil {
|
|
||||||
s = append(s, "PhpNamespace: "+valueToGoStringDescriptor(this.PhpNamespace, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.UninterpretedOption != nil {
|
|
||||||
s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n")
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *MessageOptions) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 9)
|
|
||||||
s = append(s, "&descriptor.MessageOptions{")
|
|
||||||
if this.MessageSetWireFormat != nil {
|
|
||||||
s = append(s, "MessageSetWireFormat: "+valueToGoStringDescriptor(this.MessageSetWireFormat, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.NoStandardDescriptorAccessor != nil {
|
|
||||||
s = append(s, "NoStandardDescriptorAccessor: "+valueToGoStringDescriptor(this.NoStandardDescriptorAccessor, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.Deprecated != nil {
|
|
||||||
s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.MapEntry != nil {
|
|
||||||
s = append(s, "MapEntry: "+valueToGoStringDescriptor(this.MapEntry, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.UninterpretedOption != nil {
|
|
||||||
s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n")
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *FieldOptions) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 11)
|
|
||||||
s = append(s, "&descriptor.FieldOptions{")
|
|
||||||
if this.Ctype != nil {
|
|
||||||
s = append(s, "Ctype: "+valueToGoStringDescriptor(this.Ctype, "FieldOptions_CType")+",\n")
|
|
||||||
}
|
|
||||||
if this.Packed != nil {
|
|
||||||
s = append(s, "Packed: "+valueToGoStringDescriptor(this.Packed, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.Jstype != nil {
|
|
||||||
s = append(s, "Jstype: "+valueToGoStringDescriptor(this.Jstype, "FieldOptions_JSType")+",\n")
|
|
||||||
}
|
|
||||||
if this.Lazy != nil {
|
|
||||||
s = append(s, "Lazy: "+valueToGoStringDescriptor(this.Lazy, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.Deprecated != nil {
|
|
||||||
s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.Weak != nil {
|
|
||||||
s = append(s, "Weak: "+valueToGoStringDescriptor(this.Weak, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.UninterpretedOption != nil {
|
|
||||||
s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n")
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *OneofOptions) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 5)
|
|
||||||
s = append(s, "&descriptor.OneofOptions{")
|
|
||||||
if this.UninterpretedOption != nil {
|
|
||||||
s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n")
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *EnumOptions) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 7)
|
|
||||||
s = append(s, "&descriptor.EnumOptions{")
|
|
||||||
if this.AllowAlias != nil {
|
|
||||||
s = append(s, "AllowAlias: "+valueToGoStringDescriptor(this.AllowAlias, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.Deprecated != nil {
|
|
||||||
s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.UninterpretedOption != nil {
|
|
||||||
s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n")
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *EnumValueOptions) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 6)
|
|
||||||
s = append(s, "&descriptor.EnumValueOptions{")
|
|
||||||
if this.Deprecated != nil {
|
|
||||||
s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.UninterpretedOption != nil {
|
|
||||||
s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n")
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *ServiceOptions) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 6)
|
|
||||||
s = append(s, "&descriptor.ServiceOptions{")
|
|
||||||
if this.Deprecated != nil {
|
|
||||||
s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.UninterpretedOption != nil {
|
|
||||||
s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n")
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *MethodOptions) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 7)
|
|
||||||
s = append(s, "&descriptor.MethodOptions{")
|
|
||||||
if this.Deprecated != nil {
|
|
||||||
s = append(s, "Deprecated: "+valueToGoStringDescriptor(this.Deprecated, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.IdempotencyLevel != nil {
|
|
||||||
s = append(s, "IdempotencyLevel: "+valueToGoStringDescriptor(this.IdempotencyLevel, "MethodOptions_IdempotencyLevel")+",\n")
|
|
||||||
}
|
|
||||||
if this.UninterpretedOption != nil {
|
|
||||||
s = append(s, "UninterpretedOption: "+fmt.Sprintf("%#v", this.UninterpretedOption)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "XXX_InternalExtensions: "+extensionToGoStringDescriptor(this)+",\n")
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *UninterpretedOption) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 11)
|
|
||||||
s = append(s, "&descriptor.UninterpretedOption{")
|
|
||||||
if this.Name != nil {
|
|
||||||
s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n")
|
|
||||||
}
|
|
||||||
if this.IdentifierValue != nil {
|
|
||||||
s = append(s, "IdentifierValue: "+valueToGoStringDescriptor(this.IdentifierValue, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.PositiveIntValue != nil {
|
|
||||||
s = append(s, "PositiveIntValue: "+valueToGoStringDescriptor(this.PositiveIntValue, "uint64")+",\n")
|
|
||||||
}
|
|
||||||
if this.NegativeIntValue != nil {
|
|
||||||
s = append(s, "NegativeIntValue: "+valueToGoStringDescriptor(this.NegativeIntValue, "int64")+",\n")
|
|
||||||
}
|
|
||||||
if this.DoubleValue != nil {
|
|
||||||
s = append(s, "DoubleValue: "+valueToGoStringDescriptor(this.DoubleValue, "float64")+",\n")
|
|
||||||
}
|
|
||||||
if this.StringValue != nil {
|
|
||||||
s = append(s, "StringValue: "+valueToGoStringDescriptor(this.StringValue, "byte")+",\n")
|
|
||||||
}
|
|
||||||
if this.AggregateValue != nil {
|
|
||||||
s = append(s, "AggregateValue: "+valueToGoStringDescriptor(this.AggregateValue, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *UninterpretedOption_NamePart) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 6)
|
|
||||||
s = append(s, "&descriptor.UninterpretedOption_NamePart{")
|
|
||||||
if this.NamePart != nil {
|
|
||||||
s = append(s, "NamePart: "+valueToGoStringDescriptor(this.NamePart, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.IsExtension != nil {
|
|
||||||
s = append(s, "IsExtension: "+valueToGoStringDescriptor(this.IsExtension, "bool")+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *SourceCodeInfo) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 5)
|
|
||||||
s = append(s, "&descriptor.SourceCodeInfo{")
|
|
||||||
if this.Location != nil {
|
|
||||||
s = append(s, "Location: "+fmt.Sprintf("%#v", this.Location)+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *SourceCodeInfo_Location) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 9)
|
|
||||||
s = append(s, "&descriptor.SourceCodeInfo_Location{")
|
|
||||||
if this.Path != nil {
|
|
||||||
s = append(s, "Path: "+fmt.Sprintf("%#v", this.Path)+",\n")
|
|
||||||
}
|
|
||||||
if this.Span != nil {
|
|
||||||
s = append(s, "Span: "+fmt.Sprintf("%#v", this.Span)+",\n")
|
|
||||||
}
|
|
||||||
if this.LeadingComments != nil {
|
|
||||||
s = append(s, "LeadingComments: "+valueToGoStringDescriptor(this.LeadingComments, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.TrailingComments != nil {
|
|
||||||
s = append(s, "TrailingComments: "+valueToGoStringDescriptor(this.TrailingComments, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.LeadingDetachedComments != nil {
|
|
||||||
s = append(s, "LeadingDetachedComments: "+fmt.Sprintf("%#v", this.LeadingDetachedComments)+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *GeneratedCodeInfo) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 5)
|
|
||||||
s = append(s, "&descriptor.GeneratedCodeInfo{")
|
|
||||||
if this.Annotation != nil {
|
|
||||||
s = append(s, "Annotation: "+fmt.Sprintf("%#v", this.Annotation)+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func (this *GeneratedCodeInfo_Annotation) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 8)
|
|
||||||
s = append(s, "&descriptor.GeneratedCodeInfo_Annotation{")
|
|
||||||
if this.Path != nil {
|
|
||||||
s = append(s, "Path: "+fmt.Sprintf("%#v", this.Path)+",\n")
|
|
||||||
}
|
|
||||||
if this.SourceFile != nil {
|
|
||||||
s = append(s, "SourceFile: "+valueToGoStringDescriptor(this.SourceFile, "string")+",\n")
|
|
||||||
}
|
|
||||||
if this.Begin != nil {
|
|
||||||
s = append(s, "Begin: "+valueToGoStringDescriptor(this.Begin, "int32")+",\n")
|
|
||||||
}
|
|
||||||
if this.End != nil {
|
|
||||||
s = append(s, "End: "+valueToGoStringDescriptor(this.End, "int32")+",\n")
|
|
||||||
}
|
|
||||||
if this.XXX_unrecognized != nil {
|
|
||||||
s = append(s, "XXX_unrecognized:"+fmt.Sprintf("%#v", this.XXX_unrecognized)+",\n")
|
|
||||||
}
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func valueToGoStringDescriptor(v interface{}, typ string) string {
|
|
||||||
rv := reflect.ValueOf(v)
|
|
||||||
if rv.IsNil() {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
pv := reflect.Indirect(rv).Interface()
|
|
||||||
return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
|
|
||||||
}
|
|
||||||
func extensionToGoStringDescriptor(m proto.Message) string {
|
|
||||||
e := proto.GetUnsafeExtensionsMap(m)
|
|
||||||
if e == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := "proto.NewUnsafeXXX_InternalExtensions(map[int32]proto.Extension{"
|
|
||||||
keys := make([]int, 0, len(e))
|
|
||||||
for k := range e {
|
|
||||||
keys = append(keys, int(k))
|
|
||||||
}
|
|
||||||
sort.Ints(keys)
|
|
||||||
ss := []string{}
|
|
||||||
for _, k := range keys {
|
|
||||||
ss = append(ss, strconv.Itoa(k)+": "+e[int32(k)].GoString())
|
|
||||||
}
|
|
||||||
s += strings.Join(ss, ",") + "})"
|
|
||||||
return s
|
|
||||||
}
|
|
31
vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_test.go
generated
vendored
31
vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/descriptor_test.go
generated
vendored
@ -1,31 +0,0 @@
|
|||||||
package descriptor_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
tpb "github.com/gogo/protobuf/proto/testdata"
|
|
||||||
"github.com/gogo/protobuf/protoc-gen-gogo/descriptor"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestMessage(t *testing.T) {
|
|
||||||
var msg *descriptor.DescriptorProto
|
|
||||||
fd, md := descriptor.ForMessage(msg)
|
|
||||||
if pkg, want := fd.GetPackage(), "google.protobuf"; pkg != want {
|
|
||||||
t.Errorf("descriptor.ForMessage(%T).GetPackage() = %q; want %q", msg, pkg, want)
|
|
||||||
}
|
|
||||||
if name, want := md.GetName(), "DescriptorProto"; name != want {
|
|
||||||
t.Fatalf("descriptor.ForMessage(%T).GetName() = %q; want %q", msg, name, want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Example_Options() {
|
|
||||||
var msg *tpb.MyMessageSet
|
|
||||||
_, md := descriptor.ForMessage(msg)
|
|
||||||
if md.GetOptions().GetMessageSetWireFormat() {
|
|
||||||
fmt.Printf("%v uses option message_set_wire_format.\n", md.GetName())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Output:
|
|
||||||
// MyMessageSet uses option message_set_wire_format.
|
|
||||||
}
|
|
390
vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/helper.go
generated
vendored
390
vendor/github.com/gogo/protobuf/protoc-gen-gogo/descriptor/helper.go
generated
vendored
@ -1,390 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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 descriptor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (msg *DescriptorProto) GetMapFields() (*FieldDescriptorProto, *FieldDescriptorProto) {
|
|
||||||
if !msg.GetOptions().GetMapEntry() {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
return msg.GetField()[0], msg.GetField()[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
func dotToUnderscore(r rune) rune {
|
|
||||||
if r == '.' {
|
|
||||||
return '_'
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
func (field *FieldDescriptorProto) WireType() (wire int) {
|
|
||||||
switch *field.Type {
|
|
||||||
case FieldDescriptorProto_TYPE_DOUBLE:
|
|
||||||
return 1
|
|
||||||
case FieldDescriptorProto_TYPE_FLOAT:
|
|
||||||
return 5
|
|
||||||
case FieldDescriptorProto_TYPE_INT64:
|
|
||||||
return 0
|
|
||||||
case FieldDescriptorProto_TYPE_UINT64:
|
|
||||||
return 0
|
|
||||||
case FieldDescriptorProto_TYPE_INT32:
|
|
||||||
return 0
|
|
||||||
case FieldDescriptorProto_TYPE_UINT32:
|
|
||||||
return 0
|
|
||||||
case FieldDescriptorProto_TYPE_FIXED64:
|
|
||||||
return 1
|
|
||||||
case FieldDescriptorProto_TYPE_FIXED32:
|
|
||||||
return 5
|
|
||||||
case FieldDescriptorProto_TYPE_BOOL:
|
|
||||||
return 0
|
|
||||||
case FieldDescriptorProto_TYPE_STRING:
|
|
||||||
return 2
|
|
||||||
case FieldDescriptorProto_TYPE_GROUP:
|
|
||||||
return 2
|
|
||||||
case FieldDescriptorProto_TYPE_MESSAGE:
|
|
||||||
return 2
|
|
||||||
case FieldDescriptorProto_TYPE_BYTES:
|
|
||||||
return 2
|
|
||||||
case FieldDescriptorProto_TYPE_ENUM:
|
|
||||||
return 0
|
|
||||||
case FieldDescriptorProto_TYPE_SFIXED32:
|
|
||||||
return 5
|
|
||||||
case FieldDescriptorProto_TYPE_SFIXED64:
|
|
||||||
return 1
|
|
||||||
case FieldDescriptorProto_TYPE_SINT32:
|
|
||||||
return 0
|
|
||||||
case FieldDescriptorProto_TYPE_SINT64:
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
panic("unreachable")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (field *FieldDescriptorProto) GetKeyUint64() (x uint64) {
|
|
||||||
packed := field.IsPacked()
|
|
||||||
wireType := field.WireType()
|
|
||||||
fieldNumber := field.GetNumber()
|
|
||||||
if packed {
|
|
||||||
wireType = 2
|
|
||||||
}
|
|
||||||
x = uint64(uint32(fieldNumber)<<3 | uint32(wireType))
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
func (field *FieldDescriptorProto) GetKey3Uint64() (x uint64) {
|
|
||||||
packed := field.IsPacked3()
|
|
||||||
wireType := field.WireType()
|
|
||||||
fieldNumber := field.GetNumber()
|
|
||||||
if packed {
|
|
||||||
wireType = 2
|
|
||||||
}
|
|
||||||
x = uint64(uint32(fieldNumber)<<3 | uint32(wireType))
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
func (field *FieldDescriptorProto) GetKey() []byte {
|
|
||||||
x := field.GetKeyUint64()
|
|
||||||
i := 0
|
|
||||||
keybuf := make([]byte, 0)
|
|
||||||
for i = 0; x > 127; i++ {
|
|
||||||
keybuf = append(keybuf, 0x80|uint8(x&0x7F))
|
|
||||||
x >>= 7
|
|
||||||
}
|
|
||||||
keybuf = append(keybuf, uint8(x))
|
|
||||||
return keybuf
|
|
||||||
}
|
|
||||||
|
|
||||||
func (field *FieldDescriptorProto) GetKey3() []byte {
|
|
||||||
x := field.GetKey3Uint64()
|
|
||||||
i := 0
|
|
||||||
keybuf := make([]byte, 0)
|
|
||||||
for i = 0; x > 127; i++ {
|
|
||||||
keybuf = append(keybuf, 0x80|uint8(x&0x7F))
|
|
||||||
x >>= 7
|
|
||||||
}
|
|
||||||
keybuf = append(keybuf, uint8(x))
|
|
||||||
return keybuf
|
|
||||||
}
|
|
||||||
|
|
||||||
func (desc *FileDescriptorSet) GetField(packageName, messageName, fieldName string) *FieldDescriptorProto {
|
|
||||||
msg := desc.GetMessage(packageName, messageName)
|
|
||||||
if msg == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
for _, field := range msg.GetField() {
|
|
||||||
if field.GetName() == fieldName {
|
|
||||||
return field
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (file *FileDescriptorProto) GetMessage(typeName string) *DescriptorProto {
|
|
||||||
for _, msg := range file.GetMessageType() {
|
|
||||||
if msg.GetName() == typeName {
|
|
||||||
return msg
|
|
||||||
}
|
|
||||||
nes := file.GetNestedMessage(msg, strings.TrimPrefix(typeName, msg.GetName()+"."))
|
|
||||||
if nes != nil {
|
|
||||||
return nes
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (file *FileDescriptorProto) GetNestedMessage(msg *DescriptorProto, typeName string) *DescriptorProto {
|
|
||||||
for _, nes := range msg.GetNestedType() {
|
|
||||||
if nes.GetName() == typeName {
|
|
||||||
return nes
|
|
||||||
}
|
|
||||||
res := file.GetNestedMessage(nes, strings.TrimPrefix(typeName, nes.GetName()+"."))
|
|
||||||
if res != nil {
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (desc *FileDescriptorSet) GetMessage(packageName string, typeName string) *DescriptorProto {
|
|
||||||
for _, file := range desc.GetFile() {
|
|
||||||
if strings.Map(dotToUnderscore, file.GetPackage()) != strings.Map(dotToUnderscore, packageName) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for _, msg := range file.GetMessageType() {
|
|
||||||
if msg.GetName() == typeName {
|
|
||||||
return msg
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, msg := range file.GetMessageType() {
|
|
||||||
for _, nes := range msg.GetNestedType() {
|
|
||||||
if nes.GetName() == typeName {
|
|
||||||
return nes
|
|
||||||
}
|
|
||||||
if msg.GetName()+"."+nes.GetName() == typeName {
|
|
||||||
return nes
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (desc *FileDescriptorSet) IsProto3(packageName string, typeName string) bool {
|
|
||||||
for _, file := range desc.GetFile() {
|
|
||||||
if strings.Map(dotToUnderscore, file.GetPackage()) != strings.Map(dotToUnderscore, packageName) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for _, msg := range file.GetMessageType() {
|
|
||||||
if msg.GetName() == typeName {
|
|
||||||
return file.GetSyntax() == "proto3"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, msg := range file.GetMessageType() {
|
|
||||||
for _, nes := range msg.GetNestedType() {
|
|
||||||
if nes.GetName() == typeName {
|
|
||||||
return file.GetSyntax() == "proto3"
|
|
||||||
}
|
|
||||||
if msg.GetName()+"."+nes.GetName() == typeName {
|
|
||||||
return file.GetSyntax() == "proto3"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (msg *DescriptorProto) IsExtendable() bool {
|
|
||||||
return len(msg.GetExtensionRange()) > 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (desc *FileDescriptorSet) FindExtension(packageName string, typeName string, fieldName string) (extPackageName string, field *FieldDescriptorProto) {
|
|
||||||
parent := desc.GetMessage(packageName, typeName)
|
|
||||||
if parent == nil {
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
if !parent.IsExtendable() {
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
extendee := "." + packageName + "." + typeName
|
|
||||||
for _, file := range desc.GetFile() {
|
|
||||||
for _, ext := range file.GetExtension() {
|
|
||||||
if strings.Map(dotToUnderscore, file.GetPackage()) == strings.Map(dotToUnderscore, packageName) {
|
|
||||||
if !(ext.GetExtendee() == typeName || ext.GetExtendee() == extendee) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ext.GetExtendee() != extendee {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ext.GetName() == fieldName {
|
|
||||||
return file.GetPackage(), ext
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (desc *FileDescriptorSet) FindExtensionByFieldNumber(packageName string, typeName string, fieldNum int32) (extPackageName string, field *FieldDescriptorProto) {
|
|
||||||
parent := desc.GetMessage(packageName, typeName)
|
|
||||||
if parent == nil {
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
if !parent.IsExtendable() {
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
extendee := "." + packageName + "." + typeName
|
|
||||||
for _, file := range desc.GetFile() {
|
|
||||||
for _, ext := range file.GetExtension() {
|
|
||||||
if strings.Map(dotToUnderscore, file.GetPackage()) == strings.Map(dotToUnderscore, packageName) {
|
|
||||||
if !(ext.GetExtendee() == typeName || ext.GetExtendee() == extendee) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ext.GetExtendee() != extendee {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ext.GetNumber() == fieldNum {
|
|
||||||
return file.GetPackage(), ext
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (desc *FileDescriptorSet) FindMessage(packageName string, typeName string, fieldName string) (msgPackageName string, msgName string) {
|
|
||||||
parent := desc.GetMessage(packageName, typeName)
|
|
||||||
if parent == nil {
|
|
||||||
return "", ""
|
|
||||||
}
|
|
||||||
field := parent.GetFieldDescriptor(fieldName)
|
|
||||||
if field == nil {
|
|
||||||
var extPackageName string
|
|
||||||
extPackageName, field = desc.FindExtension(packageName, typeName, fieldName)
|
|
||||||
if field == nil {
|
|
||||||
return "", ""
|
|
||||||
}
|
|
||||||
packageName = extPackageName
|
|
||||||
}
|
|
||||||
typeNames := strings.Split(field.GetTypeName(), ".")
|
|
||||||
if len(typeNames) == 1 {
|
|
||||||
msg := desc.GetMessage(packageName, typeName)
|
|
||||||
if msg == nil {
|
|
||||||
return "", ""
|
|
||||||
}
|
|
||||||
return packageName, msg.GetName()
|
|
||||||
}
|
|
||||||
if len(typeNames) > 2 {
|
|
||||||
for i := 1; i < len(typeNames)-1; i++ {
|
|
||||||
packageName = strings.Join(typeNames[1:len(typeNames)-i], ".")
|
|
||||||
typeName = strings.Join(typeNames[len(typeNames)-i:], ".")
|
|
||||||
msg := desc.GetMessage(packageName, typeName)
|
|
||||||
if msg != nil {
|
|
||||||
typeNames := strings.Split(msg.GetName(), ".")
|
|
||||||
if len(typeNames) == 1 {
|
|
||||||
return packageName, msg.GetName()
|
|
||||||
}
|
|
||||||
return strings.Join(typeNames[1:len(typeNames)-1], "."), typeNames[len(typeNames)-1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "", ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (msg *DescriptorProto) GetFieldDescriptor(fieldName string) *FieldDescriptorProto {
|
|
||||||
for _, field := range msg.GetField() {
|
|
||||||
if field.GetName() == fieldName {
|
|
||||||
return field
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (desc *FileDescriptorSet) GetEnum(packageName string, typeName string) *EnumDescriptorProto {
|
|
||||||
for _, file := range desc.GetFile() {
|
|
||||||
if strings.Map(dotToUnderscore, file.GetPackage()) != strings.Map(dotToUnderscore, packageName) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for _, enum := range file.GetEnumType() {
|
|
||||||
if enum.GetName() == typeName {
|
|
||||||
return enum
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *FieldDescriptorProto) IsEnum() bool {
|
|
||||||
return *f.Type == FieldDescriptorProto_TYPE_ENUM
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *FieldDescriptorProto) IsMessage() bool {
|
|
||||||
return *f.Type == FieldDescriptorProto_TYPE_MESSAGE
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *FieldDescriptorProto) IsBytes() bool {
|
|
||||||
return *f.Type == FieldDescriptorProto_TYPE_BYTES
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *FieldDescriptorProto) IsRepeated() bool {
|
|
||||||
return f.Label != nil && *f.Label == FieldDescriptorProto_LABEL_REPEATED
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *FieldDescriptorProto) IsString() bool {
|
|
||||||
return *f.Type == FieldDescriptorProto_TYPE_STRING
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *FieldDescriptorProto) IsBool() bool {
|
|
||||||
return *f.Type == FieldDescriptorProto_TYPE_BOOL
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *FieldDescriptorProto) IsRequired() bool {
|
|
||||||
return f.Label != nil && *f.Label == FieldDescriptorProto_LABEL_REQUIRED
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *FieldDescriptorProto) IsPacked() bool {
|
|
||||||
return f.Options != nil && f.GetOptions().GetPacked()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *FieldDescriptorProto) IsPacked3() bool {
|
|
||||||
if f.IsRepeated() && f.IsScalar() {
|
|
||||||
if f.Options == nil || f.GetOptions().Packed == nil {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return f.Options != nil && f.GetOptions().GetPacked()
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *DescriptorProto) HasExtension() bool {
|
|
||||||
return len(m.ExtensionRange) > 0
|
|
||||||
}
|
|
64
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/Makefile
generated
vendored
64
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/Makefile
generated
vendored
@ -1,64 +0,0 @@
|
|||||||
# 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
|
|
||||||
|
|
||||||
test: regenerate testbuild
|
|
||||||
|
|
||||||
#test: regenerate testbuild extension_test
|
|
||||||
# ./extension_test
|
|
||||||
# @echo PASS
|
|
||||||
|
|
||||||
regenerate:
|
|
||||||
go install github.com/gogo/protobuf/protoc-min-version
|
|
||||||
protoc-min-version --version="3.0.0" --gogo_out=Mmulti/multi1.proto=github.com/gogo/protobuf/protoc-gen-gogo/testdata/multi:. ./my_test/test.proto
|
|
||||||
|
|
||||||
nuke: clean
|
|
||||||
|
|
||||||
testbuild: buildprotos
|
|
||||||
go test
|
|
||||||
|
|
||||||
buildprotos:
|
|
||||||
# Invoke protoc once to generate three independent .pb.go files in the same package.
|
|
||||||
protoc --gogo_out=. multi/multi1.proto multi/multi2.proto multi/multi3.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
|
|
210
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/extension_test.go
generated
vendored
210
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/extension_test.go
generated
vendored
@ -1,210 +0,0 @@
|
|||||||
// 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/gogo/protobuf/protoc-gen-gogo/testdata/extension_user.proto
generated
vendored
100
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/extension_user.proto
generated
vendored
@ -1,100 +0,0 @@
|
|||||||
// 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;
|
|
||||||
}
|
|
113
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/imp.pb.go.golden
generated
vendored
113
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/imp.pb.go.golden
generated
vendored
@ -1,113 +0,0 @@
|
|||||||
// 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/gogo/protobuf/protoc-gen-gogo/testdata/imp.proto
generated
vendored
70
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/imp.proto
generated
vendored
@ -1,70 +0,0 @@
|
|||||||
// 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;
|
|
||||||
}
|
|
1
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/multi/.gitignore
generated
vendored
1
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/multi/.gitignore
generated
vendored
@ -1 +0,0 @@
|
|||||||
*.pb.go
|
|
953
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/my_test/test.pb.go
generated
vendored
953
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/my_test/test.pb.go
generated
vendored
@ -1,953 +0,0 @@
|
|||||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
|
||||||
// source: my_test/test.proto
|
|
||||||
|
|
||||||
/*
|
|
||||||
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/gogo/protobuf/proto"
|
|
||||||
import fmt "fmt"
|
|
||||||
import math "math"
|
|
||||||
import _ "github.com/gogo/protobuf/protoc-gen-gogo/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.GoGoProtoPackageIsVersion2 // 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
|
|
||||||
}
|
|
||||||
func (HatType) EnumDescriptor() ([]byte, []int) { return fileDescriptorTest, []int{0} }
|
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
||||||
func (Days) EnumDescriptor() ([]byte, []int) { return fileDescriptorTest, []int{1} }
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
func (Request_Color) EnumDescriptor() ([]byte, []int) { return fileDescriptorTest, []int{0, 0} }
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
func (Reply_Entry_Game) EnumDescriptor() ([]byte, []int) { return fileDescriptorTest, []int{1, 0, 0} }
|
|
||||||
|
|
||||||
// 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() {}
|
|
||||||
func (*Request) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{0} }
|
|
||||||
|
|
||||||
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 (*Request_SomeGroup) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{0, 0} }
|
|
||||||
|
|
||||||
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() {}
|
|
||||||
func (*Reply) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{1} }
|
|
||||||
|
|
||||||
var extRange_Reply = []proto.ExtensionRange{
|
|
||||||
{Start: 100, End: 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() {}
|
|
||||||
func (*Reply_Entry) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{1, 0} }
|
|
||||||
|
|
||||||
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() {}
|
|
||||||
func (*OtherBase) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{2} }
|
|
||||||
|
|
||||||
var extRange_OtherBase = []proto.ExtensionRange{
|
|
||||||
{Start: 100, End: 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() {}
|
|
||||||
func (*ReplyExtensions) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{3} }
|
|
||||||
|
|
||||||
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",
|
|
||||||
Filename: "my_test/test.proto",
|
|
||||||
}
|
|
||||||
|
|
||||||
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",
|
|
||||||
Filename: "my_test/test.proto",
|
|
||||||
}
|
|
||||||
|
|
||||||
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",
|
|
||||||
Filename: "my_test/test.proto",
|
|
||||||
}
|
|
||||||
|
|
||||||
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 (*OtherReplyExtensions) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{4} }
|
|
||||||
|
|
||||||
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 (*OldReply) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{5} }
|
|
||||||
|
|
||||||
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{
|
|
||||||
{Start: 100, End: 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() {}
|
|
||||||
func (*Communique) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{6} }
|
|
||||||
|
|
||||||
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 (*Communique_SomeGroup) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{6, 0} }
|
|
||||||
|
|
||||||
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() {}
|
|
||||||
func (*Communique_Delta) Descriptor() ([]byte, []int) { return fileDescriptorTest, []int{6, 1} }
|
|
||||||
|
|
||||||
var E_Tag = &proto.ExtensionDesc{
|
|
||||||
ExtendedType: (*Reply)(nil),
|
|
||||||
ExtensionType: (*string)(nil),
|
|
||||||
Field: 103,
|
|
||||||
Name: "my.test.tag",
|
|
||||||
Tag: "bytes,103,opt,name=tag",
|
|
||||||
Filename: "my_test/test.proto",
|
|
||||||
}
|
|
||||||
|
|
||||||
var E_Donut = &proto.ExtensionDesc{
|
|
||||||
ExtendedType: (*Reply)(nil),
|
|
||||||
ExtensionType: (*OtherReplyExtensions)(nil),
|
|
||||||
Field: 106,
|
|
||||||
Name: "my.test.donut",
|
|
||||||
Tag: "bytes,106,opt,name=donut",
|
|
||||||
Filename: "my_test/test.proto",
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() { proto.RegisterFile("my_test/test.proto", fileDescriptorTest) }
|
|
||||||
|
|
||||||
var fileDescriptorTest = []byte{
|
|
||||||
// 988 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xdd, 0x6e, 0xe3, 0x44,
|
|
||||||
0x14, 0xce, 0xd8, 0x71, 0x7e, 0x4e, 0xb2, 0xad, 0x19, 0x55, 0xad, 0x15, 0xb4, 0x5b, 0x13, 0x28,
|
|
||||||
0x32, 0x15, 0xca, 0x6a, 0x0d, 0x12, 0xab, 0x48, 0x20, 0x9a, 0x9f, 0x36, 0xd5, 0x36, 0x89, 0x34,
|
|
||||||
0x6d, 0x2f, 0xe0, 0xc6, 0x9a, 0x8d, 0xa7, 0x8e, 0x69, 0xc6, 0xce, 0xda, 0x63, 0x84, 0xef, 0xfa,
|
|
||||||
0x14, 0xf0, 0x1a, 0xdc, 0xf3, 0x42, 0xbc, 0x45, 0xd1, 0x8c, 0x43, 0x92, 0x36, 0xab, 0xbd, 0xb1,
|
|
||||||
0x7c, 0xbe, 0xf9, 0xce, 0xe7, 0x39, 0x3f, 0xfe, 0x00, 0xf3, 0xdc, 0x13, 0x2c, 0x15, 0xaf, 0xe5,
|
|
||||||
0xa3, 0xb3, 0x4c, 0x62, 0x11, 0xe3, 0x2a, 0xcf, 0x3b, 0x32, 0x6c, 0x61, 0x9e, 0x2d, 0x44, 0xf8,
|
|
||||||
0x5a, 0x3d, 0xdf, 0x14, 0x87, 0xed, 0x7f, 0xcb, 0x50, 0x25, 0xec, 0x43, 0xc6, 0x52, 0x81, 0x4d,
|
|
||||||
0xd0, 0xef, 0x59, 0x6e, 0x21, 0x5b, 0x77, 0x74, 0x22, 0x5f, 0xb1, 0x03, 0xfa, 0x3c, 0x63, 0x96,
|
|
||||||
0x6e, 0x23, 0x67, 0xcf, 0x3d, 0xec, 0xac, 0x84, 0x3a, 0xab, 0x84, 0x4e, 0x3f, 0x5e, 0xc4, 0x09,
|
|
||||||
0x91, 0x14, 0x7c, 0x0a, 0xfa, 0x9c, 0x0a, 0xab, 0xac, 0x98, 0xe6, 0x9a, 0x39, 0xa2, 0xe2, 0x26,
|
|
||||||
0x5f, 0xb2, 0x6e, 0xe5, 0x7c, 0x38, 0x98, 0x92, 0x33, 0x22, 0x49, 0xf8, 0x18, 0x6a, 0x3e, 0xa3,
|
|
||||||
0xfe, 0x22, 0x8c, 0x98, 0x55, 0xb5, 0x91, 0xa3, 0x75, 0xf5, 0x30, 0xba, 0x23, 0x6b, 0x10, 0xbf,
|
|
||||||
0x85, 0x7a, 0x1a, 0x73, 0x16, 0x24, 0x71, 0xb6, 0xb4, 0x6a, 0x36, 0x72, 0xc0, 0x6d, 0xed, 0x7c,
|
|
||||||
0xfc, 0x3a, 0xe6, 0xec, 0x42, 0x32, 0xc8, 0x86, 0x8c, 0x07, 0xd0, 0x8c, 0x28, 0x67, 0x1e, 0xa7,
|
|
||||||
0xcb, 0x65, 0x18, 0x05, 0xd6, 0x9e, 0xad, 0x3b, 0x0d, 0xf7, 0x8b, 0x9d, 0xe4, 0x09, 0xe5, 0x6c,
|
|
||||||
0x5c, 0x70, 0x86, 0x91, 0x48, 0x72, 0xd2, 0x88, 0x36, 0x08, 0x3e, 0x83, 0x06, 0x4f, 0x83, 0xb5,
|
|
||||||
0xc8, 0xbe, 0x12, 0xb1, 0x77, 0x44, 0xc6, 0x69, 0xf0, 0x44, 0x03, 0xf8, 0x1a, 0xc0, 0x07, 0x60,
|
|
||||||
0x24, 0x2c, 0x65, 0xc2, 0x6a, 0xda, 0xc8, 0x31, 0x48, 0x11, 0xe0, 0x23, 0xa8, 0x06, 0x4c, 0x78,
|
|
||||||
0xb2, 0xcb, 0xa6, 0x8d, 0x9c, 0x3a, 0xa9, 0x04, 0x4c, 0xbc, 0x63, 0x79, 0xeb, 0x5b, 0xa8, 0xaf,
|
|
||||||
0xeb, 0xc1, 0xc7, 0xd0, 0x50, 0xd5, 0x78, 0x77, 0x21, 0x5b, 0xf8, 0x56, 0x5d, 0x29, 0x80, 0x82,
|
|
||||||
0xce, 0x25, 0xd2, 0xfa, 0x09, 0xcc, 0xe7, 0x05, 0x6c, 0x86, 0x27, 0xc9, 0x6a, 0x78, 0x07, 0x60,
|
|
||||||
0xfc, 0x4e, 0x17, 0x19, 0xb3, 0x34, 0xf5, 0xa9, 0x22, 0xe8, 0x6a, 0x6f, 0x51, 0x6b, 0x0c, 0xfb,
|
|
||||||
0xcf, 0xee, 0xbe, 0x9d, 0x8e, 0x8b, 0xf4, 0xaf, 0xb6, 0xd3, 0x1b, 0xee, 0xde, 0x56, 0xf9, 0xcb,
|
|
||||||
0x45, 0xbe, 0x25, 0xd7, 0x3e, 0x01, 0x43, 0x6d, 0x02, 0xae, 0x82, 0x4e, 0x86, 0x03, 0xb3, 0x84,
|
|
||||||
0xeb, 0x60, 0x5c, 0x90, 0xe1, 0x70, 0x62, 0x22, 0x5c, 0x83, 0x72, 0xef, 0xea, 0x76, 0x68, 0x6a,
|
|
||||||
0xed, 0xbf, 0x34, 0x30, 0x54, 0x2e, 0x3e, 0x05, 0xe3, 0x2e, 0xce, 0x22, 0x5f, 0xad, 0x5a, 0xc3,
|
|
||||||
0x3d, 0x78, 0x2a, 0xdd, 0x29, 0xba, 0x59, 0x50, 0xf0, 0x09, 0x34, 0x67, 0x31, 0x5f, 0xd2, 0x99,
|
|
||||||
0x6a, 0x5b, 0x6a, 0x69, 0xb6, 0xee, 0x18, 0x3d, 0xcd, 0x44, 0xa4, 0xb1, 0xc2, 0xdf, 0xb1, 0x3c,
|
|
||||||
0x6d, 0xfd, 0x8d, 0xc0, 0x28, 0x2a, 0x19, 0xc0, 0xf1, 0x3d, 0xcb, 0x3d, 0x31, 0xa7, 0xc2, 0x8b,
|
|
||||||
0x18, 0xf3, 0x53, 0xef, 0x8d, 0xfb, 0xdd, 0xf7, 0x33, 0xca, 0xd9, 0xc2, 0xeb, 0xd3, 0xf4, 0x32,
|
|
||||||
0x0a, 0x2c, 0x64, 0x6b, 0x8e, 0x4e, 0x3e, 0xbf, 0x67, 0xf9, 0xcd, 0x9c, 0x8a, 0x89, 0x24, 0xad,
|
|
||||||
0x39, 0x05, 0x05, 0x1f, 0x6d, 0x57, 0xaf, 0x77, 0xd1, 0x0f, 0xab, 0x82, 0xf1, 0xd7, 0x60, 0x7a,
|
|
||||||
0x3c, 0x2f, 0x46, 0xe3, 0xa9, 0x5d, 0x73, 0xd5, 0xff, 0xa1, 0x93, 0xe6, 0x38, 0x57, 0xe3, 0x91,
|
|
||||||
0xa3, 0x71, 0xdb, 0x36, 0x94, 0x2f, 0x28, 0x67, 0xb8, 0x09, 0xb5, 0xf3, 0xe9, 0xf4, 0xa6, 0x77,
|
|
||||||
0x76, 0x75, 0x65, 0x22, 0x0c, 0x50, 0xb9, 0x19, 0x4e, 0x26, 0x97, 0xd7, 0xa6, 0x76, 0x5a, 0xab,
|
|
||||||
0xf9, 0xe6, 0xc3, 0xc3, 0xc3, 0x83, 0xd6, 0xfe, 0x06, 0xea, 0x53, 0x31, 0x67, 0x49, 0x8f, 0xa6,
|
|
||||||
0x0c, 0x63, 0x28, 0x4b, 0x59, 0x35, 0x8a, 0x3a, 0x51, 0xef, 0x5b, 0xd4, 0x7f, 0x10, 0xec, 0xab,
|
|
||||||
0x2e, 0x0d, 0xff, 0x10, 0x2c, 0x4a, 0xc3, 0x38, 0x4a, 0xdd, 0x36, 0x94, 0x45, 0xc8, 0x19, 0x7e,
|
|
||||||
0x36, 0x22, 0x8b, 0xd9, 0xc8, 0x41, 0x44, 0x9d, 0xb9, 0x3f, 0x43, 0x65, 0x46, 0x93, 0x24, 0x16,
|
|
||||||
0x3b, 0xac, 0x50, 0x8d, 0xd7, 0x7a, 0x8a, 0x6e, 0xd4, 0xc9, 0x2a, 0xcf, 0xed, 0x81, 0xe1, 0xc7,
|
|
||||||
0x51, 0x26, 0x30, 0x5e, 0x53, 0xd7, 0x97, 0x56, 0x9f, 0xfa, 0x94, 0x48, 0x91, 0xda, 0x76, 0xe0,
|
|
||||||
0x40, 0xe5, 0x3c, 0x3b, 0xde, 0x5d, 0xde, 0xb6, 0x05, 0xb5, 0xe9, 0xc2, 0x57, 0x3c, 0x55, 0xfd,
|
|
||||||
0xe3, 0xe3, 0xe3, 0x63, 0xb5, 0xab, 0xd5, 0x50, 0xfb, 0x4f, 0x1d, 0xa0, 0x1f, 0x73, 0x9e, 0x45,
|
|
||||||
0xe1, 0x87, 0x8c, 0xe1, 0x57, 0xd0, 0xe0, 0xf4, 0x9e, 0x79, 0x9c, 0x79, 0xb3, 0xa4, 0x90, 0xa8,
|
|
||||||
0x91, 0xba, 0x84, 0xc6, 0xac, 0x9f, 0xe4, 0xd8, 0x82, 0x4a, 0x94, 0xf1, 0xf7, 0x2c, 0xb1, 0x0c,
|
|
||||||
0xa9, 0x3e, 0x2a, 0x91, 0x55, 0x8c, 0x0f, 0x56, 0x8d, 0xae, 0xc8, 0x46, 0x8f, 0x4a, 0x45, 0xab,
|
|
||||||
0x25, 0xea, 0x53, 0x41, 0x95, 0x31, 0x35, 0x25, 0x2a, 0x23, 0x7c, 0x04, 0x15, 0xc1, 0xf8, 0xd2,
|
|
||||||
0x9b, 0x29, 0x3b, 0x42, 0xa3, 0x12, 0x31, 0x64, 0xdc, 0x97, 0xf2, 0x73, 0x16, 0x06, 0x73, 0xa1,
|
|
||||||
0x7e, 0x53, 0x4d, 0xca, 0x17, 0x31, 0x3e, 0x01, 0x43, 0xc4, 0x3e, 0xcd, 0x2d, 0x50, 0x9e, 0xf8,
|
|
||||||
0x62, 0xdd, 0x9b, 0x01, 0xcd, 0x53, 0x25, 0x20, 0x4f, 0xf1, 0x21, 0x18, 0x9c, 0xe6, 0xef, 0x99,
|
|
||||||
0xd5, 0x90, 0x37, 0x97, 0xb8, 0x0a, 0x25, 0xee, 0xb3, 0x85, 0xa0, 0xca, 0x40, 0x3e, 0x93, 0xb8,
|
|
||||||
0x0a, 0x71, 0x1b, 0x74, 0x9e, 0x06, 0xd6, 0x8b, 0x8f, 0xfd, 0x94, 0xa3, 0x12, 0x91, 0x87, 0xf8,
|
|
||||||
0xc7, 0x6d, 0xff, 0xdc, 0x53, 0xfe, 0xf9, 0x72, 0xcd, 0xdc, 0xf4, 0x6e, 0x63, 0xa1, 0xa3, 0xd2,
|
|
||||||
0x96, 0x89, 0xb6, 0xbe, 0xdc, 0x36, 0xa3, 0x43, 0xa8, 0x70, 0xa6, 0xfa, 0xb7, 0x5f, 0x38, 0x56,
|
|
||||||
0x11, 0xb5, 0xaa, 0x60, 0x0c, 0xe4, 0x85, 0x7a, 0x55, 0x30, 0xb2, 0x28, 0x8c, 0xa3, 0xd3, 0x57,
|
|
||||||
0x50, 0x5d, 0xd9, 0xbd, 0x5c, 0xf3, 0xc2, 0xf0, 0x4d, 0x24, 0x4d, 0xe1, 0x7c, 0xf8, 0xab, 0xa9,
|
|
||||||
0x9d, 0x76, 0xa0, 0x2c, 0x4b, 0x97, 0x87, 0xe3, 0xe9, 0x64, 0x70, 0xf6, 0x8b, 0x89, 0x70, 0x03,
|
|
||||||
0xaa, 0x37, 0xb7, 0xc3, 0x6b, 0x19, 0x68, 0xd2, 0x35, 0xae, 0x6e, 0x27, 0x83, 0x4b, 0x13, 0xb5,
|
|
||||||
0x34, 0x13, 0x75, 0x6d, 0xd0, 0x05, 0x0d, 0x76, 0xf6, 0x35, 0x50, 0xd7, 0x90, 0x47, 0xdd, 0xfe,
|
|
||||||
0xff, 0x2b, 0xf9, 0x9c, 0xf3, 0x9b, 0xea, 0xce, 0xcb, 0xa7, 0x8b, 0xfa, 0xf1, 0x9d, 0xfc, 0x2f,
|
|
||||||
0x00, 0x00, 0xff, 0xff, 0x43, 0x23, 0x7b, 0xca, 0x33, 0x07, 0x00, 0x00,
|
|
||||||
}
|
|
156
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/my_test/test.proto
generated
vendored
156
vendor/github.com/gogo/protobuf/protoc-gen-gogo/testdata/my_test/test.proto
generated
vendored
@ -1,156 +0,0 @@
|
|||||||
// 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 {}
|
|
||||||
}
|
|
||||||
|
|
101
vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go
generated
vendored
101
vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go
generated
vendored
@ -1,101 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2013, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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 sortkeys
|
|
||||||
|
|
||||||
import (
|
|
||||||
"sort"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Strings(l []string) {
|
|
||||||
sort.Strings(l)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Float64s(l []float64) {
|
|
||||||
sort.Float64s(l)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Float32s(l []float32) {
|
|
||||||
sort.Sort(Float32Slice(l))
|
|
||||||
}
|
|
||||||
|
|
||||||
func Int64s(l []int64) {
|
|
||||||
sort.Sort(Int64Slice(l))
|
|
||||||
}
|
|
||||||
|
|
||||||
func Int32s(l []int32) {
|
|
||||||
sort.Sort(Int32Slice(l))
|
|
||||||
}
|
|
||||||
|
|
||||||
func Uint64s(l []uint64) {
|
|
||||||
sort.Sort(Uint64Slice(l))
|
|
||||||
}
|
|
||||||
|
|
||||||
func Uint32s(l []uint32) {
|
|
||||||
sort.Sort(Uint32Slice(l))
|
|
||||||
}
|
|
||||||
|
|
||||||
func Bools(l []bool) {
|
|
||||||
sort.Sort(BoolSlice(l))
|
|
||||||
}
|
|
||||||
|
|
||||||
type BoolSlice []bool
|
|
||||||
|
|
||||||
func (p BoolSlice) Len() int { return len(p) }
|
|
||||||
func (p BoolSlice) Less(i, j int) bool { return p[j] }
|
|
||||||
func (p BoolSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
||||||
|
|
||||||
type Int64Slice []int64
|
|
||||||
|
|
||||||
func (p Int64Slice) Len() int { return len(p) }
|
|
||||||
func (p Int64Slice) Less(i, j int) bool { return p[i] < p[j] }
|
|
||||||
func (p Int64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
||||||
|
|
||||||
type Int32Slice []int32
|
|
||||||
|
|
||||||
func (p Int32Slice) Len() int { return len(p) }
|
|
||||||
func (p Int32Slice) Less(i, j int) bool { return p[i] < p[j] }
|
|
||||||
func (p Int32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
||||||
|
|
||||||
type Uint64Slice []uint64
|
|
||||||
|
|
||||||
func (p Uint64Slice) Len() int { return len(p) }
|
|
||||||
func (p Uint64Slice) Less(i, j int) bool { return p[i] < p[j] }
|
|
||||||
func (p Uint64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
||||||
|
|
||||||
type Uint32Slice []uint32
|
|
||||||
|
|
||||||
func (p Uint32Slice) Len() int { return len(p) }
|
|
||||||
func (p Uint32Slice) Less(i, j int) bool { return p[i] < p[j] }
|
|
||||||
func (p Uint32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
||||||
|
|
||||||
type Float32Slice []float32
|
|
||||||
|
|
||||||
func (p Float32Slice) Len() int { return len(p) }
|
|
||||||
func (p Float32Slice) Less(i, j int) bool { return p[i] < p[j] }
|
|
||||||
func (p Float32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
39
vendor/github.com/gogo/protobuf/types/Makefile
generated
vendored
39
vendor/github.com/gogo/protobuf/types/Makefile
generated
vendored
@ -1,39 +0,0 @@
|
|||||||
# Protocol Buffers for Go with Gadgets
|
|
||||||
#
|
|
||||||
# Copyright (c) 2016, The GoGo Authors. All rights reserved.
|
|
||||||
# http://github.com/gogo/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.
|
|
||||||
#
|
|
||||||
# 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:
|
|
||||||
go install github.com/gogo/protobuf/protoc-gen-gogotypes
|
|
||||||
go install github.com/gogo/protobuf/protoc-min-version
|
|
||||||
|
|
||||||
protoc-min-version --version="3.0.0" --gogotypes_out=. -I=../protobuf/google/protobuf ../protobuf/google/protobuf/any.proto
|
|
||||||
protoc-min-version --version="3.0.0" --gogotypes_out=. -I=../protobuf/google/protobuf ../protobuf/google/protobuf/empty.proto
|
|
||||||
protoc-min-version --version="3.0.0" --gogotypes_out=. -I=../protobuf/google/protobuf ../protobuf/google/protobuf/timestamp.proto
|
|
||||||
protoc-min-version --version="3.0.0" --gogotypes_out=. -I=../protobuf/google/protobuf ../protobuf/google/protobuf/duration.proto
|
|
||||||
protoc-min-version --version="3.0.0" --gogotypes_out=. -I=../protobuf/google/protobuf ../protobuf/google/protobuf/struct.proto
|
|
||||||
protoc-min-version --version="3.0.0" --gogotypes_out=. -I=../protobuf/google/protobuf ../protobuf/google/protobuf/wrappers.proto
|
|
||||||
protoc-min-version --version="3.0.0" --gogotypes_out=. -I=../protobuf/google/protobuf ../protobuf/google/protobuf/field_mask.proto
|
|
138
vendor/github.com/gogo/protobuf/types/any.go
generated
vendored
138
vendor/github.com/gogo/protobuf/types/any.go
generated
vendored
@ -1,138 +0,0 @@
|
|||||||
// 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 types
|
|
||||||
|
|
||||||
// This file implements functions to marshal proto.Message to/from
|
|
||||||
// google.protobuf.Any message.
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/gogo/protobuf/proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
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) (string, error) {
|
|
||||||
if any == nil {
|
|
||||||
return "", fmt.Errorf("message is nil")
|
|
||||||
}
|
|
||||||
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, error) {
|
|
||||||
value, err := proto.Marshal(pb)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &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 EmptyAny(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, pb proto.Message) error {
|
|
||||||
if d, ok := pb.(*DynamicAny); ok {
|
|
||||||
if d.Message == nil {
|
|
||||||
var err error
|
|
||||||
d.Message, err = EmptyAny(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, pb proto.Message) bool {
|
|
||||||
aname, err := AnyMessageName(any)
|
|
||||||
if err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return aname == proto.MessageName(pb)
|
|
||||||
}
|
|
651
vendor/github.com/gogo/protobuf/types/any.pb.go
generated
vendored
651
vendor/github.com/gogo/protobuf/types/any.pb.go
generated
vendored
@ -1,651 +0,0 @@
|
|||||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
|
||||||
// source: any.proto
|
|
||||||
|
|
||||||
/*
|
|
||||||
Package types is a generated protocol buffer package.
|
|
||||||
|
|
||||||
It is generated from these files:
|
|
||||||
any.proto
|
|
||||||
|
|
||||||
It has these top-level messages:
|
|
||||||
Any
|
|
||||||
*/
|
|
||||||
package types
|
|
||||||
|
|
||||||
import proto "github.com/gogo/protobuf/proto"
|
|
||||||
import fmt "fmt"
|
|
||||||
import math "math"
|
|
||||||
|
|
||||||
import bytes "bytes"
|
|
||||||
|
|
||||||
import strings "strings"
|
|
||||||
import reflect "reflect"
|
|
||||||
|
|
||||||
import io "io"
|
|
||||||
|
|
||||||
// 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.GoGoProtoPackageIsVersion2 // 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)
|
|
||||||
// ...
|
|
||||||
//
|
|
||||||
// Example 4: Pack and unpack a message in Go
|
|
||||||
//
|
|
||||||
// foo := &pb.Foo{...}
|
|
||||||
// any, err := ptypes.MarshalAny(foo)
|
|
||||||
// ...
|
|
||||||
// foo := &pb.Foo{}
|
|
||||||
// if err := ptypes.UnmarshalAny(any, foo); err != nil {
|
|
||||||
// ...
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// 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,proto3" 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 (*Any) ProtoMessage() {}
|
|
||||||
func (*Any) Descriptor() ([]byte, []int) { return fileDescriptorAny, []int{0} }
|
|
||||||
func (*Any) XXX_WellKnownType() string { return "Any" }
|
|
||||||
|
|
||||||
func (m *Any) GetTypeUrl() string {
|
|
||||||
if m != nil {
|
|
||||||
return m.TypeUrl
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Any) GetValue() []byte {
|
|
||||||
if m != nil {
|
|
||||||
return m.Value
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterType((*Any)(nil), "google.protobuf.Any")
|
|
||||||
}
|
|
||||||
func (this *Any) Compare(that interface{}) int {
|
|
||||||
if that == nil {
|
|
||||||
if this == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
that1, ok := that.(*Any)
|
|
||||||
if !ok {
|
|
||||||
that2, ok := that.(Any)
|
|
||||||
if ok {
|
|
||||||
that1 = &that2
|
|
||||||
} else {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if that1 == nil {
|
|
||||||
if this == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
} else if this == nil {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
if this.TypeUrl != that1.TypeUrl {
|
|
||||||
if this.TypeUrl < that1.TypeUrl {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
if c := bytes.Compare(this.Value, that1.Value); c != 0 {
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
func (this *Any) Equal(that interface{}) bool {
|
|
||||||
if that == nil {
|
|
||||||
return this == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
that1, ok := that.(*Any)
|
|
||||||
if !ok {
|
|
||||||
that2, ok := that.(Any)
|
|
||||||
if ok {
|
|
||||||
that1 = &that2
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if that1 == nil {
|
|
||||||
return this == nil
|
|
||||||
} else if this == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if this.TypeUrl != that1.TypeUrl {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if !bytes.Equal(this.Value, that1.Value) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
func (this *Any) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 6)
|
|
||||||
s = append(s, "&types.Any{")
|
|
||||||
s = append(s, "TypeUrl: "+fmt.Sprintf("%#v", this.TypeUrl)+",\n")
|
|
||||||
s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n")
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func valueToGoStringAny(v interface{}, typ string) string {
|
|
||||||
rv := reflect.ValueOf(v)
|
|
||||||
if rv.IsNil() {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
pv := reflect.Indirect(rv).Interface()
|
|
||||||
return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
|
|
||||||
}
|
|
||||||
func (m *Any) Marshal() (dAtA []byte, err error) {
|
|
||||||
size := m.Size()
|
|
||||||
dAtA = make([]byte, size)
|
|
||||||
n, err := m.MarshalTo(dAtA)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return dAtA[:n], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Any) MarshalTo(dAtA []byte) (int, error) {
|
|
||||||
var i int
|
|
||||||
_ = i
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
if len(m.TypeUrl) > 0 {
|
|
||||||
dAtA[i] = 0xa
|
|
||||||
i++
|
|
||||||
i = encodeVarintAny(dAtA, i, uint64(len(m.TypeUrl)))
|
|
||||||
i += copy(dAtA[i:], m.TypeUrl)
|
|
||||||
}
|
|
||||||
if len(m.Value) > 0 {
|
|
||||||
dAtA[i] = 0x12
|
|
||||||
i++
|
|
||||||
i = encodeVarintAny(dAtA, i, uint64(len(m.Value)))
|
|
||||||
i += copy(dAtA[i:], m.Value)
|
|
||||||
}
|
|
||||||
return i, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func encodeVarintAny(dAtA []byte, offset int, v uint64) int {
|
|
||||||
for v >= 1<<7 {
|
|
||||||
dAtA[offset] = uint8(v&0x7f | 0x80)
|
|
||||||
v >>= 7
|
|
||||||
offset++
|
|
||||||
}
|
|
||||||
dAtA[offset] = uint8(v)
|
|
||||||
return offset + 1
|
|
||||||
}
|
|
||||||
func NewPopulatedAny(r randyAny, easy bool) *Any {
|
|
||||||
this := &Any{}
|
|
||||||
this.TypeUrl = string(randStringAny(r))
|
|
||||||
v1 := r.Intn(100)
|
|
||||||
this.Value = make([]byte, v1)
|
|
||||||
for i := 0; i < v1; i++ {
|
|
||||||
this.Value[i] = byte(r.Intn(256))
|
|
||||||
}
|
|
||||||
if !easy && r.Intn(10) != 0 {
|
|
||||||
}
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
type randyAny interface {
|
|
||||||
Float32() float32
|
|
||||||
Float64() float64
|
|
||||||
Int63() int64
|
|
||||||
Int31() int32
|
|
||||||
Uint32() uint32
|
|
||||||
Intn(n int) int
|
|
||||||
}
|
|
||||||
|
|
||||||
func randUTF8RuneAny(r randyAny) rune {
|
|
||||||
ru := r.Intn(62)
|
|
||||||
if ru < 10 {
|
|
||||||
return rune(ru + 48)
|
|
||||||
} else if ru < 36 {
|
|
||||||
return rune(ru + 55)
|
|
||||||
}
|
|
||||||
return rune(ru + 61)
|
|
||||||
}
|
|
||||||
func randStringAny(r randyAny) string {
|
|
||||||
v2 := r.Intn(100)
|
|
||||||
tmps := make([]rune, v2)
|
|
||||||
for i := 0; i < v2; i++ {
|
|
||||||
tmps[i] = randUTF8RuneAny(r)
|
|
||||||
}
|
|
||||||
return string(tmps)
|
|
||||||
}
|
|
||||||
func randUnrecognizedAny(r randyAny, maxFieldNumber int) (dAtA []byte) {
|
|
||||||
l := r.Intn(5)
|
|
||||||
for i := 0; i < l; i++ {
|
|
||||||
wire := r.Intn(4)
|
|
||||||
if wire == 3 {
|
|
||||||
wire = 5
|
|
||||||
}
|
|
||||||
fieldNumber := maxFieldNumber + r.Intn(100)
|
|
||||||
dAtA = randFieldAny(dAtA, r, fieldNumber, wire)
|
|
||||||
}
|
|
||||||
return dAtA
|
|
||||||
}
|
|
||||||
func randFieldAny(dAtA []byte, r randyAny, fieldNumber int, wire int) []byte {
|
|
||||||
key := uint32(fieldNumber)<<3 | uint32(wire)
|
|
||||||
switch wire {
|
|
||||||
case 0:
|
|
||||||
dAtA = encodeVarintPopulateAny(dAtA, uint64(key))
|
|
||||||
v3 := r.Int63()
|
|
||||||
if r.Intn(2) == 0 {
|
|
||||||
v3 *= -1
|
|
||||||
}
|
|
||||||
dAtA = encodeVarintPopulateAny(dAtA, uint64(v3))
|
|
||||||
case 1:
|
|
||||||
dAtA = encodeVarintPopulateAny(dAtA, uint64(key))
|
|
||||||
dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
|
|
||||||
case 2:
|
|
||||||
dAtA = encodeVarintPopulateAny(dAtA, uint64(key))
|
|
||||||
ll := r.Intn(100)
|
|
||||||
dAtA = encodeVarintPopulateAny(dAtA, uint64(ll))
|
|
||||||
for j := 0; j < ll; j++ {
|
|
||||||
dAtA = append(dAtA, byte(r.Intn(256)))
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
dAtA = encodeVarintPopulateAny(dAtA, uint64(key))
|
|
||||||
dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
|
|
||||||
}
|
|
||||||
return dAtA
|
|
||||||
}
|
|
||||||
func encodeVarintPopulateAny(dAtA []byte, v uint64) []byte {
|
|
||||||
for v >= 1<<7 {
|
|
||||||
dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80))
|
|
||||||
v >>= 7
|
|
||||||
}
|
|
||||||
dAtA = append(dAtA, uint8(v))
|
|
||||||
return dAtA
|
|
||||||
}
|
|
||||||
func (m *Any) Size() (n int) {
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
l = len(m.TypeUrl)
|
|
||||||
if l > 0 {
|
|
||||||
n += 1 + l + sovAny(uint64(l))
|
|
||||||
}
|
|
||||||
l = len(m.Value)
|
|
||||||
if l > 0 {
|
|
||||||
n += 1 + l + sovAny(uint64(l))
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func sovAny(x uint64) (n int) {
|
|
||||||
for {
|
|
||||||
n++
|
|
||||||
x >>= 7
|
|
||||||
if x == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
func sozAny(x uint64) (n int) {
|
|
||||||
return sovAny(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
|
||||||
}
|
|
||||||
func (this *Any) String() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := strings.Join([]string{`&Any{`,
|
|
||||||
`TypeUrl:` + fmt.Sprintf("%v", this.TypeUrl) + `,`,
|
|
||||||
`Value:` + fmt.Sprintf("%v", this.Value) + `,`,
|
|
||||||
`}`,
|
|
||||||
}, "")
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
func valueToStringAny(v interface{}) string {
|
|
||||||
rv := reflect.ValueOf(v)
|
|
||||||
if rv.IsNil() {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
pv := reflect.Indirect(rv).Interface()
|
|
||||||
return fmt.Sprintf("*%v", pv)
|
|
||||||
}
|
|
||||||
func (m *Any) Unmarshal(dAtA []byte) error {
|
|
||||||
l := len(dAtA)
|
|
||||||
iNdEx := 0
|
|
||||||
for iNdEx < l {
|
|
||||||
preIndex := iNdEx
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowAny
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fieldNum := int32(wire >> 3)
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
if wireType == 4 {
|
|
||||||
return fmt.Errorf("proto: Any: wiretype end group for non-group")
|
|
||||||
}
|
|
||||||
if fieldNum <= 0 {
|
|
||||||
return fmt.Errorf("proto: Any: illegal tag %d (wire type %d)", fieldNum, wire)
|
|
||||||
}
|
|
||||||
switch fieldNum {
|
|
||||||
case 1:
|
|
||||||
if wireType != 2 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field TypeUrl", wireType)
|
|
||||||
}
|
|
||||||
var stringLen uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowAny
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
stringLen |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
intStringLen := int(stringLen)
|
|
||||||
if intStringLen < 0 {
|
|
||||||
return ErrInvalidLengthAny
|
|
||||||
}
|
|
||||||
postIndex := iNdEx + intStringLen
|
|
||||||
if postIndex > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
m.TypeUrl = string(dAtA[iNdEx:postIndex])
|
|
||||||
iNdEx = postIndex
|
|
||||||
case 2:
|
|
||||||
if wireType != 2 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
|
|
||||||
}
|
|
||||||
var byteLen int
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowAny
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
byteLen |= (int(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if byteLen < 0 {
|
|
||||||
return ErrInvalidLengthAny
|
|
||||||
}
|
|
||||||
postIndex := iNdEx + byteLen
|
|
||||||
if postIndex > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...)
|
|
||||||
if m.Value == nil {
|
|
||||||
m.Value = []byte{}
|
|
||||||
}
|
|
||||||
iNdEx = postIndex
|
|
||||||
default:
|
|
||||||
iNdEx = preIndex
|
|
||||||
skippy, err := skipAny(dAtA[iNdEx:])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if skippy < 0 {
|
|
||||||
return ErrInvalidLengthAny
|
|
||||||
}
|
|
||||||
if (iNdEx + skippy) > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
iNdEx += skippy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if iNdEx > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
func skipAny(dAtA []byte) (n int, err error) {
|
|
||||||
l := len(dAtA)
|
|
||||||
iNdEx := 0
|
|
||||||
for iNdEx < l {
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowAny
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
switch wireType {
|
|
||||||
case 0:
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowAny
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
iNdEx++
|
|
||||||
if dAtA[iNdEx-1] < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 1:
|
|
||||||
iNdEx += 8
|
|
||||||
return iNdEx, nil
|
|
||||||
case 2:
|
|
||||||
var length int
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowAny
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
length |= (int(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
iNdEx += length
|
|
||||||
if length < 0 {
|
|
||||||
return 0, ErrInvalidLengthAny
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 3:
|
|
||||||
for {
|
|
||||||
var innerWire uint64
|
|
||||||
var start int = iNdEx
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowAny
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
innerWire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
innerWireType := int(innerWire & 0x7)
|
|
||||||
if innerWireType == 4 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
next, err := skipAny(dAtA[start:])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
iNdEx = start + next
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 4:
|
|
||||||
return iNdEx, nil
|
|
||||||
case 5:
|
|
||||||
iNdEx += 4
|
|
||||||
return iNdEx, nil
|
|
||||||
default:
|
|
||||||
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
panic("unreachable")
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrInvalidLengthAny = fmt.Errorf("proto: negative length found during unmarshaling")
|
|
||||||
ErrIntOverflowAny = fmt.Errorf("proto: integer overflow")
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() { proto.RegisterFile("any.proto", fileDescriptorAny) }
|
|
||||||
|
|
||||||
var fileDescriptorAny = []byte{
|
|
||||||
// 204 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4c, 0xcc, 0xab, 0xd4,
|
|
||||||
0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x4f, 0xcf, 0xcf, 0x4f, 0xcf, 0x49, 0x85, 0xf0, 0x92,
|
|
||||||
0x4a, 0xd3, 0x94, 0xcc, 0xb8, 0x98, 0x1d, 0xf3, 0x2a, 0x85, 0x24, 0xb9, 0x38, 0x4a, 0x2a, 0x0b,
|
|
||||||
0x52, 0xe3, 0x4b, 0x8b, 0x72, 0x24, 0x18, 0x15, 0x18, 0x35, 0x38, 0x83, 0xd8, 0x41, 0xfc, 0xd0,
|
|
||||||
0xa2, 0x1c, 0x21, 0x11, 0x2e, 0xd6, 0xb2, 0xc4, 0x9c, 0xd2, 0x54, 0x09, 0x26, 0x05, 0x46, 0x0d,
|
|
||||||
0x9e, 0x20, 0x08, 0xc7, 0xa9, 0xfe, 0xc2, 0x43, 0x39, 0x86, 0x1b, 0x0f, 0xe5, 0x18, 0x3e, 0x3c,
|
|
||||||
0x94, 0x63, 0xfc, 0xf1, 0x50, 0x8e, 0xb1, 0xe1, 0x91, 0x1c, 0xe3, 0x8a, 0x47, 0x72, 0x8c, 0x27,
|
|
||||||
0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x8b, 0x47, 0x72, 0x0c,
|
|
||||||
0x1f, 0x40, 0xe2, 0x8f, 0xe5, 0x18, 0xb9, 0x84, 0x93, 0xf3, 0x73, 0xf5, 0xd0, 0xac, 0x77, 0xe2,
|
|
||||||
0x70, 0xcc, 0xab, 0x0c, 0x00, 0x71, 0x02, 0x18, 0xa3, 0x58, 0x41, 0x36, 0x16, 0x2f, 0x62, 0x62,
|
|
||||||
0x76, 0x0f, 0x70, 0x5a, 0xc5, 0x24, 0xe7, 0x0e, 0x51, 0x1a, 0x00, 0x55, 0xaa, 0x17, 0x9e, 0x9a,
|
|
||||||
0x93, 0xe3, 0x9d, 0x97, 0x5f, 0x9e, 0x17, 0x02, 0x52, 0x96, 0xc4, 0x06, 0x36, 0xc3, 0x18, 0x10,
|
|
||||||
0x00, 0x00, 0xff, 0xff, 0xb7, 0x39, 0x2f, 0x89, 0xdd, 0x00, 0x00, 0x00,
|
|
||||||
}
|
|
112
vendor/github.com/gogo/protobuf/types/any_test.go
generated
vendored
112
vendor/github.com/gogo/protobuf/types/any_test.go
generated
vendored
@ -1,112 +0,0 @@
|
|||||||
// 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 types
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/gogo/protobuf/proto"
|
|
||||||
pb "github.com/gogo/protobuf/protoc-gen-gogo/descriptor"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestMarshalUnmarshal(t *testing.T) {
|
|
||||||
orig := &Any{Value: []byte("test")}
|
|
||||||
|
|
||||||
packed, err := MarshalAny(orig)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("MarshalAny(%+v): got: _, %v exp: _, nil", orig, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
unpacked := &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{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 := EmptyAny(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.TestAny"
|
|
||||||
if _, err := EmptyAny(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)
|
|
||||||
}
|
|
||||||
}
|
|
100
vendor/github.com/gogo/protobuf/types/duration.go
generated
vendored
100
vendor/github.com/gogo/protobuf/types/duration.go
generated
vendored
@ -1,100 +0,0 @@
|
|||||||
// 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 types
|
|
||||||
|
|
||||||
// This file implements conversions between google.protobuf.Duration
|
|
||||||
// and time.Duration.
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Range of a 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 Duration is valid according to the
|
|
||||||
// definition in google/protobuf/duration.proto. A valid Duration
|
|
||||||
// may still be too large to fit into a time.Duration (the range of Duration
|
|
||||||
// is about 10,000 years, and the range of time.Duration is about 290).
|
|
||||||
func validateDuration(d *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
|
|
||||||
}
|
|
||||||
|
|
||||||
// DurationFromProto converts a Duration to a time.Duration. DurationFromProto
|
|
||||||
// returns an error if the Duration is invalid or is too large to be
|
|
||||||
// represented in a time.Duration.
|
|
||||||
func DurationFromProto(p *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 Duration.
|
|
||||||
func DurationProto(d time.Duration) *Duration {
|
|
||||||
nanos := d.Nanoseconds()
|
|
||||||
secs := nanos / 1e9
|
|
||||||
nanos -= secs * 1e9
|
|
||||||
return &Duration{
|
|
||||||
Seconds: secs,
|
|
||||||
Nanos: int32(nanos),
|
|
||||||
}
|
|
||||||
}
|
|
488
vendor/github.com/gogo/protobuf/types/duration.pb.go
generated
vendored
488
vendor/github.com/gogo/protobuf/types/duration.pb.go
generated
vendored
@ -1,488 +0,0 @@
|
|||||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
|
||||||
// source: duration.proto
|
|
||||||
|
|
||||||
/*
|
|
||||||
Package types is a generated protocol buffer package.
|
|
||||||
|
|
||||||
It is generated from these files:
|
|
||||||
duration.proto
|
|
||||||
|
|
||||||
It has these top-level messages:
|
|
||||||
Duration
|
|
||||||
*/
|
|
||||||
package types
|
|
||||||
|
|
||||||
import proto "github.com/gogo/protobuf/proto"
|
|
||||||
import fmt "fmt"
|
|
||||||
import math "math"
|
|
||||||
|
|
||||||
import strings "strings"
|
|
||||||
import reflect "reflect"
|
|
||||||
|
|
||||||
import io "io"
|
|
||||||
|
|
||||||
// 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.GoGoProtoPackageIsVersion2 // 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.
|
|
||||||
//
|
|
||||||
// # Examples
|
|
||||||
//
|
|
||||||
// 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;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Example 3: Compute Duration from datetime.timedelta in Python.
|
|
||||||
//
|
|
||||||
// td = datetime.timedelta(days=3, minutes=10)
|
|
||||||
// duration = Duration()
|
|
||||||
// duration.FromTimedelta(td)
|
|
||||||
//
|
|
||||||
// # JSON Mapping
|
|
||||||
//
|
|
||||||
// In JSON format, the Duration type is encoded as a string rather than an
|
|
||||||
// object, where the string ends in the suffix "s" (indicating seconds) and
|
|
||||||
// is preceded by the number of seconds, with nanoseconds expressed as
|
|
||||||
// fractional seconds. For example, 3 seconds with 0 nanoseconds should be
|
|
||||||
// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
|
|
||||||
// be expressed in JSON format as "3.000000001s", and 3 seconds and 1
|
|
||||||
// microsecond should be expressed in JSON format as "3.000001s".
|
|
||||||
//
|
|
||||||
//
|
|
||||||
type Duration struct {
|
|
||||||
// Signed seconds of the span of time. Must be from -315,576,000,000
|
|
||||||
// to +315,576,000,000 inclusive. Note: these bounds are computed from:
|
|
||||||
// 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
|
|
||||||
Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" 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,proto3" json:"nanos,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Duration) Reset() { *m = Duration{} }
|
|
||||||
func (*Duration) ProtoMessage() {}
|
|
||||||
func (*Duration) Descriptor() ([]byte, []int) { return fileDescriptorDuration, []int{0} }
|
|
||||||
func (*Duration) XXX_WellKnownType() string { return "Duration" }
|
|
||||||
|
|
||||||
func (m *Duration) GetSeconds() int64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Seconds
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Duration) GetNanos() int32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Nanos
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterType((*Duration)(nil), "google.protobuf.Duration")
|
|
||||||
}
|
|
||||||
func (this *Duration) Compare(that interface{}) int {
|
|
||||||
if that == nil {
|
|
||||||
if this == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
that1, ok := that.(*Duration)
|
|
||||||
if !ok {
|
|
||||||
that2, ok := that.(Duration)
|
|
||||||
if ok {
|
|
||||||
that1 = &that2
|
|
||||||
} else {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if that1 == nil {
|
|
||||||
if this == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
} else if this == nil {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
if this.Seconds != that1.Seconds {
|
|
||||||
if this.Seconds < that1.Seconds {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
if this.Nanos != that1.Nanos {
|
|
||||||
if this.Nanos < that1.Nanos {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
func (this *Duration) Equal(that interface{}) bool {
|
|
||||||
if that == nil {
|
|
||||||
return this == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
that1, ok := that.(*Duration)
|
|
||||||
if !ok {
|
|
||||||
that2, ok := that.(Duration)
|
|
||||||
if ok {
|
|
||||||
that1 = &that2
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if that1 == nil {
|
|
||||||
return this == nil
|
|
||||||
} else if this == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if this.Seconds != that1.Seconds {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if this.Nanos != that1.Nanos {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
func (this *Duration) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 6)
|
|
||||||
s = append(s, "&types.Duration{")
|
|
||||||
s = append(s, "Seconds: "+fmt.Sprintf("%#v", this.Seconds)+",\n")
|
|
||||||
s = append(s, "Nanos: "+fmt.Sprintf("%#v", this.Nanos)+",\n")
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func valueToGoStringDuration(v interface{}, typ string) string {
|
|
||||||
rv := reflect.ValueOf(v)
|
|
||||||
if rv.IsNil() {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
pv := reflect.Indirect(rv).Interface()
|
|
||||||
return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
|
|
||||||
}
|
|
||||||
func (m *Duration) Marshal() (dAtA []byte, err error) {
|
|
||||||
size := m.Size()
|
|
||||||
dAtA = make([]byte, size)
|
|
||||||
n, err := m.MarshalTo(dAtA)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return dAtA[:n], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Duration) MarshalTo(dAtA []byte) (int, error) {
|
|
||||||
var i int
|
|
||||||
_ = i
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
if m.Seconds != 0 {
|
|
||||||
dAtA[i] = 0x8
|
|
||||||
i++
|
|
||||||
i = encodeVarintDuration(dAtA, i, uint64(m.Seconds))
|
|
||||||
}
|
|
||||||
if m.Nanos != 0 {
|
|
||||||
dAtA[i] = 0x10
|
|
||||||
i++
|
|
||||||
i = encodeVarintDuration(dAtA, i, uint64(m.Nanos))
|
|
||||||
}
|
|
||||||
return i, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func encodeVarintDuration(dAtA []byte, offset int, v uint64) int {
|
|
||||||
for v >= 1<<7 {
|
|
||||||
dAtA[offset] = uint8(v&0x7f | 0x80)
|
|
||||||
v >>= 7
|
|
||||||
offset++
|
|
||||||
}
|
|
||||||
dAtA[offset] = uint8(v)
|
|
||||||
return offset + 1
|
|
||||||
}
|
|
||||||
func (m *Duration) Size() (n int) {
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
if m.Seconds != 0 {
|
|
||||||
n += 1 + sovDuration(uint64(m.Seconds))
|
|
||||||
}
|
|
||||||
if m.Nanos != 0 {
|
|
||||||
n += 1 + sovDuration(uint64(m.Nanos))
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func sovDuration(x uint64) (n int) {
|
|
||||||
for {
|
|
||||||
n++
|
|
||||||
x >>= 7
|
|
||||||
if x == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
func sozDuration(x uint64) (n int) {
|
|
||||||
return sovDuration(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
|
||||||
}
|
|
||||||
func (m *Duration) Unmarshal(dAtA []byte) error {
|
|
||||||
l := len(dAtA)
|
|
||||||
iNdEx := 0
|
|
||||||
for iNdEx < l {
|
|
||||||
preIndex := iNdEx
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowDuration
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fieldNum := int32(wire >> 3)
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
if wireType == 4 {
|
|
||||||
return fmt.Errorf("proto: Duration: wiretype end group for non-group")
|
|
||||||
}
|
|
||||||
if fieldNum <= 0 {
|
|
||||||
return fmt.Errorf("proto: Duration: illegal tag %d (wire type %d)", fieldNum, wire)
|
|
||||||
}
|
|
||||||
switch fieldNum {
|
|
||||||
case 1:
|
|
||||||
if wireType != 0 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Seconds", wireType)
|
|
||||||
}
|
|
||||||
m.Seconds = 0
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowDuration
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
m.Seconds |= (int64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case 2:
|
|
||||||
if wireType != 0 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Nanos", wireType)
|
|
||||||
}
|
|
||||||
m.Nanos = 0
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowDuration
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
m.Nanos |= (int32(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
iNdEx = preIndex
|
|
||||||
skippy, err := skipDuration(dAtA[iNdEx:])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if skippy < 0 {
|
|
||||||
return ErrInvalidLengthDuration
|
|
||||||
}
|
|
||||||
if (iNdEx + skippy) > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
iNdEx += skippy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if iNdEx > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
func skipDuration(dAtA []byte) (n int, err error) {
|
|
||||||
l := len(dAtA)
|
|
||||||
iNdEx := 0
|
|
||||||
for iNdEx < l {
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowDuration
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
switch wireType {
|
|
||||||
case 0:
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowDuration
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
iNdEx++
|
|
||||||
if dAtA[iNdEx-1] < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 1:
|
|
||||||
iNdEx += 8
|
|
||||||
return iNdEx, nil
|
|
||||||
case 2:
|
|
||||||
var length int
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowDuration
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
length |= (int(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
iNdEx += length
|
|
||||||
if length < 0 {
|
|
||||||
return 0, ErrInvalidLengthDuration
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 3:
|
|
||||||
for {
|
|
||||||
var innerWire uint64
|
|
||||||
var start int = iNdEx
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowDuration
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
innerWire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
innerWireType := int(innerWire & 0x7)
|
|
||||||
if innerWireType == 4 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
next, err := skipDuration(dAtA[start:])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
iNdEx = start + next
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 4:
|
|
||||||
return iNdEx, nil
|
|
||||||
case 5:
|
|
||||||
iNdEx += 4
|
|
||||||
return iNdEx, nil
|
|
||||||
default:
|
|
||||||
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
panic("unreachable")
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrInvalidLengthDuration = fmt.Errorf("proto: negative length found during unmarshaling")
|
|
||||||
ErrIntOverflowDuration = fmt.Errorf("proto: integer overflow")
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() { proto.RegisterFile("duration.proto", fileDescriptorDuration) }
|
|
||||||
|
|
||||||
var fileDescriptorDuration = []byte{
|
|
||||||
// 203 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4b, 0x29, 0x2d, 0x4a,
|
|
||||||
0x2c, 0xc9, 0xcc, 0xcf, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x4f, 0xcf, 0xcf, 0x4f,
|
|
||||||
0xcf, 0x49, 0x85, 0xf0, 0x92, 0x4a, 0xd3, 0x94, 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, 0xfe, 0xc2, 0x43, 0x39, 0x86, 0x1b, 0x0f, 0xe5, 0x18, 0x3e, 0x3c,
|
|
||||||
0x94, 0x63, 0x5c, 0xf1, 0x48, 0x8e, 0xf1, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f,
|
|
||||||
0x3c, 0x92, 0x63, 0x7c, 0xf1, 0x48, 0x8e, 0xe1, 0xc3, 0x23, 0x39, 0xc6, 0x15, 0x8f, 0xe5, 0x18,
|
|
||||||
0xb9, 0x84, 0x93, 0xf3, 0x73, 0xf5, 0xd0, 0xac, 0x76, 0xe2, 0x85, 0x59, 0x1c, 0x00, 0x12, 0x09,
|
|
||||||
0x60, 0x8c, 0x62, 0x2d, 0xa9, 0x2c, 0x48, 0x2d, 0xfe, 0xc1, 0xc8, 0xb8, 0x88, 0x89, 0xd9, 0x3d,
|
|
||||||
0xc0, 0x69, 0x15, 0x93, 0x9c, 0x3b, 0x44, 0x4b, 0x00, 0x54, 0x8b, 0x5e, 0x78, 0x6a, 0x4e, 0x8e,
|
|
||||||
0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x65, 0x12, 0x1b, 0xd8, 0x2c, 0x63, 0x40, 0x00, 0x00,
|
|
||||||
0x00, 0xff, 0xff, 0x9d, 0x5a, 0x25, 0xa5, 0xe6, 0x00, 0x00, 0x00,
|
|
||||||
}
|
|
100
vendor/github.com/gogo/protobuf/types/duration_gogo.go
generated
vendored
100
vendor/github.com/gogo/protobuf/types/duration_gogo.go
generated
vendored
@ -1,100 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2016, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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 types
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func NewPopulatedDuration(r interface {
|
|
||||||
Int63() int64
|
|
||||||
}, easy bool) *Duration {
|
|
||||||
this := &Duration{}
|
|
||||||
maxSecs := time.Hour.Nanoseconds() / 1e9
|
|
||||||
max := 2 * maxSecs
|
|
||||||
s := int64(r.Int63()) % max
|
|
||||||
s -= maxSecs
|
|
||||||
neg := int64(1)
|
|
||||||
if s < 0 {
|
|
||||||
neg = -1
|
|
||||||
}
|
|
||||||
this.Seconds = s
|
|
||||||
this.Nanos = int32(neg * (r.Int63() % 1e9))
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *Duration) String() string {
|
|
||||||
td, err := DurationFromProto(d)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Sprintf("(%v)", err)
|
|
||||||
}
|
|
||||||
return td.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewPopulatedStdDuration(r interface {
|
|
||||||
Int63() int64
|
|
||||||
}, easy bool) *time.Duration {
|
|
||||||
dur := NewPopulatedDuration(r, easy)
|
|
||||||
d, err := DurationFromProto(dur)
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &d
|
|
||||||
}
|
|
||||||
|
|
||||||
func SizeOfStdDuration(d time.Duration) int {
|
|
||||||
dur := DurationProto(d)
|
|
||||||
return dur.Size()
|
|
||||||
}
|
|
||||||
|
|
||||||
func StdDurationMarshal(d time.Duration) ([]byte, error) {
|
|
||||||
size := SizeOfStdDuration(d)
|
|
||||||
buf := make([]byte, size)
|
|
||||||
_, err := StdDurationMarshalTo(d, buf)
|
|
||||||
return buf, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func StdDurationMarshalTo(d time.Duration, data []byte) (int, error) {
|
|
||||||
dur := DurationProto(d)
|
|
||||||
return dur.MarshalTo(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
func StdDurationUnmarshal(d *time.Duration, data []byte) error {
|
|
||||||
dur := &Duration{}
|
|
||||||
if err := dur.Unmarshal(data); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
dd, err := DurationFromProto(dur)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
*d = dd
|
|
||||||
return nil
|
|
||||||
}
|
|
120
vendor/github.com/gogo/protobuf/types/duration_test.go
generated
vendored
120
vendor/github.com/gogo/protobuf/types/duration_test.go
generated
vendored
@ -1,120 +0,0 @@
|
|||||||
// 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 types
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/gogo/protobuf/proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
minGoSeconds = math.MinInt64 / int64(1e9)
|
|
||||||
maxGoSeconds = math.MaxInt64 / int64(1e9)
|
|
||||||
)
|
|
||||||
|
|
||||||
var durationTests = []struct {
|
|
||||||
proto *Duration
|
|
||||||
isValid bool
|
|
||||||
inRange bool
|
|
||||||
dur time.Duration
|
|
||||||
}{
|
|
||||||
// The zero duration.
|
|
||||||
{&Duration{Seconds: 0, Nanos: 0}, true, true, 0},
|
|
||||||
// Some ordinary non-zero durations.
|
|
||||||
{&Duration{Seconds: 100, Nanos: 0}, true, true, 100 * time.Second},
|
|
||||||
{&Duration{Seconds: -100, Nanos: 0}, true, true, -100 * time.Second},
|
|
||||||
{&Duration{Seconds: 100, Nanos: 987}, true, true, 100*time.Second + 987},
|
|
||||||
{&Duration{Seconds: -100, Nanos: -987}, true, true, -(100*time.Second + 987)},
|
|
||||||
// The largest duration representable in Go.
|
|
||||||
{&Duration{Seconds: maxGoSeconds, Nanos: int32(math.MaxInt64 - 1e9*maxGoSeconds)}, true, true, math.MaxInt64},
|
|
||||||
// The smallest duration representable in Go.
|
|
||||||
{&Duration{Seconds: minGoSeconds, Nanos: int32(math.MinInt64 - 1e9*minGoSeconds)}, true, true, math.MinInt64},
|
|
||||||
{nil, false, false, 0},
|
|
||||||
{&Duration{Seconds: -100, Nanos: 987}, false, false, 0},
|
|
||||||
{&Duration{Seconds: 100, Nanos: -987}, false, false, 0},
|
|
||||||
{&Duration{Seconds: math.MinInt64, Nanos: 0}, false, false, 0},
|
|
||||||
{&Duration{Seconds: math.MaxInt64, Nanos: 0}, false, false, 0},
|
|
||||||
// The largest valid duration.
|
|
||||||
{&Duration{Seconds: maxSeconds, Nanos: 1e9 - 1}, true, false, 0},
|
|
||||||
// The smallest valid duration.
|
|
||||||
{&Duration{Seconds: minSeconds, Nanos: -(1e9 - 1)}, true, false, 0},
|
|
||||||
// The smallest invalid duration above the valid range.
|
|
||||||
{&Duration{Seconds: maxSeconds + 1, Nanos: 0}, false, false, 0},
|
|
||||||
// The largest invalid duration below the valid range.
|
|
||||||
{&Duration{Seconds: minSeconds - 1, Nanos: -(1e9 - 1)}, false, false, 0},
|
|
||||||
// One nanosecond past the largest duration representable in Go.
|
|
||||||
{&Duration{Seconds: maxGoSeconds, Nanos: int32(math.MaxInt64-1e9*maxGoSeconds) + 1}, true, false, 0},
|
|
||||||
// One nanosecond past the smallest duration representable in Go.
|
|
||||||
{&Duration{Seconds: minGoSeconds, Nanos: int32(math.MinInt64-1e9*minGoSeconds) - 1}, true, false, 0},
|
|
||||||
// One second past the largest duration representable in Go.
|
|
||||||
{&Duration{Seconds: maxGoSeconds + 1, Nanos: int32(math.MaxInt64 - 1e9*maxGoSeconds)}, true, false, 0},
|
|
||||||
// One second past the smallest duration representable in Go.
|
|
||||||
{&Duration{Seconds: minGoSeconds - 1, Nanos: 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 TestDurationFromProto(t *testing.T) {
|
|
||||||
for _, test := range durationTests {
|
|
||||||
got, err := DurationFromProto(test.proto)
|
|
||||||
gotOK := (err == nil)
|
|
||||||
wantOK := test.isValid && test.inRange
|
|
||||||
if gotOK != wantOK {
|
|
||||||
t.Errorf("DurationFromProto(%v) ok = %t, want %t", test.proto, gotOK, wantOK)
|
|
||||||
}
|
|
||||||
if err == nil && got != test.dur {
|
|
||||||
t.Errorf("DurationFromProto(%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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
432
vendor/github.com/gogo/protobuf/types/empty.pb.go
generated
vendored
432
vendor/github.com/gogo/protobuf/types/empty.pb.go
generated
vendored
@ -1,432 +0,0 @@
|
|||||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
|
||||||
// source: empty.proto
|
|
||||||
|
|
||||||
/*
|
|
||||||
Package types is a generated protocol buffer package.
|
|
||||||
|
|
||||||
It is generated from these files:
|
|
||||||
empty.proto
|
|
||||||
|
|
||||||
It has these top-level messages:
|
|
||||||
Empty
|
|
||||||
*/
|
|
||||||
package types
|
|
||||||
|
|
||||||
import proto "github.com/gogo/protobuf/proto"
|
|
||||||
import fmt "fmt"
|
|
||||||
import math "math"
|
|
||||||
|
|
||||||
import strings "strings"
|
|
||||||
import reflect "reflect"
|
|
||||||
|
|
||||||
import io "io"
|
|
||||||
|
|
||||||
// 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.GoGoProtoPackageIsVersion2 // 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 (*Empty) ProtoMessage() {}
|
|
||||||
func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptorEmpty, []int{0} }
|
|
||||||
func (*Empty) XXX_WellKnownType() string { return "Empty" }
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterType((*Empty)(nil), "google.protobuf.Empty")
|
|
||||||
}
|
|
||||||
func (this *Empty) Compare(that interface{}) int {
|
|
||||||
if that == nil {
|
|
||||||
if this == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
that1, ok := that.(*Empty)
|
|
||||||
if !ok {
|
|
||||||
that2, ok := that.(Empty)
|
|
||||||
if ok {
|
|
||||||
that1 = &that2
|
|
||||||
} else {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if that1 == nil {
|
|
||||||
if this == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
} else if this == nil {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
func (this *Empty) Equal(that interface{}) bool {
|
|
||||||
if that == nil {
|
|
||||||
return this == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
that1, ok := that.(*Empty)
|
|
||||||
if !ok {
|
|
||||||
that2, ok := that.(Empty)
|
|
||||||
if ok {
|
|
||||||
that1 = &that2
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if that1 == nil {
|
|
||||||
return this == nil
|
|
||||||
} else if this == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
func (this *Empty) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 4)
|
|
||||||
s = append(s, "&types.Empty{")
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func valueToGoStringEmpty(v interface{}, typ string) string {
|
|
||||||
rv := reflect.ValueOf(v)
|
|
||||||
if rv.IsNil() {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
pv := reflect.Indirect(rv).Interface()
|
|
||||||
return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
|
|
||||||
}
|
|
||||||
func (m *Empty) Marshal() (dAtA []byte, err error) {
|
|
||||||
size := m.Size()
|
|
||||||
dAtA = make([]byte, size)
|
|
||||||
n, err := m.MarshalTo(dAtA)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return dAtA[:n], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Empty) MarshalTo(dAtA []byte) (int, error) {
|
|
||||||
var i int
|
|
||||||
_ = i
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
return i, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func encodeVarintEmpty(dAtA []byte, offset int, v uint64) int {
|
|
||||||
for v >= 1<<7 {
|
|
||||||
dAtA[offset] = uint8(v&0x7f | 0x80)
|
|
||||||
v >>= 7
|
|
||||||
offset++
|
|
||||||
}
|
|
||||||
dAtA[offset] = uint8(v)
|
|
||||||
return offset + 1
|
|
||||||
}
|
|
||||||
func NewPopulatedEmpty(r randyEmpty, easy bool) *Empty {
|
|
||||||
this := &Empty{}
|
|
||||||
if !easy && r.Intn(10) != 0 {
|
|
||||||
}
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
type randyEmpty interface {
|
|
||||||
Float32() float32
|
|
||||||
Float64() float64
|
|
||||||
Int63() int64
|
|
||||||
Int31() int32
|
|
||||||
Uint32() uint32
|
|
||||||
Intn(n int) int
|
|
||||||
}
|
|
||||||
|
|
||||||
func randUTF8RuneEmpty(r randyEmpty) rune {
|
|
||||||
ru := r.Intn(62)
|
|
||||||
if ru < 10 {
|
|
||||||
return rune(ru + 48)
|
|
||||||
} else if ru < 36 {
|
|
||||||
return rune(ru + 55)
|
|
||||||
}
|
|
||||||
return rune(ru + 61)
|
|
||||||
}
|
|
||||||
func randStringEmpty(r randyEmpty) string {
|
|
||||||
v1 := r.Intn(100)
|
|
||||||
tmps := make([]rune, v1)
|
|
||||||
for i := 0; i < v1; i++ {
|
|
||||||
tmps[i] = randUTF8RuneEmpty(r)
|
|
||||||
}
|
|
||||||
return string(tmps)
|
|
||||||
}
|
|
||||||
func randUnrecognizedEmpty(r randyEmpty, maxFieldNumber int) (dAtA []byte) {
|
|
||||||
l := r.Intn(5)
|
|
||||||
for i := 0; i < l; i++ {
|
|
||||||
wire := r.Intn(4)
|
|
||||||
if wire == 3 {
|
|
||||||
wire = 5
|
|
||||||
}
|
|
||||||
fieldNumber := maxFieldNumber + r.Intn(100)
|
|
||||||
dAtA = randFieldEmpty(dAtA, r, fieldNumber, wire)
|
|
||||||
}
|
|
||||||
return dAtA
|
|
||||||
}
|
|
||||||
func randFieldEmpty(dAtA []byte, r randyEmpty, fieldNumber int, wire int) []byte {
|
|
||||||
key := uint32(fieldNumber)<<3 | uint32(wire)
|
|
||||||
switch wire {
|
|
||||||
case 0:
|
|
||||||
dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key))
|
|
||||||
v2 := r.Int63()
|
|
||||||
if r.Intn(2) == 0 {
|
|
||||||
v2 *= -1
|
|
||||||
}
|
|
||||||
dAtA = encodeVarintPopulateEmpty(dAtA, uint64(v2))
|
|
||||||
case 1:
|
|
||||||
dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key))
|
|
||||||
dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
|
|
||||||
case 2:
|
|
||||||
dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key))
|
|
||||||
ll := r.Intn(100)
|
|
||||||
dAtA = encodeVarintPopulateEmpty(dAtA, uint64(ll))
|
|
||||||
for j := 0; j < ll; j++ {
|
|
||||||
dAtA = append(dAtA, byte(r.Intn(256)))
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
dAtA = encodeVarintPopulateEmpty(dAtA, uint64(key))
|
|
||||||
dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
|
|
||||||
}
|
|
||||||
return dAtA
|
|
||||||
}
|
|
||||||
func encodeVarintPopulateEmpty(dAtA []byte, v uint64) []byte {
|
|
||||||
for v >= 1<<7 {
|
|
||||||
dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80))
|
|
||||||
v >>= 7
|
|
||||||
}
|
|
||||||
dAtA = append(dAtA, uint8(v))
|
|
||||||
return dAtA
|
|
||||||
}
|
|
||||||
func (m *Empty) Size() (n int) {
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func sovEmpty(x uint64) (n int) {
|
|
||||||
for {
|
|
||||||
n++
|
|
||||||
x >>= 7
|
|
||||||
if x == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
func sozEmpty(x uint64) (n int) {
|
|
||||||
return sovEmpty(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
|
||||||
}
|
|
||||||
func (this *Empty) String() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := strings.Join([]string{`&Empty{`,
|
|
||||||
`}`,
|
|
||||||
}, "")
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
func valueToStringEmpty(v interface{}) string {
|
|
||||||
rv := reflect.ValueOf(v)
|
|
||||||
if rv.IsNil() {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
pv := reflect.Indirect(rv).Interface()
|
|
||||||
return fmt.Sprintf("*%v", pv)
|
|
||||||
}
|
|
||||||
func (m *Empty) Unmarshal(dAtA []byte) error {
|
|
||||||
l := len(dAtA)
|
|
||||||
iNdEx := 0
|
|
||||||
for iNdEx < l {
|
|
||||||
preIndex := iNdEx
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowEmpty
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fieldNum := int32(wire >> 3)
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
if wireType == 4 {
|
|
||||||
return fmt.Errorf("proto: Empty: wiretype end group for non-group")
|
|
||||||
}
|
|
||||||
if fieldNum <= 0 {
|
|
||||||
return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire)
|
|
||||||
}
|
|
||||||
switch fieldNum {
|
|
||||||
default:
|
|
||||||
iNdEx = preIndex
|
|
||||||
skippy, err := skipEmpty(dAtA[iNdEx:])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if skippy < 0 {
|
|
||||||
return ErrInvalidLengthEmpty
|
|
||||||
}
|
|
||||||
if (iNdEx + skippy) > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
iNdEx += skippy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if iNdEx > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
func skipEmpty(dAtA []byte) (n int, err error) {
|
|
||||||
l := len(dAtA)
|
|
||||||
iNdEx := 0
|
|
||||||
for iNdEx < l {
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowEmpty
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
switch wireType {
|
|
||||||
case 0:
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowEmpty
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
iNdEx++
|
|
||||||
if dAtA[iNdEx-1] < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 1:
|
|
||||||
iNdEx += 8
|
|
||||||
return iNdEx, nil
|
|
||||||
case 2:
|
|
||||||
var length int
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowEmpty
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
length |= (int(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
iNdEx += length
|
|
||||||
if length < 0 {
|
|
||||||
return 0, ErrInvalidLengthEmpty
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 3:
|
|
||||||
for {
|
|
||||||
var innerWire uint64
|
|
||||||
var start int = iNdEx
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowEmpty
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
innerWire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
innerWireType := int(innerWire & 0x7)
|
|
||||||
if innerWireType == 4 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
next, err := skipEmpty(dAtA[start:])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
iNdEx = start + next
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 4:
|
|
||||||
return iNdEx, nil
|
|
||||||
case 5:
|
|
||||||
iNdEx += 4
|
|
||||||
return iNdEx, nil
|
|
||||||
default:
|
|
||||||
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
panic("unreachable")
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrInvalidLengthEmpty = fmt.Errorf("proto: negative length found during unmarshaling")
|
|
||||||
ErrIntOverflowEmpty = fmt.Errorf("proto: integer overflow")
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() { proto.RegisterFile("empty.proto", fileDescriptorEmpty) }
|
|
||||||
|
|
||||||
var fileDescriptorEmpty = []byte{
|
|
||||||
// 169 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4e, 0xcd, 0x2d, 0x28,
|
|
||||||
0xa9, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x4f, 0xcf, 0xcf, 0x4f, 0xcf, 0x49, 0x85,
|
|
||||||
0xf0, 0x92, 0x4a, 0xd3, 0x94, 0xd8, 0xb9, 0x58, 0x5d, 0x41, 0xf2, 0x4e, 0x2d, 0x8c, 0x17, 0x1e,
|
|
||||||
0xca, 0x31, 0xdc, 0x78, 0x28, 0xc7, 0xf0, 0xe1, 0xa1, 0x1c, 0xe3, 0x8f, 0x87, 0x72, 0x8c, 0x0d,
|
|
||||||
0x8f, 0xe4, 0x18, 0x57, 0x3c, 0x92, 0x63, 0x3c, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6,
|
|
||||||
0x07, 0x8f, 0xe4, 0x18, 0x5f, 0x3c, 0x92, 0x63, 0xf8, 0x00, 0x12, 0x7f, 0x2c, 0xc7, 0xc8, 0x25,
|
|
||||||
0x9c, 0x9c, 0x9f, 0xab, 0x87, 0x66, 0xa0, 0x13, 0x17, 0xd8, 0xb8, 0x00, 0x10, 0x37, 0x80, 0x31,
|
|
||||||
0x8a, 0xb5, 0xa4, 0xb2, 0x20, 0xb5, 0xf8, 0x07, 0x23, 0xe3, 0x22, 0x26, 0x66, 0xf7, 0x00, 0xa7,
|
|
||||||
0x55, 0x4c, 0x72, 0xee, 0x10, 0xf5, 0x01, 0x50, 0xf5, 0x7a, 0xe1, 0xa9, 0x39, 0x39, 0xde, 0x79,
|
|
||||||
0xf9, 0xe5, 0x79, 0x21, 0x20, 0x95, 0x49, 0x6c, 0x60, 0x83, 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff,
|
|
||||||
0xff, 0x7c, 0xa8, 0xf0, 0xc4, 0xb6, 0x00, 0x00, 0x00,
|
|
||||||
}
|
|
713
vendor/github.com/gogo/protobuf/types/field_mask.pb.go
generated
vendored
713
vendor/github.com/gogo/protobuf/types/field_mask.pb.go
generated
vendored
@ -1,713 +0,0 @@
|
|||||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
|
||||||
// source: field_mask.proto
|
|
||||||
|
|
||||||
/*
|
|
||||||
Package types is a generated protocol buffer package.
|
|
||||||
|
|
||||||
It is generated from these files:
|
|
||||||
field_mask.proto
|
|
||||||
|
|
||||||
It has these top-level messages:
|
|
||||||
FieldMask
|
|
||||||
*/
|
|
||||||
package types
|
|
||||||
|
|
||||||
import proto "github.com/gogo/protobuf/proto"
|
|
||||||
import fmt "fmt"
|
|
||||||
import math "math"
|
|
||||||
|
|
||||||
import strings "strings"
|
|
||||||
import reflect "reflect"
|
|
||||||
|
|
||||||
import io "io"
|
|
||||||
|
|
||||||
// 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.GoGoProtoPackageIsVersion2 // please upgrade the proto package
|
|
||||||
|
|
||||||
// `FieldMask` represents a set of symbolic field paths, for example:
|
|
||||||
//
|
|
||||||
// paths: "f.a"
|
|
||||||
// paths: "f.b.d"
|
|
||||||
//
|
|
||||||
// Here `f` represents a field in some root message, `a` and `b`
|
|
||||||
// fields in the message found in `f`, and `d` a field found in the
|
|
||||||
// message in `f.b`.
|
|
||||||
//
|
|
||||||
// Field masks are used to specify a subset of fields that should be
|
|
||||||
// returned by a get operation or modified by an update operation.
|
|
||||||
// Field masks also have a custom JSON encoding (see below).
|
|
||||||
//
|
|
||||||
// # Field Masks in Projections
|
|
||||||
//
|
|
||||||
// When used in the context of a projection, a response message or
|
|
||||||
// sub-message is filtered by the API to only contain those fields as
|
|
||||||
// specified in the mask. For example, if the mask in the previous
|
|
||||||
// example is applied to a response message as follows:
|
|
||||||
//
|
|
||||||
// f {
|
|
||||||
// a : 22
|
|
||||||
// b {
|
|
||||||
// d : 1
|
|
||||||
// x : 2
|
|
||||||
// }
|
|
||||||
// y : 13
|
|
||||||
// }
|
|
||||||
// z: 8
|
|
||||||
//
|
|
||||||
// The result will not contain specific values for fields x,y and z
|
|
||||||
// (their value will be set to the default, and omitted in proto text
|
|
||||||
// output):
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// f {
|
|
||||||
// a : 22
|
|
||||||
// b {
|
|
||||||
// d : 1
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// A repeated field is not allowed except at the last position of a
|
|
||||||
// paths string.
|
|
||||||
//
|
|
||||||
// If a FieldMask object is not present in a get operation, the
|
|
||||||
// operation applies to all fields (as if a FieldMask of all fields
|
|
||||||
// had been specified).
|
|
||||||
//
|
|
||||||
// Note that a field mask does not necessarily apply to the
|
|
||||||
// top-level response message. In case of a REST get operation, the
|
|
||||||
// field mask applies directly to the response, but in case of a REST
|
|
||||||
// list operation, the mask instead applies to each individual message
|
|
||||||
// in the returned resource list. In case of a REST custom method,
|
|
||||||
// other definitions may be used. Where the mask applies will be
|
|
||||||
// clearly documented together with its declaration in the API. In
|
|
||||||
// any case, the effect on the returned resource/resources is required
|
|
||||||
// behavior for APIs.
|
|
||||||
//
|
|
||||||
// # Field Masks in Update Operations
|
|
||||||
//
|
|
||||||
// A field mask in update operations specifies which fields of the
|
|
||||||
// targeted resource are going to be updated. The API is required
|
|
||||||
// to only change the values of the fields as specified in the mask
|
|
||||||
// and leave the others untouched. If a resource is passed in to
|
|
||||||
// describe the updated values, the API ignores the values of all
|
|
||||||
// fields not covered by the mask.
|
|
||||||
//
|
|
||||||
// If a repeated field is specified for an update operation, the existing
|
|
||||||
// repeated values in the target resource will be overwritten by the new values.
|
|
||||||
// Note that a repeated field is only allowed in the last position of a `paths`
|
|
||||||
// string.
|
|
||||||
//
|
|
||||||
// If a sub-message is specified in the last position of the field mask for an
|
|
||||||
// update operation, then the existing sub-message in the target resource is
|
|
||||||
// overwritten. Given the target message:
|
|
||||||
//
|
|
||||||
// f {
|
|
||||||
// b {
|
|
||||||
// d : 1
|
|
||||||
// x : 2
|
|
||||||
// }
|
|
||||||
// c : 1
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// And an update message:
|
|
||||||
//
|
|
||||||
// f {
|
|
||||||
// b {
|
|
||||||
// d : 10
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// then if the field mask is:
|
|
||||||
//
|
|
||||||
// paths: "f.b"
|
|
||||||
//
|
|
||||||
// then the result will be:
|
|
||||||
//
|
|
||||||
// f {
|
|
||||||
// b {
|
|
||||||
// d : 10
|
|
||||||
// }
|
|
||||||
// c : 1
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// However, if the update mask was:
|
|
||||||
//
|
|
||||||
// paths: "f.b.d"
|
|
||||||
//
|
|
||||||
// then the result would be:
|
|
||||||
//
|
|
||||||
// f {
|
|
||||||
// b {
|
|
||||||
// d : 10
|
|
||||||
// x : 2
|
|
||||||
// }
|
|
||||||
// c : 1
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// In order to reset a field's value to the default, the field must
|
|
||||||
// be in the mask and set to the default value in the provided resource.
|
|
||||||
// Hence, in order to reset all fields of a resource, provide a default
|
|
||||||
// instance of the resource and set all fields in the mask, or do
|
|
||||||
// not provide a mask as described below.
|
|
||||||
//
|
|
||||||
// If a field mask is not present on update, the operation applies to
|
|
||||||
// all fields (as if a field mask of all fields has been specified).
|
|
||||||
// Note that in the presence of schema evolution, this may mean that
|
|
||||||
// fields the client does not know and has therefore not filled into
|
|
||||||
// the request will be reset to their default. If this is unwanted
|
|
||||||
// behavior, a specific service may require a client to always specify
|
|
||||||
// a field mask, producing an error if not.
|
|
||||||
//
|
|
||||||
// As with get operations, the location of the resource which
|
|
||||||
// describes the updated values in the request message depends on the
|
|
||||||
// operation kind. In any case, the effect of the field mask is
|
|
||||||
// required to be honored by the API.
|
|
||||||
//
|
|
||||||
// ## Considerations for HTTP REST
|
|
||||||
//
|
|
||||||
// The HTTP kind of an update operation which uses a field mask must
|
|
||||||
// be set to PATCH instead of PUT in order to satisfy HTTP semantics
|
|
||||||
// (PUT must only be used for full updates).
|
|
||||||
//
|
|
||||||
// # JSON Encoding of Field Masks
|
|
||||||
//
|
|
||||||
// In JSON, a field mask is encoded as a single string where paths are
|
|
||||||
// separated by a comma. Fields name in each path are converted
|
|
||||||
// to/from lower-camel naming conventions.
|
|
||||||
//
|
|
||||||
// As an example, consider the following message declarations:
|
|
||||||
//
|
|
||||||
// message Profile {
|
|
||||||
// User user = 1;
|
|
||||||
// Photo photo = 2;
|
|
||||||
// }
|
|
||||||
// message User {
|
|
||||||
// string display_name = 1;
|
|
||||||
// string address = 2;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// In proto a field mask for `Profile` may look as such:
|
|
||||||
//
|
|
||||||
// mask {
|
|
||||||
// paths: "user.display_name"
|
|
||||||
// paths: "photo"
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// In JSON, the same mask is represented as below:
|
|
||||||
//
|
|
||||||
// {
|
|
||||||
// mask: "user.displayName,photo"
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// # Field Masks and Oneof Fields
|
|
||||||
//
|
|
||||||
// Field masks treat fields in oneofs just as regular fields. Consider the
|
|
||||||
// following message:
|
|
||||||
//
|
|
||||||
// message SampleMessage {
|
|
||||||
// oneof test_oneof {
|
|
||||||
// string name = 4;
|
|
||||||
// SubMessage sub_message = 9;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// The field mask can be:
|
|
||||||
//
|
|
||||||
// mask {
|
|
||||||
// paths: "name"
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Or:
|
|
||||||
//
|
|
||||||
// mask {
|
|
||||||
// paths: "sub_message"
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Note that oneof type names ("test_oneof" in this case) cannot be used in
|
|
||||||
// paths.
|
|
||||||
type FieldMask struct {
|
|
||||||
// The set of field mask paths.
|
|
||||||
Paths []string `protobuf:"bytes,1,rep,name=paths" json:"paths,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *FieldMask) Reset() { *m = FieldMask{} }
|
|
||||||
func (*FieldMask) ProtoMessage() {}
|
|
||||||
func (*FieldMask) Descriptor() ([]byte, []int) { return fileDescriptorFieldMask, []int{0} }
|
|
||||||
|
|
||||||
func (m *FieldMask) GetPaths() []string {
|
|
||||||
if m != nil {
|
|
||||||
return m.Paths
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterType((*FieldMask)(nil), "google.protobuf.FieldMask")
|
|
||||||
}
|
|
||||||
func (this *FieldMask) Compare(that interface{}) int {
|
|
||||||
if that == nil {
|
|
||||||
if this == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
that1, ok := that.(*FieldMask)
|
|
||||||
if !ok {
|
|
||||||
that2, ok := that.(FieldMask)
|
|
||||||
if ok {
|
|
||||||
that1 = &that2
|
|
||||||
} else {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if that1 == nil {
|
|
||||||
if this == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
} else if this == nil {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
if len(this.Paths) != len(that1.Paths) {
|
|
||||||
if len(this.Paths) < len(that1.Paths) {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
for i := range this.Paths {
|
|
||||||
if this.Paths[i] != that1.Paths[i] {
|
|
||||||
if this.Paths[i] < that1.Paths[i] {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
func (this *FieldMask) Equal(that interface{}) bool {
|
|
||||||
if that == nil {
|
|
||||||
return this == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
that1, ok := that.(*FieldMask)
|
|
||||||
if !ok {
|
|
||||||
that2, ok := that.(FieldMask)
|
|
||||||
if ok {
|
|
||||||
that1 = &that2
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if that1 == nil {
|
|
||||||
return this == nil
|
|
||||||
} else if this == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if len(this.Paths) != len(that1.Paths) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
for i := range this.Paths {
|
|
||||||
if this.Paths[i] != that1.Paths[i] {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
func (this *FieldMask) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 5)
|
|
||||||
s = append(s, "&types.FieldMask{")
|
|
||||||
s = append(s, "Paths: "+fmt.Sprintf("%#v", this.Paths)+",\n")
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func valueToGoStringFieldMask(v interface{}, typ string) string {
|
|
||||||
rv := reflect.ValueOf(v)
|
|
||||||
if rv.IsNil() {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
pv := reflect.Indirect(rv).Interface()
|
|
||||||
return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
|
|
||||||
}
|
|
||||||
func (m *FieldMask) Marshal() (dAtA []byte, err error) {
|
|
||||||
size := m.Size()
|
|
||||||
dAtA = make([]byte, size)
|
|
||||||
n, err := m.MarshalTo(dAtA)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return dAtA[:n], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *FieldMask) MarshalTo(dAtA []byte) (int, error) {
|
|
||||||
var i int
|
|
||||||
_ = i
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
if len(m.Paths) > 0 {
|
|
||||||
for _, s := range m.Paths {
|
|
||||||
dAtA[i] = 0xa
|
|
||||||
i++
|
|
||||||
l = len(s)
|
|
||||||
for l >= 1<<7 {
|
|
||||||
dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
|
|
||||||
l >>= 7
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
dAtA[i] = uint8(l)
|
|
||||||
i++
|
|
||||||
i += copy(dAtA[i:], s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return i, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func encodeVarintFieldMask(dAtA []byte, offset int, v uint64) int {
|
|
||||||
for v >= 1<<7 {
|
|
||||||
dAtA[offset] = uint8(v&0x7f | 0x80)
|
|
||||||
v >>= 7
|
|
||||||
offset++
|
|
||||||
}
|
|
||||||
dAtA[offset] = uint8(v)
|
|
||||||
return offset + 1
|
|
||||||
}
|
|
||||||
func NewPopulatedFieldMask(r randyFieldMask, easy bool) *FieldMask {
|
|
||||||
this := &FieldMask{}
|
|
||||||
v1 := r.Intn(10)
|
|
||||||
this.Paths = make([]string, v1)
|
|
||||||
for i := 0; i < v1; i++ {
|
|
||||||
this.Paths[i] = string(randStringFieldMask(r))
|
|
||||||
}
|
|
||||||
if !easy && r.Intn(10) != 0 {
|
|
||||||
}
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
type randyFieldMask interface {
|
|
||||||
Float32() float32
|
|
||||||
Float64() float64
|
|
||||||
Int63() int64
|
|
||||||
Int31() int32
|
|
||||||
Uint32() uint32
|
|
||||||
Intn(n int) int
|
|
||||||
}
|
|
||||||
|
|
||||||
func randUTF8RuneFieldMask(r randyFieldMask) rune {
|
|
||||||
ru := r.Intn(62)
|
|
||||||
if ru < 10 {
|
|
||||||
return rune(ru + 48)
|
|
||||||
} else if ru < 36 {
|
|
||||||
return rune(ru + 55)
|
|
||||||
}
|
|
||||||
return rune(ru + 61)
|
|
||||||
}
|
|
||||||
func randStringFieldMask(r randyFieldMask) string {
|
|
||||||
v2 := r.Intn(100)
|
|
||||||
tmps := make([]rune, v2)
|
|
||||||
for i := 0; i < v2; i++ {
|
|
||||||
tmps[i] = randUTF8RuneFieldMask(r)
|
|
||||||
}
|
|
||||||
return string(tmps)
|
|
||||||
}
|
|
||||||
func randUnrecognizedFieldMask(r randyFieldMask, maxFieldNumber int) (dAtA []byte) {
|
|
||||||
l := r.Intn(5)
|
|
||||||
for i := 0; i < l; i++ {
|
|
||||||
wire := r.Intn(4)
|
|
||||||
if wire == 3 {
|
|
||||||
wire = 5
|
|
||||||
}
|
|
||||||
fieldNumber := maxFieldNumber + r.Intn(100)
|
|
||||||
dAtA = randFieldFieldMask(dAtA, r, fieldNumber, wire)
|
|
||||||
}
|
|
||||||
return dAtA
|
|
||||||
}
|
|
||||||
func randFieldFieldMask(dAtA []byte, r randyFieldMask, fieldNumber int, wire int) []byte {
|
|
||||||
key := uint32(fieldNumber)<<3 | uint32(wire)
|
|
||||||
switch wire {
|
|
||||||
case 0:
|
|
||||||
dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key))
|
|
||||||
v3 := r.Int63()
|
|
||||||
if r.Intn(2) == 0 {
|
|
||||||
v3 *= -1
|
|
||||||
}
|
|
||||||
dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(v3))
|
|
||||||
case 1:
|
|
||||||
dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key))
|
|
||||||
dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
|
|
||||||
case 2:
|
|
||||||
dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key))
|
|
||||||
ll := r.Intn(100)
|
|
||||||
dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(ll))
|
|
||||||
for j := 0; j < ll; j++ {
|
|
||||||
dAtA = append(dAtA, byte(r.Intn(256)))
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
dAtA = encodeVarintPopulateFieldMask(dAtA, uint64(key))
|
|
||||||
dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)))
|
|
||||||
}
|
|
||||||
return dAtA
|
|
||||||
}
|
|
||||||
func encodeVarintPopulateFieldMask(dAtA []byte, v uint64) []byte {
|
|
||||||
for v >= 1<<7 {
|
|
||||||
dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80))
|
|
||||||
v >>= 7
|
|
||||||
}
|
|
||||||
dAtA = append(dAtA, uint8(v))
|
|
||||||
return dAtA
|
|
||||||
}
|
|
||||||
func (m *FieldMask) Size() (n int) {
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
if len(m.Paths) > 0 {
|
|
||||||
for _, s := range m.Paths {
|
|
||||||
l = len(s)
|
|
||||||
n += 1 + l + sovFieldMask(uint64(l))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func sovFieldMask(x uint64) (n int) {
|
|
||||||
for {
|
|
||||||
n++
|
|
||||||
x >>= 7
|
|
||||||
if x == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
func sozFieldMask(x uint64) (n int) {
|
|
||||||
return sovFieldMask(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
|
||||||
}
|
|
||||||
func (this *FieldMask) String() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := strings.Join([]string{`&FieldMask{`,
|
|
||||||
`Paths:` + fmt.Sprintf("%v", this.Paths) + `,`,
|
|
||||||
`}`,
|
|
||||||
}, "")
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
func valueToStringFieldMask(v interface{}) string {
|
|
||||||
rv := reflect.ValueOf(v)
|
|
||||||
if rv.IsNil() {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
pv := reflect.Indirect(rv).Interface()
|
|
||||||
return fmt.Sprintf("*%v", pv)
|
|
||||||
}
|
|
||||||
func (m *FieldMask) Unmarshal(dAtA []byte) error {
|
|
||||||
l := len(dAtA)
|
|
||||||
iNdEx := 0
|
|
||||||
for iNdEx < l {
|
|
||||||
preIndex := iNdEx
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowFieldMask
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fieldNum := int32(wire >> 3)
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
if wireType == 4 {
|
|
||||||
return fmt.Errorf("proto: FieldMask: wiretype end group for non-group")
|
|
||||||
}
|
|
||||||
if fieldNum <= 0 {
|
|
||||||
return fmt.Errorf("proto: FieldMask: illegal tag %d (wire type %d)", fieldNum, wire)
|
|
||||||
}
|
|
||||||
switch fieldNum {
|
|
||||||
case 1:
|
|
||||||
if wireType != 2 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Paths", wireType)
|
|
||||||
}
|
|
||||||
var stringLen uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowFieldMask
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
stringLen |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
intStringLen := int(stringLen)
|
|
||||||
if intStringLen < 0 {
|
|
||||||
return ErrInvalidLengthFieldMask
|
|
||||||
}
|
|
||||||
postIndex := iNdEx + intStringLen
|
|
||||||
if postIndex > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
m.Paths = append(m.Paths, string(dAtA[iNdEx:postIndex]))
|
|
||||||
iNdEx = postIndex
|
|
||||||
default:
|
|
||||||
iNdEx = preIndex
|
|
||||||
skippy, err := skipFieldMask(dAtA[iNdEx:])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if skippy < 0 {
|
|
||||||
return ErrInvalidLengthFieldMask
|
|
||||||
}
|
|
||||||
if (iNdEx + skippy) > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
iNdEx += skippy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if iNdEx > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
func skipFieldMask(dAtA []byte) (n int, err error) {
|
|
||||||
l := len(dAtA)
|
|
||||||
iNdEx := 0
|
|
||||||
for iNdEx < l {
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowFieldMask
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
switch wireType {
|
|
||||||
case 0:
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowFieldMask
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
iNdEx++
|
|
||||||
if dAtA[iNdEx-1] < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 1:
|
|
||||||
iNdEx += 8
|
|
||||||
return iNdEx, nil
|
|
||||||
case 2:
|
|
||||||
var length int
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowFieldMask
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
length |= (int(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
iNdEx += length
|
|
||||||
if length < 0 {
|
|
||||||
return 0, ErrInvalidLengthFieldMask
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 3:
|
|
||||||
for {
|
|
||||||
var innerWire uint64
|
|
||||||
var start int = iNdEx
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowFieldMask
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
innerWire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
innerWireType := int(innerWire & 0x7)
|
|
||||||
if innerWireType == 4 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
next, err := skipFieldMask(dAtA[start:])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
iNdEx = start + next
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 4:
|
|
||||||
return iNdEx, nil
|
|
||||||
case 5:
|
|
||||||
iNdEx += 4
|
|
||||||
return iNdEx, nil
|
|
||||||
default:
|
|
||||||
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
panic("unreachable")
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrInvalidLengthFieldMask = fmt.Errorf("proto: negative length found during unmarshaling")
|
|
||||||
ErrIntOverflowFieldMask = fmt.Errorf("proto: integer overflow")
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() { proto.RegisterFile("field_mask.proto", fileDescriptorFieldMask) }
|
|
||||||
|
|
||||||
var fileDescriptorFieldMask = []byte{
|
|
||||||
// 193 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x48, 0xcb, 0x4c, 0xcd,
|
|
||||||
0x49, 0x89, 0xcf, 0x4d, 0x2c, 0xce, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x4f, 0xcf,
|
|
||||||
0xcf, 0x4f, 0xcf, 0x49, 0x85, 0xf0, 0x92, 0x4a, 0xd3, 0x94, 0x14, 0xb9, 0x38, 0xdd, 0x40, 0x8a,
|
|
||||||
0x7c, 0x13, 0x8b, 0xb3, 0x85, 0x44, 0xb8, 0x58, 0x0b, 0x12, 0x4b, 0x32, 0x8a, 0x25, 0x18, 0x15,
|
|
||||||
0x98, 0x35, 0x38, 0x83, 0x20, 0x1c, 0xa7, 0x56, 0xc6, 0x0b, 0x0f, 0xe5, 0x18, 0x6e, 0x3c, 0x94,
|
|
||||||
0x63, 0xf8, 0xf0, 0x50, 0x8e, 0xf1, 0xc7, 0x43, 0x39, 0xc6, 0x86, 0x47, 0x72, 0x8c, 0x2b, 0x1e,
|
|
||||||
0xc9, 0x31, 0x9e, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x2f,
|
|
||||||
0x1e, 0xc9, 0x31, 0x7c, 0x00, 0x89, 0x3f, 0x96, 0x63, 0xe4, 0x12, 0x4e, 0xce, 0xcf, 0xd5, 0x43,
|
|
||||||
0xb3, 0xca, 0x89, 0x0f, 0x6e, 0x51, 0x00, 0x48, 0x28, 0x80, 0x31, 0x8a, 0xb5, 0xa4, 0xb2, 0x20,
|
|
||||||
0xb5, 0x78, 0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88, 0x86, 0x00, 0xa8,
|
|
||||||
0x06, 0xbd, 0xf0, 0xd4, 0x9c, 0x1c, 0xef, 0xbc, 0xfc, 0xf2, 0xbc, 0x10, 0x90, 0xb2, 0x24, 0x36,
|
|
||||||
0xb0, 0x49, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x51, 0x31, 0x89, 0xb5, 0xd6, 0x00, 0x00,
|
|
||||||
0x00,
|
|
||||||
}
|
|
1813
vendor/github.com/gogo/protobuf/types/struct.pb.go
generated
vendored
1813
vendor/github.com/gogo/protobuf/types/struct.pb.go
generated
vendored
File diff suppressed because it is too large
Load Diff
132
vendor/github.com/gogo/protobuf/types/timestamp.go
generated
vendored
132
vendor/github.com/gogo/protobuf/types/timestamp.go
generated
vendored
@ -1,132 +0,0 @@
|
|||||||
// 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 types
|
|
||||||
|
|
||||||
// This file implements operations on google.protobuf.Timestamp.
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
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 *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
|
|
||||||
}
|
|
||||||
|
|
||||||
// TimestampFromProto 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 TimestampFromProto(ts *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)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TimestampNow returns a google.protobuf.Timestamp for the current time.
|
|
||||||
func TimestampNow() *Timestamp {
|
|
||||||
ts, err := TimestampProto(time.Now())
|
|
||||||
if err != nil {
|
|
||||||
panic("ptypes: time.Now() out of Timestamp range")
|
|
||||||
}
|
|
||||||
return 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) (*Timestamp, error) {
|
|
||||||
seconds := t.Unix()
|
|
||||||
nanos := int32(t.Sub(time.Unix(seconds, 0)))
|
|
||||||
ts := &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 *Timestamp) string {
|
|
||||||
t, err := TimestampFromProto(ts)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Sprintf("(%v)", err)
|
|
||||||
}
|
|
||||||
return t.Format(time.RFC3339Nano)
|
|
||||||
}
|
|
504
vendor/github.com/gogo/protobuf/types/timestamp.pb.go
generated
vendored
504
vendor/github.com/gogo/protobuf/types/timestamp.pb.go
generated
vendored
@ -1,504 +0,0 @@
|
|||||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
|
||||||
// source: timestamp.proto
|
|
||||||
|
|
||||||
/*
|
|
||||||
Package types is a generated protocol buffer package.
|
|
||||||
|
|
||||||
It is generated from these files:
|
|
||||||
timestamp.proto
|
|
||||||
|
|
||||||
It has these top-level messages:
|
|
||||||
Timestamp
|
|
||||||
*/
|
|
||||||
package types
|
|
||||||
|
|
||||||
import proto "github.com/gogo/protobuf/proto"
|
|
||||||
import fmt "fmt"
|
|
||||||
import math "math"
|
|
||||||
|
|
||||||
import strings "strings"
|
|
||||||
import reflect "reflect"
|
|
||||||
|
|
||||||
import io "io"
|
|
||||||
|
|
||||||
// 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.GoGoProtoPackageIsVersion2 // 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).
|
|
||||||
//
|
|
||||||
// # Examples
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
// timestamp = Timestamp()
|
|
||||||
// timestamp.GetCurrentTime()
|
|
||||||
//
|
|
||||||
// # JSON Mapping
|
|
||||||
//
|
|
||||||
// In JSON format, the Timestamp type is encoded as a string in the
|
|
||||||
// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
|
|
||||||
// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
|
|
||||||
// where {year} is always expressed using four digits while {month}, {day},
|
|
||||||
// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
|
|
||||||
// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
|
|
||||||
// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
|
|
||||||
// is required, though only UTC (as indicated by "Z") is presently supported.
|
|
||||||
//
|
|
||||||
// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
|
|
||||||
// 01:30 UTC on January 15, 2017.
|
|
||||||
//
|
|
||||||
// In JavaScript, one can convert a Date object to this format using the
|
|
||||||
// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString]
|
|
||||||
// method. In Python, a standard `datetime.datetime` object can be converted
|
|
||||||
// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime)
|
|
||||||
// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one
|
|
||||||
// can use the Joda Time's [`ISODateTimeFormat.dateTime()`](
|
|
||||||
// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime())
|
|
||||||
// to obtain a formatter capable of generating timestamps in this format.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
type Timestamp struct {
|
|
||||||
// Represents seconds of UTC time since Unix epoch
|
|
||||||
// 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
|
|
||||||
// 9999-12-31T23:59:59Z inclusive.
|
|
||||||
Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" 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,proto3" json:"nanos,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Timestamp) Reset() { *m = Timestamp{} }
|
|
||||||
func (*Timestamp) ProtoMessage() {}
|
|
||||||
func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptorTimestamp, []int{0} }
|
|
||||||
func (*Timestamp) XXX_WellKnownType() string { return "Timestamp" }
|
|
||||||
|
|
||||||
func (m *Timestamp) GetSeconds() int64 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Seconds
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Timestamp) GetNanos() int32 {
|
|
||||||
if m != nil {
|
|
||||||
return m.Nanos
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp")
|
|
||||||
}
|
|
||||||
func (this *Timestamp) Compare(that interface{}) int {
|
|
||||||
if that == nil {
|
|
||||||
if this == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
that1, ok := that.(*Timestamp)
|
|
||||||
if !ok {
|
|
||||||
that2, ok := that.(Timestamp)
|
|
||||||
if ok {
|
|
||||||
that1 = &that2
|
|
||||||
} else {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if that1 == nil {
|
|
||||||
if this == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
} else if this == nil {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
if this.Seconds != that1.Seconds {
|
|
||||||
if this.Seconds < that1.Seconds {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
if this.Nanos != that1.Nanos {
|
|
||||||
if this.Nanos < that1.Nanos {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
func (this *Timestamp) Equal(that interface{}) bool {
|
|
||||||
if that == nil {
|
|
||||||
return this == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
that1, ok := that.(*Timestamp)
|
|
||||||
if !ok {
|
|
||||||
that2, ok := that.(Timestamp)
|
|
||||||
if ok {
|
|
||||||
that1 = &that2
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if that1 == nil {
|
|
||||||
return this == nil
|
|
||||||
} else if this == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if this.Seconds != that1.Seconds {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if this.Nanos != that1.Nanos {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
func (this *Timestamp) GoString() string {
|
|
||||||
if this == nil {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
s := make([]string, 0, 6)
|
|
||||||
s = append(s, "&types.Timestamp{")
|
|
||||||
s = append(s, "Seconds: "+fmt.Sprintf("%#v", this.Seconds)+",\n")
|
|
||||||
s = append(s, "Nanos: "+fmt.Sprintf("%#v", this.Nanos)+",\n")
|
|
||||||
s = append(s, "}")
|
|
||||||
return strings.Join(s, "")
|
|
||||||
}
|
|
||||||
func valueToGoStringTimestamp(v interface{}, typ string) string {
|
|
||||||
rv := reflect.ValueOf(v)
|
|
||||||
if rv.IsNil() {
|
|
||||||
return "nil"
|
|
||||||
}
|
|
||||||
pv := reflect.Indirect(rv).Interface()
|
|
||||||
return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv)
|
|
||||||
}
|
|
||||||
func (m *Timestamp) Marshal() (dAtA []byte, err error) {
|
|
||||||
size := m.Size()
|
|
||||||
dAtA = make([]byte, size)
|
|
||||||
n, err := m.MarshalTo(dAtA)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return dAtA[:n], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Timestamp) MarshalTo(dAtA []byte) (int, error) {
|
|
||||||
var i int
|
|
||||||
_ = i
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
if m.Seconds != 0 {
|
|
||||||
dAtA[i] = 0x8
|
|
||||||
i++
|
|
||||||
i = encodeVarintTimestamp(dAtA, i, uint64(m.Seconds))
|
|
||||||
}
|
|
||||||
if m.Nanos != 0 {
|
|
||||||
dAtA[i] = 0x10
|
|
||||||
i++
|
|
||||||
i = encodeVarintTimestamp(dAtA, i, uint64(m.Nanos))
|
|
||||||
}
|
|
||||||
return i, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func encodeVarintTimestamp(dAtA []byte, offset int, v uint64) int {
|
|
||||||
for v >= 1<<7 {
|
|
||||||
dAtA[offset] = uint8(v&0x7f | 0x80)
|
|
||||||
v >>= 7
|
|
||||||
offset++
|
|
||||||
}
|
|
||||||
dAtA[offset] = uint8(v)
|
|
||||||
return offset + 1
|
|
||||||
}
|
|
||||||
func (m *Timestamp) Size() (n int) {
|
|
||||||
var l int
|
|
||||||
_ = l
|
|
||||||
if m.Seconds != 0 {
|
|
||||||
n += 1 + sovTimestamp(uint64(m.Seconds))
|
|
||||||
}
|
|
||||||
if m.Nanos != 0 {
|
|
||||||
n += 1 + sovTimestamp(uint64(m.Nanos))
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func sovTimestamp(x uint64) (n int) {
|
|
||||||
for {
|
|
||||||
n++
|
|
||||||
x >>= 7
|
|
||||||
if x == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
func sozTimestamp(x uint64) (n int) {
|
|
||||||
return sovTimestamp(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
|
||||||
}
|
|
||||||
func (m *Timestamp) Unmarshal(dAtA []byte) error {
|
|
||||||
l := len(dAtA)
|
|
||||||
iNdEx := 0
|
|
||||||
for iNdEx < l {
|
|
||||||
preIndex := iNdEx
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowTimestamp
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fieldNum := int32(wire >> 3)
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
if wireType == 4 {
|
|
||||||
return fmt.Errorf("proto: Timestamp: wiretype end group for non-group")
|
|
||||||
}
|
|
||||||
if fieldNum <= 0 {
|
|
||||||
return fmt.Errorf("proto: Timestamp: illegal tag %d (wire type %d)", fieldNum, wire)
|
|
||||||
}
|
|
||||||
switch fieldNum {
|
|
||||||
case 1:
|
|
||||||
if wireType != 0 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Seconds", wireType)
|
|
||||||
}
|
|
||||||
m.Seconds = 0
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowTimestamp
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
m.Seconds |= (int64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case 2:
|
|
||||||
if wireType != 0 {
|
|
||||||
return fmt.Errorf("proto: wrong wireType = %d for field Nanos", wireType)
|
|
||||||
}
|
|
||||||
m.Nanos = 0
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return ErrIntOverflowTimestamp
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
m.Nanos |= (int32(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
iNdEx = preIndex
|
|
||||||
skippy, err := skipTimestamp(dAtA[iNdEx:])
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if skippy < 0 {
|
|
||||||
return ErrInvalidLengthTimestamp
|
|
||||||
}
|
|
||||||
if (iNdEx + skippy) > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
iNdEx += skippy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if iNdEx > l {
|
|
||||||
return io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
func skipTimestamp(dAtA []byte) (n int, err error) {
|
|
||||||
l := len(dAtA)
|
|
||||||
iNdEx := 0
|
|
||||||
for iNdEx < l {
|
|
||||||
var wire uint64
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowTimestamp
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
wire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wireType := int(wire & 0x7)
|
|
||||||
switch wireType {
|
|
||||||
case 0:
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowTimestamp
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
iNdEx++
|
|
||||||
if dAtA[iNdEx-1] < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 1:
|
|
||||||
iNdEx += 8
|
|
||||||
return iNdEx, nil
|
|
||||||
case 2:
|
|
||||||
var length int
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowTimestamp
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
length |= (int(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
iNdEx += length
|
|
||||||
if length < 0 {
|
|
||||||
return 0, ErrInvalidLengthTimestamp
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 3:
|
|
||||||
for {
|
|
||||||
var innerWire uint64
|
|
||||||
var start int = iNdEx
|
|
||||||
for shift := uint(0); ; shift += 7 {
|
|
||||||
if shift >= 64 {
|
|
||||||
return 0, ErrIntOverflowTimestamp
|
|
||||||
}
|
|
||||||
if iNdEx >= l {
|
|
||||||
return 0, io.ErrUnexpectedEOF
|
|
||||||
}
|
|
||||||
b := dAtA[iNdEx]
|
|
||||||
iNdEx++
|
|
||||||
innerWire |= (uint64(b) & 0x7F) << shift
|
|
||||||
if b < 0x80 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
innerWireType := int(innerWire & 0x7)
|
|
||||||
if innerWireType == 4 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
next, err := skipTimestamp(dAtA[start:])
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
iNdEx = start + next
|
|
||||||
}
|
|
||||||
return iNdEx, nil
|
|
||||||
case 4:
|
|
||||||
return iNdEx, nil
|
|
||||||
case 5:
|
|
||||||
iNdEx += 4
|
|
||||||
return iNdEx, nil
|
|
||||||
default:
|
|
||||||
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
panic("unreachable")
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrInvalidLengthTimestamp = fmt.Errorf("proto: negative length found during unmarshaling")
|
|
||||||
ErrIntOverflowTimestamp = fmt.Errorf("proto: integer overflow")
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() { proto.RegisterFile("timestamp.proto", fileDescriptorTimestamp) }
|
|
||||||
|
|
||||||
var fileDescriptorTimestamp = []byte{
|
|
||||||
// 205 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2f, 0xc9, 0xcc, 0x4d,
|
|
||||||
0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x4f, 0xcf, 0xcf,
|
|
||||||
0x4f, 0xcf, 0x49, 0x85, 0xf0, 0x92, 0x4a, 0xd3, 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, 0x81, 0xf1, 0xc2, 0x43, 0x39, 0x86, 0x1b, 0x0f, 0xe5, 0x18,
|
|
||||||
0x3e, 0x3c, 0x94, 0x63, 0x5c, 0xf1, 0x48, 0x8e, 0xf1, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4,
|
|
||||||
0x18, 0x1f, 0x3c, 0x92, 0x63, 0x7c, 0xf1, 0x48, 0x8e, 0xe1, 0xc3, 0x23, 0x39, 0xc6, 0x15, 0x8f,
|
|
||||||
0xe5, 0x18, 0xb9, 0x84, 0x93, 0xf3, 0x73, 0xf5, 0xd0, 0x2c, 0x77, 0xe2, 0x83, 0x5b, 0x1d, 0x00,
|
|
||||||
0x12, 0x0a, 0x60, 0x8c, 0x62, 0x2d, 0xa9, 0x2c, 0x48, 0x2d, 0xfe, 0xc1, 0xc8, 0xb8, 0x88, 0x89,
|
|
||||||
0xd9, 0x3d, 0xc0, 0x69, 0x15, 0x93, 0x9c, 0x3b, 0x44, 0x4f, 0x00, 0x54, 0x8f, 0x5e, 0x78, 0x6a,
|
|
||||||
0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x65, 0x12, 0x1b, 0xd8, 0x30, 0x63, 0x40,
|
|
||||||
0x00, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xa2, 0x42, 0xda, 0xea, 0x00, 0x00, 0x00,
|
|
||||||
}
|
|
94
vendor/github.com/gogo/protobuf/types/timestamp_gogo.go
generated
vendored
94
vendor/github.com/gogo/protobuf/types/timestamp_gogo.go
generated
vendored
@ -1,94 +0,0 @@
|
|||||||
// Protocol Buffers for Go with Gadgets
|
|
||||||
//
|
|
||||||
// Copyright (c) 2016, The GoGo Authors. All rights reserved.
|
|
||||||
// http://github.com/gogo/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.
|
|
||||||
//
|
|
||||||
// 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 types
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func NewPopulatedTimestamp(r interface {
|
|
||||||
Int63() int64
|
|
||||||
}, easy bool) *Timestamp {
|
|
||||||
this := &Timestamp{}
|
|
||||||
ns := int64(r.Int63())
|
|
||||||
this.Seconds = ns / 1e9
|
|
||||||
this.Nanos = int32(ns % 1e9)
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ts *Timestamp) String() string {
|
|
||||||
return TimestampString(ts)
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewPopulatedStdTime(r interface {
|
|
||||||
Int63() int64
|
|
||||||
}, easy bool) *time.Time {
|
|
||||||
timestamp := NewPopulatedTimestamp(r, easy)
|
|
||||||
t, err := TimestampFromProto(timestamp)
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &t
|
|
||||||
}
|
|
||||||
|
|
||||||
func SizeOfStdTime(t time.Time) int {
|
|
||||||
ts, err := TimestampProto(t)
|
|
||||||
if err != nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return ts.Size()
|
|
||||||
}
|
|
||||||
|
|
||||||
func StdTimeMarshal(t time.Time) ([]byte, error) {
|
|
||||||
size := SizeOfStdTime(t)
|
|
||||||
buf := make([]byte, size)
|
|
||||||
_, err := StdTimeMarshalTo(t, buf)
|
|
||||||
return buf, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func StdTimeMarshalTo(t time.Time, data []byte) (int, error) {
|
|
||||||
ts, err := TimestampProto(t)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return ts.MarshalTo(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
func StdTimeUnmarshal(t *time.Time, data []byte) error {
|
|
||||||
ts := &Timestamp{}
|
|
||||||
if err := ts.Unmarshal(data); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
tt, err := TimestampFromProto(ts)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
*t = tt
|
|
||||||
return nil
|
|
||||||
}
|
|
152
vendor/github.com/gogo/protobuf/types/timestamp_test.go
generated
vendored
152
vendor/github.com/gogo/protobuf/types/timestamp_test.go
generated
vendored
@ -1,152 +0,0 @@
|
|||||||
// 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 types
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/gogo/protobuf/proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
var tests = []struct {
|
|
||||||
ts *Timestamp
|
|
||||||
valid bool
|
|
||||||
t time.Time
|
|
||||||
}{
|
|
||||||
// The timestamp representing the Unix epoch date.
|
|
||||||
{&Timestamp{Seconds: 0, Nanos: 0}, true, utcDate(1970, 1, 1)},
|
|
||||||
// The smallest representable timestamp.
|
|
||||||
{&Timestamp{Seconds: math.MinInt64, Nanos: math.MinInt32}, false,
|
|
||||||
time.Unix(math.MinInt64, math.MinInt32).UTC()},
|
|
||||||
// The smallest representable timestamp with non-negative nanos.
|
|
||||||
{&Timestamp{Seconds: math.MinInt64, Nanos: 0}, false, time.Unix(math.MinInt64, 0).UTC()},
|
|
||||||
// The earliest valid timestamp.
|
|
||||||
{&Timestamp{Seconds: minValidSeconds, Nanos: 0}, true, utcDate(1, 1, 1)},
|
|
||||||
//"0001-01-01T00:00:00Z"},
|
|
||||||
// The largest representable timestamp.
|
|
||||||
{&Timestamp{Seconds: math.MaxInt64, Nanos: math.MaxInt32}, false,
|
|
||||||
time.Unix(math.MaxInt64, math.MaxInt32).UTC()},
|
|
||||||
// The largest representable timestamp with nanos in range.
|
|
||||||
{&Timestamp{Seconds: math.MaxInt64, Nanos: 1e9 - 1}, false,
|
|
||||||
time.Unix(math.MaxInt64, 1e9-1).UTC()},
|
|
||||||
// The largest valid timestamp.
|
|
||||||
{&Timestamp{Seconds: maxValidSeconds - 1, Nanos: 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.
|
|
||||||
{&Timestamp{Seconds: maxValidSeconds, Nanos: 0}, false, time.Unix(maxValidSeconds, 0).UTC()},
|
|
||||||
// A date before the epoch.
|
|
||||||
{&Timestamp{Seconds: -281836800, Nanos: 0}, true, utcDate(1961, 1, 26)},
|
|
||||||
// A date after the epoch.
|
|
||||||
{&Timestamp{Seconds: 1296000000, Nanos: 0}, true, utcDate(2011, 1, 26)},
|
|
||||||
// A date after the epoch, in the middle of the day.
|
|
||||||
{&Timestamp{Seconds: 1296012345, Nanos: 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 TestTimestampFromProto(t *testing.T) {
|
|
||||||
for _, s := range tests {
|
|
||||||
got, err := TimestampFromProto(s.ts)
|
|
||||||
if (err == nil) != s.valid {
|
|
||||||
t.Errorf("TimestampFromProto(%v) error = %v, but valid = %t", s.ts, err, s.valid)
|
|
||||||
} else if s.valid && got != s.t {
|
|
||||||
t.Errorf("TimestampFromProto(%v) = %v, want %v", s.ts, got, s.t)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Special case: a nil TimestampFromProto is an error, but returns the 0 Unix time.
|
|
||||||
got, err := TimestampFromProto(nil)
|
|
||||||
want := time.Unix(0, 0).UTC()
|
|
||||||
if got != want {
|
|
||||||
t.Errorf("TimestampFromProto(nil) = %v, want %v", got, want)
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
t.Errorf("TimestampFromProto(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 *Timestamp
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
// Not much testing needed because presumably time.Format is
|
|
||||||
// well-tested.
|
|
||||||
{&Timestamp{Seconds: 0, Nanos: 0}, "1970-01-01T00:00:00Z"},
|
|
||||||
{&Timestamp{Seconds: minValidSeconds - 1, Nanos: 0}, "(timestamp: &types.Timestamp{Seconds: -62135596801,\nNanos: 0,\n} 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)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTimestampNow(t *testing.T) {
|
|
||||||
// Bracket the expected time.
|
|
||||||
before := time.Now()
|
|
||||||
ts := TimestampNow()
|
|
||||||
after := time.Now()
|
|
||||||
|
|
||||||
tm, err := TimestampFromProto(ts)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("between %v and %v\nTimestampNow() = %v\nwhich is invalid (%v)", before, after, ts, err)
|
|
||||||
}
|
|
||||||
if tm.Before(before) || tm.After(after) {
|
|
||||||
t.Errorf("between %v and %v\nTimestamp(TimestampNow()) = %v", before, after, tm)
|
|
||||||
}
|
|
||||||
}
|
|
2180
vendor/github.com/gogo/protobuf/types/wrappers.pb.go
generated
vendored
2180
vendor/github.com/gogo/protobuf/types/wrappers.pb.go
generated
vendored
File diff suppressed because it is too large
Load Diff
43
vendor/github.com/golang/protobuf/proto/Makefile
generated
vendored
43
vendor/github.com/golang/protobuf/proto/Makefile
generated
vendored
@ -1,43 +0,0 @@
|
|||||||
# 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
|
|
522
vendor/github.com/golang/protobuf/proto/all_test.go
generated
vendored
522
vendor/github.com/golang/protobuf/proto/all_test.go
generated
vendored
@ -41,11 +41,12 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
. "github.com/golang/protobuf/proto"
|
. "github.com/golang/protobuf/proto"
|
||||||
. "github.com/golang/protobuf/proto/testdata"
|
. "github.com/golang/protobuf/proto/test_proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
var globalO *Buffer
|
var globalO *Buffer
|
||||||
@ -114,6 +115,8 @@ func initGoTest(setdefaults bool) *GoTest {
|
|||||||
pb.F_BytesDefaulted = Default_GoTest_F_BytesDefaulted
|
pb.F_BytesDefaulted = Default_GoTest_F_BytesDefaulted
|
||||||
pb.F_Sint32Defaulted = Int32(Default_GoTest_F_Sint32Defaulted)
|
pb.F_Sint32Defaulted = Int32(Default_GoTest_F_Sint32Defaulted)
|
||||||
pb.F_Sint64Defaulted = Int64(Default_GoTest_F_Sint64Defaulted)
|
pb.F_Sint64Defaulted = Int64(Default_GoTest_F_Sint64Defaulted)
|
||||||
|
pb.F_Sfixed32Defaulted = Int32(Default_GoTest_F_Sfixed32Defaulted)
|
||||||
|
pb.F_Sfixed64Defaulted = Int64(Default_GoTest_F_Sfixed64Defaulted)
|
||||||
}
|
}
|
||||||
|
|
||||||
pb.Kind = GoTest_TIME.Enum()
|
pb.Kind = GoTest_TIME.Enum()
|
||||||
@ -131,135 +134,13 @@ func initGoTest(setdefaults bool) *GoTest {
|
|||||||
pb.F_BytesRequired = []byte("bytes")
|
pb.F_BytesRequired = []byte("bytes")
|
||||||
pb.F_Sint32Required = Int32(-32)
|
pb.F_Sint32Required = Int32(-32)
|
||||||
pb.F_Sint64Required = Int64(-64)
|
pb.F_Sint64Required = Int64(-64)
|
||||||
|
pb.F_Sfixed32Required = Int32(-32)
|
||||||
|
pb.F_Sfixed64Required = Int64(-64)
|
||||||
pb.Requiredgroup = initGoTest_RequiredGroup()
|
pb.Requiredgroup = initGoTest_RequiredGroup()
|
||||||
|
|
||||||
return pb
|
return pb
|
||||||
}
|
}
|
||||||
|
|
||||||
func fail(msg string, b *bytes.Buffer, s string, t *testing.T) {
|
|
||||||
data := b.Bytes()
|
|
||||||
ld := len(data)
|
|
||||||
ls := len(s) / 2
|
|
||||||
|
|
||||||
fmt.Printf("fail %s ld=%d ls=%d\n", msg, ld, ls)
|
|
||||||
|
|
||||||
// find the interesting spot - n
|
|
||||||
n := ls
|
|
||||||
if ld < ls {
|
|
||||||
n = ld
|
|
||||||
}
|
|
||||||
j := 0
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
bs := hex(s[j])*16 + hex(s[j+1])
|
|
||||||
j += 2
|
|
||||||
if data[i] == bs {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
n = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
l := n - 10
|
|
||||||
if l < 0 {
|
|
||||||
l = 0
|
|
||||||
}
|
|
||||||
h := n + 10
|
|
||||||
|
|
||||||
// find the interesting spot - n
|
|
||||||
fmt.Printf("is[%d]:", l)
|
|
||||||
for i := l; i < h; i++ {
|
|
||||||
if i >= ld {
|
|
||||||
fmt.Printf(" --")
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Printf(" %.2x", data[i])
|
|
||||||
}
|
|
||||||
fmt.Printf("\n")
|
|
||||||
|
|
||||||
fmt.Printf("sb[%d]:", l)
|
|
||||||
for i := l; i < h; i++ {
|
|
||||||
if i >= ls {
|
|
||||||
fmt.Printf(" --")
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
bs := hex(s[j])*16 + hex(s[j+1])
|
|
||||||
j += 2
|
|
||||||
fmt.Printf(" %.2x", bs)
|
|
||||||
}
|
|
||||||
fmt.Printf("\n")
|
|
||||||
|
|
||||||
t.Fail()
|
|
||||||
|
|
||||||
// t.Errorf("%s: \ngood: %s\nbad: %x", msg, s, b.Bytes())
|
|
||||||
// Print the output in a partially-decoded format; can
|
|
||||||
// be helpful when updating the test. It produces the output
|
|
||||||
// that is pasted, with minor edits, into the argument to verify().
|
|
||||||
// data := b.Bytes()
|
|
||||||
// nesting := 0
|
|
||||||
// for b.Len() > 0 {
|
|
||||||
// start := len(data) - b.Len()
|
|
||||||
// var u uint64
|
|
||||||
// u, err := DecodeVarint(b)
|
|
||||||
// if err != nil {
|
|
||||||
// fmt.Printf("decode error on varint:", err)
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
// wire := u & 0x7
|
|
||||||
// tag := u >> 3
|
|
||||||
// switch wire {
|
|
||||||
// case WireVarint:
|
|
||||||
// v, err := DecodeVarint(b)
|
|
||||||
// if err != nil {
|
|
||||||
// fmt.Printf("decode error on varint:", err)
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
// fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n",
|
|
||||||
// data[start:len(data)-b.Len()], tag, wire, v)
|
|
||||||
// case WireFixed32:
|
|
||||||
// v, err := DecodeFixed32(b)
|
|
||||||
// if err != nil {
|
|
||||||
// fmt.Printf("decode error on fixed32:", err)
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
// fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n",
|
|
||||||
// data[start:len(data)-b.Len()], tag, wire, v)
|
|
||||||
// case WireFixed64:
|
|
||||||
// v, err := DecodeFixed64(b)
|
|
||||||
// if err != nil {
|
|
||||||
// fmt.Printf("decode error on fixed64:", err)
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
// fmt.Printf("\t\t\"%x\" // field %d, encoding %d, value %d\n",
|
|
||||||
// data[start:len(data)-b.Len()], tag, wire, v)
|
|
||||||
// case WireBytes:
|
|
||||||
// nb, err := DecodeVarint(b)
|
|
||||||
// if err != nil {
|
|
||||||
// fmt.Printf("decode error on bytes:", err)
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
// after_tag := len(data) - b.Len()
|
|
||||||
// str := make([]byte, nb)
|
|
||||||
// _, err = b.Read(str)
|
|
||||||
// if err != nil {
|
|
||||||
// fmt.Printf("decode error on bytes:", err)
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
// fmt.Printf("\t\t\"%x\" \"%x\" // field %d, encoding %d (FIELD)\n",
|
|
||||||
// data[start:after_tag], str, tag, wire)
|
|
||||||
// case WireStartGroup:
|
|
||||||
// nesting++
|
|
||||||
// fmt.Printf("\t\t\"%x\"\t\t// start group field %d level %d\n",
|
|
||||||
// data[start:len(data)-b.Len()], tag, nesting)
|
|
||||||
// case WireEndGroup:
|
|
||||||
// fmt.Printf("\t\t\"%x\"\t\t// end group field %d level %d\n",
|
|
||||||
// data[start:len(data)-b.Len()], tag, nesting)
|
|
||||||
// nesting--
|
|
||||||
// default:
|
|
||||||
// fmt.Printf("unrecognized wire type %d\n", wire)
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
func hex(c uint8) uint8 {
|
func hex(c uint8) uint8 {
|
||||||
if '0' <= c && c <= '9' {
|
if '0' <= c && c <= '9' {
|
||||||
return c - '0'
|
return c - '0'
|
||||||
@ -482,6 +363,48 @@ func TestMarshalerEncoding(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure that Buffer.Marshal uses O(N) memory for N messages
|
||||||
|
func TestBufferMarshalAllocs(t *testing.T) {
|
||||||
|
value := &OtherMessage{Key: Int64(1)}
|
||||||
|
msg := &MyMessage{Count: Int32(1), Others: []*OtherMessage{value}}
|
||||||
|
|
||||||
|
reallocSize := func(t *testing.T, items int, prealloc int) (int64, int64) {
|
||||||
|
var b Buffer
|
||||||
|
b.SetBuf(make([]byte, 0, prealloc))
|
||||||
|
|
||||||
|
var allocSpace int64
|
||||||
|
prevCap := cap(b.Bytes())
|
||||||
|
for i := 0; i < items; i++ {
|
||||||
|
err := b.Marshal(msg)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Marshal err = %q", err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if c := cap(b.Bytes()); prevCap != c {
|
||||||
|
allocSpace += int64(c)
|
||||||
|
prevCap = c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
needSpace := int64(len(b.Bytes()))
|
||||||
|
return allocSpace, needSpace
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, prealloc := range []int{0, 100, 10000} {
|
||||||
|
for _, items := range []int{1, 2, 5, 10, 20, 50, 100, 200, 500, 1000} {
|
||||||
|
runtimeSpace, need := reallocSize(t, items, prealloc)
|
||||||
|
totalSpace := int64(prealloc) + runtimeSpace
|
||||||
|
|
||||||
|
runtimeRatio := float64(runtimeSpace) / float64(need)
|
||||||
|
totalRatio := float64(totalSpace) / float64(need)
|
||||||
|
|
||||||
|
if totalRatio < 1 || runtimeRatio > 4 {
|
||||||
|
t.Errorf("needed %dB, allocated %dB total (ratio %.1f), allocated %dB at runtime (ratio %.1f)",
|
||||||
|
need, totalSpace, totalRatio, runtimeSpace, runtimeRatio)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Simple tests for bytes
|
// Simple tests for bytes
|
||||||
func TestBytesPrimitives(t *testing.T) {
|
func TestBytesPrimitives(t *testing.T) {
|
||||||
o := old()
|
o := old()
|
||||||
@ -519,7 +442,7 @@ func TestRequiredBit(t *testing.T) {
|
|||||||
err := o.Marshal(pb)
|
err := o.Marshal(pb)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Error("did not catch missing required fields")
|
t.Error("did not catch missing required fields")
|
||||||
} else if strings.Index(err.Error(), "Kind") < 0 {
|
} else if !strings.Contains(err.Error(), "Kind") {
|
||||||
t.Error("wrong error type:", err)
|
t.Error("wrong error type:", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -612,7 +535,9 @@ func TestEncodeDecode1(t *testing.T) {
|
|||||||
"b404"+ // field 70, encoding 4, end group
|
"b404"+ // field 70, encoding 4, end group
|
||||||
"aa0605"+"6279746573"+ // field 101, encoding 2, string "bytes"
|
"aa0605"+"6279746573"+ // field 101, encoding 2, string "bytes"
|
||||||
"b0063f"+ // field 102, encoding 0, 0x3f zigzag32
|
"b0063f"+ // field 102, encoding 0, 0x3f zigzag32
|
||||||
"b8067f") // field 103, encoding 0, 0x7f zigzag64
|
"b8067f"+ // field 103, encoding 0, 0x7f zigzag64
|
||||||
|
"c506e0ffffff"+ // field 104, encoding 5, -32 fixed32
|
||||||
|
"c906c0ffffffffffffff") // field 105, encoding 1, -64 fixed64
|
||||||
}
|
}
|
||||||
|
|
||||||
// All required fields set, defaults provided.
|
// All required fields set, defaults provided.
|
||||||
@ -647,9 +572,13 @@ func TestEncodeDecode2(t *testing.T) {
|
|||||||
"aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes"
|
"aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes"
|
||||||
"b0063f"+ // field 102, encoding 0, 0x3f zigzag32
|
"b0063f"+ // field 102, encoding 0, 0x3f zigzag32
|
||||||
"b8067f"+ // field 103, encoding 0, 0x7f zigzag64
|
"b8067f"+ // field 103, encoding 0, 0x7f zigzag64
|
||||||
|
"c506e0ffffff"+ // field 104, encoding 5, -32 fixed32
|
||||||
|
"c906c0ffffffffffffff"+ // field 105, encoding 1, -64 fixed64
|
||||||
"8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose"
|
"8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose"
|
||||||
"90193f"+ // field 402, encoding 0, value 63
|
"90193f"+ // field 402, encoding 0, value 63
|
||||||
"98197f") // field 403, encoding 0, value 127
|
"98197f"+ // field 403, encoding 0, value 127
|
||||||
|
"a519e0ffffff"+ // field 404, encoding 5, -32 fixed32
|
||||||
|
"a919c0ffffffffffffff") // field 405, encoding 1, -64 fixed64
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -669,6 +598,8 @@ func TestEncodeDecode3(t *testing.T) {
|
|||||||
pb.F_BytesDefaulted = []byte("Bignose")
|
pb.F_BytesDefaulted = []byte("Bignose")
|
||||||
pb.F_Sint32Defaulted = Int32(-32)
|
pb.F_Sint32Defaulted = Int32(-32)
|
||||||
pb.F_Sint64Defaulted = Int64(-64)
|
pb.F_Sint64Defaulted = Int64(-64)
|
||||||
|
pb.F_Sfixed32Defaulted = Int32(-32)
|
||||||
|
pb.F_Sfixed64Defaulted = Int64(-64)
|
||||||
|
|
||||||
overify(t, pb,
|
overify(t, pb,
|
||||||
"0807"+ // field 1, encoding 0, value 7
|
"0807"+ // field 1, encoding 0, value 7
|
||||||
@ -699,9 +630,13 @@ func TestEncodeDecode3(t *testing.T) {
|
|||||||
"aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes"
|
"aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes"
|
||||||
"b0063f"+ // field 102, encoding 0, 0x3f zigzag32
|
"b0063f"+ // field 102, encoding 0, 0x3f zigzag32
|
||||||
"b8067f"+ // field 103, encoding 0, 0x7f zigzag64
|
"b8067f"+ // field 103, encoding 0, 0x7f zigzag64
|
||||||
|
"c506e0ffffff"+ // field 104, encoding 5, -32 fixed32
|
||||||
|
"c906c0ffffffffffffff"+ // field 105, encoding 1, -64 fixed64
|
||||||
"8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose"
|
"8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose"
|
||||||
"90193f"+ // field 402, encoding 0, value 63
|
"90193f"+ // field 402, encoding 0, value 63
|
||||||
"98197f") // field 403, encoding 0, value 127
|
"98197f"+ // field 403, encoding 0, value 127
|
||||||
|
"a519e0ffffff"+ // field 404, encoding 5, -32 fixed32
|
||||||
|
"a919c0ffffffffffffff") // field 405, encoding 1, -64 fixed64
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -724,6 +659,8 @@ func TestEncodeDecode4(t *testing.T) {
|
|||||||
pb.F_BytesOptional = []byte("Bignose")
|
pb.F_BytesOptional = []byte("Bignose")
|
||||||
pb.F_Sint32Optional = Int32(-32)
|
pb.F_Sint32Optional = Int32(-32)
|
||||||
pb.F_Sint64Optional = Int64(-64)
|
pb.F_Sint64Optional = Int64(-64)
|
||||||
|
pb.F_Sfixed32Optional = Int32(-32)
|
||||||
|
pb.F_Sfixed64Optional = Int64(-64)
|
||||||
pb.Optionalgroup = initGoTest_OptionalGroup()
|
pb.Optionalgroup = initGoTest_OptionalGroup()
|
||||||
|
|
||||||
overify(t, pb,
|
overify(t, pb,
|
||||||
@ -771,12 +708,18 @@ func TestEncodeDecode4(t *testing.T) {
|
|||||||
"aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes"
|
"aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes"
|
||||||
"b0063f"+ // field 102, encoding 0, 0x3f zigzag32
|
"b0063f"+ // field 102, encoding 0, 0x3f zigzag32
|
||||||
"b8067f"+ // field 103, encoding 0, 0x7f zigzag64
|
"b8067f"+ // field 103, encoding 0, 0x7f zigzag64
|
||||||
|
"c506e0ffffff"+ // field 104, encoding 5, -32 fixed32
|
||||||
|
"c906c0ffffffffffffff"+ // field 105, encoding 1, -64 fixed64
|
||||||
"ea1207"+"4269676e6f7365"+ // field 301, encoding 2, string "Bignose"
|
"ea1207"+"4269676e6f7365"+ // field 301, encoding 2, string "Bignose"
|
||||||
"f0123f"+ // field 302, encoding 0, value 63
|
"f0123f"+ // field 302, encoding 0, value 63
|
||||||
"f8127f"+ // field 303, encoding 0, value 127
|
"f8127f"+ // field 303, encoding 0, value 127
|
||||||
|
"8513e0ffffff"+ // field 304, encoding 5, -32 fixed32
|
||||||
|
"8913c0ffffffffffffff"+ // field 305, encoding 1, -64 fixed64
|
||||||
"8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose"
|
"8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose"
|
||||||
"90193f"+ // field 402, encoding 0, value 63
|
"90193f"+ // field 402, encoding 0, value 63
|
||||||
"98197f") // field 403, encoding 0, value 127
|
"98197f"+ // field 403, encoding 0, value 127
|
||||||
|
"a519e0ffffff"+ // field 404, encoding 5, -32 fixed32
|
||||||
|
"a919c0ffffffffffffff") // field 405, encoding 1, -64 fixed64
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -797,6 +740,8 @@ func TestEncodeDecode5(t *testing.T) {
|
|||||||
pb.F_BytesRepeated = [][]byte{[]byte("big"), []byte("nose")}
|
pb.F_BytesRepeated = [][]byte{[]byte("big"), []byte("nose")}
|
||||||
pb.F_Sint32Repeated = []int32{32, -32}
|
pb.F_Sint32Repeated = []int32{32, -32}
|
||||||
pb.F_Sint64Repeated = []int64{64, -64}
|
pb.F_Sint64Repeated = []int64{64, -64}
|
||||||
|
pb.F_Sfixed32Repeated = []int32{32, -32}
|
||||||
|
pb.F_Sfixed64Repeated = []int64{64, -64}
|
||||||
pb.Repeatedgroup = []*GoTest_RepeatedGroup{initGoTest_RepeatedGroup(), initGoTest_RepeatedGroup()}
|
pb.Repeatedgroup = []*GoTest_RepeatedGroup{initGoTest_RepeatedGroup(), initGoTest_RepeatedGroup()}
|
||||||
|
|
||||||
overify(t, pb,
|
overify(t, pb,
|
||||||
@ -856,15 +801,23 @@ func TestEncodeDecode5(t *testing.T) {
|
|||||||
"aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes"
|
"aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes"
|
||||||
"b0063f"+ // field 102, encoding 0, 0x3f zigzag32
|
"b0063f"+ // field 102, encoding 0, 0x3f zigzag32
|
||||||
"b8067f"+ // field 103, encoding 0, 0x7f zigzag64
|
"b8067f"+ // field 103, encoding 0, 0x7f zigzag64
|
||||||
|
"c506e0ffffff"+ // field 104, encoding 5, -32 fixed32
|
||||||
|
"c906c0ffffffffffffff"+ // field 105, encoding 1, -64 fixed64
|
||||||
"ca0c03"+"626967"+ // field 201, encoding 2, string "big"
|
"ca0c03"+"626967"+ // field 201, encoding 2, string "big"
|
||||||
"ca0c04"+"6e6f7365"+ // field 201, encoding 2, string "nose"
|
"ca0c04"+"6e6f7365"+ // field 201, encoding 2, string "nose"
|
||||||
"d00c40"+ // field 202, encoding 0, value 32
|
"d00c40"+ // field 202, encoding 0, value 32
|
||||||
"d00c3f"+ // field 202, encoding 0, value -32
|
"d00c3f"+ // field 202, encoding 0, value -32
|
||||||
"d80c8001"+ // field 203, encoding 0, value 64
|
"d80c8001"+ // field 203, encoding 0, value 64
|
||||||
"d80c7f"+ // field 203, encoding 0, value -64
|
"d80c7f"+ // field 203, encoding 0, value -64
|
||||||
|
"e50c20000000"+ // field 204, encoding 5, 32 fixed32
|
||||||
|
"e50ce0ffffff"+ // field 204, encoding 5, -32 fixed32
|
||||||
|
"e90c4000000000000000"+ // field 205, encoding 1, 64 fixed64
|
||||||
|
"e90cc0ffffffffffffff"+ // field 205, encoding 1, -64 fixed64
|
||||||
"8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose"
|
"8a1907"+"4269676e6f7365"+ // field 401, encoding 2, string "Bignose"
|
||||||
"90193f"+ // field 402, encoding 0, value 63
|
"90193f"+ // field 402, encoding 0, value 63
|
||||||
"98197f") // field 403, encoding 0, value 127
|
"98197f"+ // field 403, encoding 0, value 127
|
||||||
|
"a519e0ffffff"+ // field 404, encoding 5, -32 fixed32
|
||||||
|
"a919c0ffffffffffffff") // field 405, encoding 1, -64 fixed64
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -882,6 +835,8 @@ func TestEncodeDecode6(t *testing.T) {
|
|||||||
pb.F_DoubleRepeatedPacked = []float64{64., 65.}
|
pb.F_DoubleRepeatedPacked = []float64{64., 65.}
|
||||||
pb.F_Sint32RepeatedPacked = []int32{32, -32}
|
pb.F_Sint32RepeatedPacked = []int32{32, -32}
|
||||||
pb.F_Sint64RepeatedPacked = []int64{64, -64}
|
pb.F_Sint64RepeatedPacked = []int64{64, -64}
|
||||||
|
pb.F_Sfixed32RepeatedPacked = []int32{32, -32}
|
||||||
|
pb.F_Sfixed64RepeatedPacked = []int64{64, -64}
|
||||||
|
|
||||||
overify(t, pb,
|
overify(t, pb,
|
||||||
"0807"+ // field 1, encoding 0, value 7
|
"0807"+ // field 1, encoding 0, value 7
|
||||||
@ -917,10 +872,17 @@ func TestEncodeDecode6(t *testing.T) {
|
|||||||
"aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes"
|
"aa0605"+"6279746573"+ // field 101, encoding 2 string "bytes"
|
||||||
"b0063f"+ // field 102, encoding 0, 0x3f zigzag32
|
"b0063f"+ // field 102, encoding 0, 0x3f zigzag32
|
||||||
"b8067f"+ // field 103, encoding 0, 0x7f zigzag64
|
"b8067f"+ // field 103, encoding 0, 0x7f zigzag64
|
||||||
|
"c506e0ffffff"+ // field 104, encoding 5, -32 fixed32
|
||||||
|
"c906c0ffffffffffffff"+ // field 105, encoding 1, -64 fixed64
|
||||||
"b21f02"+ // field 502, encoding 2, 2 bytes
|
"b21f02"+ // field 502, encoding 2, 2 bytes
|
||||||
"403f"+ // value 32, value -32
|
"403f"+ // value 32, value -32
|
||||||
"ba1f03"+ // field 503, encoding 2, 3 bytes
|
"ba1f03"+ // field 503, encoding 2, 3 bytes
|
||||||
"80017f") // value 64, value -64
|
"80017f"+ // value 64, value -64
|
||||||
|
"c21f08"+ // field 504, encoding 2, 8 bytes
|
||||||
|
"20000000e0ffffff"+ // value 32, value -32
|
||||||
|
"ca1f10"+ // field 505, encoding 2, 16 bytes
|
||||||
|
"4000000000000000c0ffffffffffffff") // value 64, value -64
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test that we can encode empty bytes fields.
|
// Test that we can encode empty bytes fields.
|
||||||
@ -1167,13 +1129,10 @@ func TestBigRepeated(t *testing.T) {
|
|||||||
if pbd.Repeatedgroup[i] == nil { // TODO: more checking?
|
if pbd.Repeatedgroup[i] == nil { // TODO: more checking?
|
||||||
t.Error("pbd.Repeatedgroup bad")
|
t.Error("pbd.Repeatedgroup bad")
|
||||||
}
|
}
|
||||||
var x uint64
|
if x := uint64(pbd.F_Sint64Repeated[i]); x != i {
|
||||||
x = uint64(pbd.F_Sint64Repeated[i])
|
|
||||||
if x != i {
|
|
||||||
t.Error("pbd.F_Sint64Repeated bad", x, i)
|
t.Error("pbd.F_Sint64Repeated bad", x, i)
|
||||||
}
|
}
|
||||||
x = uint64(pbd.F_Sint32Repeated[i])
|
if x := uint64(pbd.F_Sint32Repeated[i]); x != i {
|
||||||
if x != i {
|
|
||||||
t.Error("pbd.F_Sint32Repeated bad", x, i)
|
t.Error("pbd.F_Sint32Repeated bad", x, i)
|
||||||
}
|
}
|
||||||
s := fmt.Sprint(i)
|
s := fmt.Sprint(i)
|
||||||
@ -1181,39 +1140,31 @@ func TestBigRepeated(t *testing.T) {
|
|||||||
if pbd.F_StringRepeated[i] != s {
|
if pbd.F_StringRepeated[i] != s {
|
||||||
t.Error("pbd.F_Sint32Repeated bad", pbd.F_StringRepeated[i], i)
|
t.Error("pbd.F_Sint32Repeated bad", pbd.F_StringRepeated[i], i)
|
||||||
}
|
}
|
||||||
x = uint64(pbd.F_DoubleRepeated[i])
|
if x := uint64(pbd.F_DoubleRepeated[i]); x != i {
|
||||||
if x != i {
|
|
||||||
t.Error("pbd.F_DoubleRepeated bad", x, i)
|
t.Error("pbd.F_DoubleRepeated bad", x, i)
|
||||||
}
|
}
|
||||||
x = uint64(pbd.F_FloatRepeated[i])
|
if x := uint64(pbd.F_FloatRepeated[i]); x != i {
|
||||||
if x != i {
|
|
||||||
t.Error("pbd.F_FloatRepeated bad", x, i)
|
t.Error("pbd.F_FloatRepeated bad", x, i)
|
||||||
}
|
}
|
||||||
x = pbd.F_Uint64Repeated[i]
|
if x := pbd.F_Uint64Repeated[i]; x != i {
|
||||||
if x != i {
|
|
||||||
t.Error("pbd.F_Uint64Repeated bad", x, i)
|
t.Error("pbd.F_Uint64Repeated bad", x, i)
|
||||||
}
|
}
|
||||||
x = uint64(pbd.F_Uint32Repeated[i])
|
if x := uint64(pbd.F_Uint32Repeated[i]); x != i {
|
||||||
if x != i {
|
|
||||||
t.Error("pbd.F_Uint32Repeated bad", x, i)
|
t.Error("pbd.F_Uint32Repeated bad", x, i)
|
||||||
}
|
}
|
||||||
x = pbd.F_Fixed64Repeated[i]
|
if x := pbd.F_Fixed64Repeated[i]; x != i {
|
||||||
if x != i {
|
|
||||||
t.Error("pbd.F_Fixed64Repeated bad", x, i)
|
t.Error("pbd.F_Fixed64Repeated bad", x, i)
|
||||||
}
|
}
|
||||||
x = uint64(pbd.F_Fixed32Repeated[i])
|
if x := uint64(pbd.F_Fixed32Repeated[i]); x != i {
|
||||||
if x != i {
|
|
||||||
t.Error("pbd.F_Fixed32Repeated bad", x, i)
|
t.Error("pbd.F_Fixed32Repeated bad", x, i)
|
||||||
}
|
}
|
||||||
x = uint64(pbd.F_Int64Repeated[i])
|
if x := uint64(pbd.F_Int64Repeated[i]); x != i {
|
||||||
if x != i {
|
|
||||||
t.Error("pbd.F_Int64Repeated bad", x, i)
|
t.Error("pbd.F_Int64Repeated bad", x, i)
|
||||||
}
|
}
|
||||||
x = uint64(pbd.F_Int32Repeated[i])
|
if x := uint64(pbd.F_Int32Repeated[i]); x != i {
|
||||||
if x != i {
|
|
||||||
t.Error("pbd.F_Int32Repeated bad", x, i)
|
t.Error("pbd.F_Int32Repeated bad", x, i)
|
||||||
}
|
}
|
||||||
if pbd.F_BoolRepeated[i] != (i%2 == 0) {
|
if x := pbd.F_BoolRepeated[i]; x != (i%2 == 0) {
|
||||||
t.Error("pbd.F_BoolRepeated bad", x, i)
|
t.Error("pbd.F_BoolRepeated bad", x, i)
|
||||||
}
|
}
|
||||||
if pbd.RepeatedField[i] == nil { // TODO: more checking?
|
if pbd.RepeatedField[i] == nil { // TODO: more checking?
|
||||||
@ -1222,21 +1173,25 @@ func TestBigRepeated(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify we give a useful message when decoding to the wrong structure type.
|
func TestBadWireTypeUnknown(t *testing.T) {
|
||||||
func TestTypeMismatch(t *testing.T) {
|
var b []byte
|
||||||
pb1 := initGoTest(true)
|
fmt.Sscanf("0a01780d00000000080b101612036161611521000000202c220362626225370000002203636363214200000000000000584d5a036464645900000000000056405d63000000", "%x", &b)
|
||||||
|
|
||||||
// Marshal
|
m := new(MyMessage)
|
||||||
o := old()
|
if err := Unmarshal(b, m); err != nil {
|
||||||
o.Marshal(pb1)
|
t.Errorf("unexpected Unmarshal error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
// Now Unmarshal it to the wrong type.
|
var unknown []byte
|
||||||
pb2 := initGoTestField()
|
fmt.Sscanf("0a01780d0000000010161521000000202c2537000000214200000000000000584d5a036464645d63000000", "%x", &unknown)
|
||||||
err := o.Unmarshal(pb2)
|
if !bytes.Equal(m.XXX_unrecognized, unknown) {
|
||||||
if err == nil {
|
t.Errorf("unknown bytes mismatch:\ngot %x\nwant %x", m.XXX_unrecognized, unknown)
|
||||||
t.Error("expected error, got no error")
|
}
|
||||||
} else if !strings.Contains(err.Error(), "bad wiretype") {
|
DiscardUnknown(m)
|
||||||
t.Error("expected bad wiretype error, got", err)
|
|
||||||
|
want := &MyMessage{Count: Int32(11), Name: String("aaa"), Pet: []string{"bbb", "ccc"}, Bigfloat: Float64(88)}
|
||||||
|
if !Equal(m, want) {
|
||||||
|
t.Errorf("message mismatch:\ngot %v\nwant %v", m, want)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1331,7 +1286,8 @@ func TestRequiredFieldEnforcement(t *testing.T) {
|
|||||||
err = Unmarshal(buf, pb)
|
err = Unmarshal(buf, pb)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Error("unmarshal: expected error, got nil")
|
t.Error("unmarshal: expected error, got nil")
|
||||||
} else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "{Unknown}") {
|
} else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Type") && !strings.Contains(err.Error(), "{Unknown}") {
|
||||||
|
// TODO: remove unknown cases once we commit to the new unmarshaler.
|
||||||
t.Errorf("unmarshal: bad error type: %v", err)
|
t.Errorf("unmarshal: bad error type: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1348,7 +1304,7 @@ func TestRequiredFieldEnforcementGroups(t *testing.T) {
|
|||||||
buf := []byte{11, 12}
|
buf := []byte{11, 12}
|
||||||
if err := Unmarshal(buf, pb); err == nil {
|
if err := Unmarshal(buf, pb); err == nil {
|
||||||
t.Error("unmarshal: expected error, got nil")
|
t.Error("unmarshal: expected error, got nil")
|
||||||
} else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Group.{Unknown}") {
|
} else if _, ok := err.(*RequiredNotSetError); !ok || !strings.Contains(err.Error(), "Group.Field") && !strings.Contains(err.Error(), "Group.{Unknown}") {
|
||||||
t.Errorf("unmarshal: bad error type: %v", err)
|
t.Errorf("unmarshal: bad error type: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1385,18 +1341,7 @@ func (*NNIMessage) Reset() {}
|
|||||||
func (*NNIMessage) String() string { return "" }
|
func (*NNIMessage) String() string { return "" }
|
||||||
func (*NNIMessage) ProtoMessage() {}
|
func (*NNIMessage) ProtoMessage() {}
|
||||||
|
|
||||||
// A type that implements the Marshaler interface and is nillable.
|
type NMMessage struct{}
|
||||||
type nillableMessage struct {
|
|
||||||
x uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
func (nm *nillableMessage) Marshal() ([]byte, error) {
|
|
||||||
return EncodeVarint(nm.x), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type NMMessage struct {
|
|
||||||
nm *nillableMessage
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*NMMessage) Reset() {}
|
func (*NMMessage) Reset() {}
|
||||||
func (*NMMessage) String() string { return "" }
|
func (*NMMessage) String() string { return "" }
|
||||||
@ -1595,6 +1540,14 @@ func TestVarintOverflow(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBytesWithInvalidLengthInGroup(t *testing.T) {
|
||||||
|
// Overflowing a 64-bit length should not be allowed.
|
||||||
|
b := []byte{0xbb, 0x30, 0xb2, 0x30, 0xb0, 0xb2, 0x83, 0xf1, 0xb0, 0xb2, 0xef, 0xbf, 0xbd, 0x01}
|
||||||
|
if err := Unmarshal(b, new(MyMessage)); err == nil {
|
||||||
|
t.Fatalf("Overflowed uint64 length without error")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestUnmarshalFuzz(t *testing.T) {
|
func TestUnmarshalFuzz(t *testing.T) {
|
||||||
const N = 1000
|
const N = 1000
|
||||||
seed := time.Now().UnixNano()
|
seed := time.Now().UnixNano()
|
||||||
@ -1668,6 +1621,28 @@ func TestExtensionMarshalOrder(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestExtensionMapFieldMarshalDeterministic(t *testing.T) {
|
||||||
|
m := &MyMessage{Count: Int(123)}
|
||||||
|
if err := SetExtension(m, E_Ext_More, &Ext{MapField: map[int32]int32{1: 1, 2: 2, 3: 3, 4: 4}}); err != nil {
|
||||||
|
t.Fatalf("SetExtension: %v", err)
|
||||||
|
}
|
||||||
|
marshal := func(m Message) []byte {
|
||||||
|
var b Buffer
|
||||||
|
b.SetDeterministic(true)
|
||||||
|
if err := b.Marshal(m); err != nil {
|
||||||
|
t.Fatalf("Marshal failed: %v", err)
|
||||||
|
}
|
||||||
|
return b.Bytes()
|
||||||
|
}
|
||||||
|
|
||||||
|
want := marshal(m)
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
if got := marshal(m); !bytes.Equal(got, want) {
|
||||||
|
t.Errorf("Marshal produced inconsistent output with determinism enabled (pass %d).\n got %v\nwant %v", i, got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Many extensions, because small maps might not iterate differently on each iteration.
|
// Many extensions, because small maps might not iterate differently on each iteration.
|
||||||
var exts = []*ExtensionDesc{
|
var exts = []*ExtensionDesc{
|
||||||
E_X201,
|
E_X201,
|
||||||
@ -1802,6 +1777,43 @@ func TestUnmarshalMergesMessages(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUnmarshalMergesGroups(t *testing.T) {
|
||||||
|
// If a nested group occurs twice in the input,
|
||||||
|
// the fields should be merged when decoding.
|
||||||
|
a := &GroupNew{
|
||||||
|
G: &GroupNew_G{
|
||||||
|
X: Int32(7),
|
||||||
|
Y: Int32(8),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
aData, err := Marshal(a)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Marshal(a): %v", err)
|
||||||
|
}
|
||||||
|
b := &GroupNew{
|
||||||
|
G: &GroupNew_G{
|
||||||
|
X: Int32(9),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
bData, err := Marshal(b)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Marshal(b): %v", err)
|
||||||
|
}
|
||||||
|
want := &GroupNew{
|
||||||
|
G: &GroupNew_G{
|
||||||
|
X: Int32(9),
|
||||||
|
Y: Int32(8),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
got := new(GroupNew)
|
||||||
|
if err := Unmarshal(append(aData, bData...), got); err != nil {
|
||||||
|
t.Fatalf("Unmarshal: %v", err)
|
||||||
|
}
|
||||||
|
if !Equal(got, want) {
|
||||||
|
t.Errorf("\n got %v\nwant %v", got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestEncodingSizes(t *testing.T) {
|
func TestEncodingSizes(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
m Message
|
m Message
|
||||||
@ -1845,7 +1857,9 @@ func TestRequiredNotSetError(t *testing.T) {
|
|||||||
"b404" + // field 70, encoding 4, end group
|
"b404" + // field 70, encoding 4, end group
|
||||||
"aa0605" + "6279746573" + // field 101, encoding 2, string "bytes"
|
"aa0605" + "6279746573" + // field 101, encoding 2, string "bytes"
|
||||||
"b0063f" + // field 102, encoding 0, 0x3f zigzag32
|
"b0063f" + // field 102, encoding 0, 0x3f zigzag32
|
||||||
"b8067f" // field 103, encoding 0, 0x7f zigzag64
|
"b8067f" + // field 103, encoding 0, 0x7f zigzag64
|
||||||
|
"c506e0ffffff" + // field 104, encoding 5, -32 fixed32
|
||||||
|
"c906c0ffffffffffffff" // field 105, encoding 1, -64 fixed64
|
||||||
|
|
||||||
o := old()
|
o := old()
|
||||||
bytes, err := Marshal(pb)
|
bytes, err := Marshal(pb)
|
||||||
@ -1854,7 +1868,7 @@ func TestRequiredNotSetError(t *testing.T) {
|
|||||||
o.DebugPrint("", bytes)
|
o.DebugPrint("", bytes)
|
||||||
t.Fatalf("expected = %s", expected)
|
t.Fatalf("expected = %s", expected)
|
||||||
}
|
}
|
||||||
if strings.Index(err.Error(), "RequiredField.Label") < 0 {
|
if !strings.Contains(err.Error(), "RequiredField.Label") {
|
||||||
t.Errorf("marshal-1 wrong err msg: %v", err)
|
t.Errorf("marshal-1 wrong err msg: %v", err)
|
||||||
}
|
}
|
||||||
if !equal(bytes, expected, t) {
|
if !equal(bytes, expected, t) {
|
||||||
@ -1870,7 +1884,7 @@ func TestRequiredNotSetError(t *testing.T) {
|
|||||||
o.DebugPrint("", bytes)
|
o.DebugPrint("", bytes)
|
||||||
t.Fatalf("string = %s", expected)
|
t.Fatalf("string = %s", expected)
|
||||||
}
|
}
|
||||||
if strings.Index(err.Error(), "RequiredField.{Unknown}") < 0 {
|
if !strings.Contains(err.Error(), "RequiredField.Label") && !strings.Contains(err.Error(), "RequiredField.{Unknown}") {
|
||||||
t.Errorf("unmarshal wrong err msg: %v", err)
|
t.Errorf("unmarshal wrong err msg: %v", err)
|
||||||
}
|
}
|
||||||
bytes, err = Marshal(pbd)
|
bytes, err = Marshal(pbd)
|
||||||
@ -1879,7 +1893,7 @@ func TestRequiredNotSetError(t *testing.T) {
|
|||||||
o.DebugPrint("", bytes)
|
o.DebugPrint("", bytes)
|
||||||
t.Fatalf("string = %s", expected)
|
t.Fatalf("string = %s", expected)
|
||||||
}
|
}
|
||||||
if strings.Index(err.Error(), "RequiredField.Label") < 0 {
|
if !strings.Contains(err.Error(), "RequiredField.Label") {
|
||||||
t.Errorf("marshal-2 wrong err msg: %v", err)
|
t.Errorf("marshal-2 wrong err msg: %v", err)
|
||||||
}
|
}
|
||||||
if !equal(bytes, expected, t) {
|
if !equal(bytes, expected, t) {
|
||||||
@ -1888,6 +1902,25 @@ func TestRequiredNotSetError(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRequiredNotSetErrorWithBadWireTypes(t *testing.T) {
|
||||||
|
// Required field expects a varint, and properly found a varint.
|
||||||
|
if err := Unmarshal([]byte{0x08, 0x00}, new(GoEnum)); err != nil {
|
||||||
|
t.Errorf("Unmarshal = %v, want nil", err)
|
||||||
|
}
|
||||||
|
// Required field expects a varint, but found a fixed32 instead.
|
||||||
|
if err := Unmarshal([]byte{0x0d, 0x00, 0x00, 0x00, 0x00}, new(GoEnum)); err == nil {
|
||||||
|
t.Errorf("Unmarshal = nil, want RequiredNotSetError")
|
||||||
|
}
|
||||||
|
// Required field expects a varint, and found both a varint and fixed32 (ignored).
|
||||||
|
m := new(GoEnum)
|
||||||
|
if err := Unmarshal([]byte{0x08, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00}, m); err != nil {
|
||||||
|
t.Errorf("Unmarshal = %v, want nil", err)
|
||||||
|
}
|
||||||
|
if !bytes.Equal(m.XXX_unrecognized, []byte{0x0d, 0x00, 0x00, 0x00, 0x00}) {
|
||||||
|
t.Errorf("expected fixed32 to appear as unknown bytes: %x", m.XXX_unrecognized)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func fuzzUnmarshal(t *testing.T, data []byte) {
|
func fuzzUnmarshal(t *testing.T, data []byte) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if e := recover(); e != nil {
|
if e := recover(); e != nil {
|
||||||
@ -1946,6 +1979,32 @@ func TestMapFieldMarshal(t *testing.T) {
|
|||||||
(new(Buffer)).DebugPrint("Dump of b", b)
|
(new(Buffer)).DebugPrint("Dump of b", b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMapFieldDeterministicMarshal(t *testing.T) {
|
||||||
|
m := &MessageWithMap{
|
||||||
|
NameMapping: map[int32]string{
|
||||||
|
1: "Rob",
|
||||||
|
4: "Ian",
|
||||||
|
8: "Dave",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
marshal := func(m Message) []byte {
|
||||||
|
var b Buffer
|
||||||
|
b.SetDeterministic(true)
|
||||||
|
if err := b.Marshal(m); err != nil {
|
||||||
|
t.Fatalf("Marshal failed: %v", err)
|
||||||
|
}
|
||||||
|
return b.Bytes()
|
||||||
|
}
|
||||||
|
|
||||||
|
want := marshal(m)
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
if got := marshal(m); !bytes.Equal(got, want) {
|
||||||
|
t.Errorf("Marshal produced inconsistent output with determinism enabled (pass %d).\n got %v\nwant %v", i, got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestMapFieldRoundTrips(t *testing.T) {
|
func TestMapFieldRoundTrips(t *testing.T) {
|
||||||
m := &MessageWithMap{
|
m := &MessageWithMap{
|
||||||
NameMapping: map[int32]string{
|
NameMapping: map[int32]string{
|
||||||
@ -1954,7 +2013,7 @@ func TestMapFieldRoundTrips(t *testing.T) {
|
|||||||
8: "Dave",
|
8: "Dave",
|
||||||
},
|
},
|
||||||
MsgMapping: map[int64]*FloatingPoint{
|
MsgMapping: map[int64]*FloatingPoint{
|
||||||
0x7001: &FloatingPoint{F: Float64(2.0)},
|
0x7001: {F: Float64(2.0)},
|
||||||
},
|
},
|
||||||
ByteMapping: map[bool][]byte{
|
ByteMapping: map[bool][]byte{
|
||||||
false: []byte("that's not right!"),
|
false: []byte("that's not right!"),
|
||||||
@ -1970,14 +2029,8 @@ func TestMapFieldRoundTrips(t *testing.T) {
|
|||||||
if err := Unmarshal(b, m2); err != nil {
|
if err := Unmarshal(b, m2); err != nil {
|
||||||
t.Fatalf("Unmarshal: %v", err)
|
t.Fatalf("Unmarshal: %v", err)
|
||||||
}
|
}
|
||||||
for _, pair := range [][2]interface{}{
|
if !Equal(m, m2) {
|
||||||
{m.NameMapping, m2.NameMapping},
|
t.Errorf("Map did not survive a round trip.\ninitial: %v\n final: %v", m, m2)
|
||||||
{m.MsgMapping, m2.MsgMapping},
|
|
||||||
{m.ByteMapping, m2.ByteMapping},
|
|
||||||
} {
|
|
||||||
if !reflect.DeepEqual(pair[0], pair[1]) {
|
|
||||||
t.Errorf("Map did not survive a round trip.\ninitial: %v\n final: %v", pair[0], pair[1])
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2005,7 +2058,7 @@ func TestMapFieldWithNil(t *testing.T) {
|
|||||||
func TestMapFieldWithNilBytes(t *testing.T) {
|
func TestMapFieldWithNilBytes(t *testing.T) {
|
||||||
m1 := &MessageWithMap{
|
m1 := &MessageWithMap{
|
||||||
ByteMapping: map[bool][]byte{
|
ByteMapping: map[bool][]byte{
|
||||||
false: []byte{},
|
false: {},
|
||||||
true: nil,
|
true: nil,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -2119,6 +2172,22 @@ func TestOneof(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestOneofNilBytes(t *testing.T) {
|
||||||
|
// A oneof with nil byte slice should marshal to tag + 0 (size), with no error.
|
||||||
|
m := &Communique{Union: &Communique_Data{Data: nil}}
|
||||||
|
b, err := Marshal(m)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Marshal failed: %v", err)
|
||||||
|
}
|
||||||
|
want := []byte{
|
||||||
|
7<<3 | 2, // tag 7, wire type 2
|
||||||
|
0, // size
|
||||||
|
}
|
||||||
|
if !bytes.Equal(b, want) {
|
||||||
|
t.Errorf("Wrong result of Marshal: got %x, want %x", b, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestInefficientPackedBool(t *testing.T) {
|
func TestInefficientPackedBool(t *testing.T) {
|
||||||
// https://github.com/golang/protobuf/issues/76
|
// https://github.com/golang/protobuf/issues/76
|
||||||
inp := []byte{
|
inp := []byte{
|
||||||
@ -2132,6 +2201,69 @@ func TestInefficientPackedBool(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure pure-reflect-based implementation handles
|
||||||
|
// []int32-[]enum conversion correctly.
|
||||||
|
func TestRepeatedEnum2(t *testing.T) {
|
||||||
|
pb := &RepeatedEnum{
|
||||||
|
Color: []RepeatedEnum_Color{RepeatedEnum_RED},
|
||||||
|
}
|
||||||
|
b, err := Marshal(pb)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Marshal failed: %v", err)
|
||||||
|
}
|
||||||
|
x := new(RepeatedEnum)
|
||||||
|
err = Unmarshal(b, x)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Unmarshal failed: %v", err)
|
||||||
|
}
|
||||||
|
if !Equal(pb, x) {
|
||||||
|
t.Errorf("Incorrect result: want: %v got: %v", pb, x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestConcurrentMarshal makes sure that it is safe to marshal
|
||||||
|
// same message in multiple goroutines concurrently.
|
||||||
|
func TestConcurrentMarshal(t *testing.T) {
|
||||||
|
pb := initGoTest(true)
|
||||||
|
const N = 100
|
||||||
|
b := make([][]byte, N)
|
||||||
|
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
for i := 0; i < N; i++ {
|
||||||
|
wg.Add(1)
|
||||||
|
go func(i int) {
|
||||||
|
defer wg.Done()
|
||||||
|
var err error
|
||||||
|
b[i], err = Marshal(pb)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("marshal error: %v", err)
|
||||||
|
}
|
||||||
|
}(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
wg.Wait()
|
||||||
|
for i := 1; i < N; i++ {
|
||||||
|
if !bytes.Equal(b[0], b[i]) {
|
||||||
|
t.Errorf("concurrent marshal result not same: b[0] = %v, b[%d] = %v", b[0], i, b[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInvalidUTF8(t *testing.T) {
|
||||||
|
const wire = "\x12\x04\xde\xea\xca\xfe"
|
||||||
|
|
||||||
|
var m GoTest
|
||||||
|
if err := Unmarshal([]byte(wire), &m); err == nil {
|
||||||
|
t.Errorf("Unmarshal error: got nil, want non-nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Reset()
|
||||||
|
m.Table = String(wire[2:])
|
||||||
|
if _, err := Marshal(&m); err == nil {
|
||||||
|
t.Errorf("Marshal error: got nil, want non-nil")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Benchmarks
|
// Benchmarks
|
||||||
|
|
||||||
func testMsg() *GoTest {
|
func testMsg() *GoTest {
|
||||||
|
18
vendor/github.com/golang/protobuf/proto/any_test.go
generated
vendored
18
vendor/github.com/golang/protobuf/proto/any_test.go
generated
vendored
@ -38,7 +38,7 @@ import (
|
|||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
|
|
||||||
pb "github.com/golang/protobuf/proto/proto3_proto"
|
pb "github.com/golang/protobuf/proto/proto3_proto"
|
||||||
testpb "github.com/golang/protobuf/proto/testdata"
|
testpb "github.com/golang/protobuf/proto/test_proto"
|
||||||
anypb "github.com/golang/protobuf/ptypes/any"
|
anypb "github.com/golang/protobuf/ptypes/any"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -166,33 +166,33 @@ anything: <
|
|||||||
name: "David"
|
name: "David"
|
||||||
result_count: 47
|
result_count: 47
|
||||||
anything: <
|
anything: <
|
||||||
[type.googleapis.com/testdata.MyMessage]: <
|
[type.googleapis.com/test_proto.MyMessage]: <
|
||||||
count: 47
|
count: 47
|
||||||
name: "David"
|
name: "David"
|
||||||
[testdata.Ext.more]: <
|
[test_proto.Ext.more]: <
|
||||||
data: "foo"
|
data: "foo"
|
||||||
>
|
>
|
||||||
[testdata.Ext.text]: "bar"
|
[test_proto.Ext.text]: "bar"
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
many_things: <
|
many_things: <
|
||||||
[type.googleapis.com/testdata.MyMessage]: <
|
[type.googleapis.com/test_proto.MyMessage]: <
|
||||||
count: 42
|
count: 42
|
||||||
bikeshed: GREEN
|
bikeshed: GREEN
|
||||||
rep_bytes: "roboto"
|
rep_bytes: "roboto"
|
||||||
[testdata.Ext.more]: <
|
[test_proto.Ext.more]: <
|
||||||
data: "baz"
|
data: "baz"
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
many_things: <
|
many_things: <
|
||||||
[type.googleapis.com/testdata.MyMessage]: <
|
[type.googleapis.com/test_proto.MyMessage]: <
|
||||||
count: 47
|
count: 47
|
||||||
name: "David"
|
name: "David"
|
||||||
[testdata.Ext.more]: <
|
[test_proto.Ext.more]: <
|
||||||
data: "foo"
|
data: "foo"
|
||||||
>
|
>
|
||||||
[testdata.Ext.text]: "bar"
|
[test_proto.Ext.text]: "bar"
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
`
|
`
|
||||||
|
46
vendor/github.com/golang/protobuf/proto/clone.go
generated
vendored
46
vendor/github.com/golang/protobuf/proto/clone.go
generated
vendored
@ -35,22 +35,39 @@
|
|||||||
package proto
|
package proto
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Clone returns a deep copy of a protocol buffer.
|
// Clone returns a deep copy of a protocol buffer.
|
||||||
func Clone(pb Message) Message {
|
func Clone(src Message) Message {
|
||||||
in := reflect.ValueOf(pb)
|
in := reflect.ValueOf(src)
|
||||||
if in.IsNil() {
|
if in.IsNil() {
|
||||||
return pb
|
return src
|
||||||
}
|
}
|
||||||
|
|
||||||
out := reflect.New(in.Type().Elem())
|
out := reflect.New(in.Type().Elem())
|
||||||
// out is empty so a merge is a deep copy.
|
dst := out.Interface().(Message)
|
||||||
mergeStruct(out.Elem(), in.Elem())
|
Merge(dst, src)
|
||||||
return out.Interface().(Message)
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
// Merger is the interface representing objects that can merge messages of the same type.
|
||||||
|
type Merger interface {
|
||||||
|
// Merge merges src into this message.
|
||||||
|
// 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 may panic if called with a different argument type than the receiver.
|
||||||
|
Merge(src Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
// generatedMerger is the custom merge method that generated protos will have.
|
||||||
|
// We must add this method since a generate Merge method will conflict with
|
||||||
|
// many existing protos that have a Merge data field already defined.
|
||||||
|
type generatedMerger interface {
|
||||||
|
XXX_Merge(src Message)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merge merges src into dst.
|
// Merge merges src into dst.
|
||||||
@ -58,17 +75,24 @@ func Clone(pb Message) Message {
|
|||||||
// Elements of repeated fields will be appended.
|
// Elements of repeated fields will be appended.
|
||||||
// Merge panics if src and dst are not the same type, or if dst is nil.
|
// Merge panics if src and dst are not the same type, or if dst is nil.
|
||||||
func Merge(dst, src Message) {
|
func Merge(dst, src Message) {
|
||||||
|
if m, ok := dst.(Merger); ok {
|
||||||
|
m.Merge(src)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
in := reflect.ValueOf(src)
|
in := reflect.ValueOf(src)
|
||||||
out := reflect.ValueOf(dst)
|
out := reflect.ValueOf(dst)
|
||||||
if out.IsNil() {
|
if out.IsNil() {
|
||||||
panic("proto: nil destination")
|
panic("proto: nil destination")
|
||||||
}
|
}
|
||||||
if in.Type() != out.Type() {
|
if in.Type() != out.Type() {
|
||||||
// Explicit test prior to mergeStruct so that mistyped nils will fail
|
panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src))
|
||||||
panic("proto: type mismatch")
|
|
||||||
}
|
}
|
||||||
if in.IsNil() {
|
if in.IsNil() {
|
||||||
// Merging nil into non-nil is a quiet no-op
|
return // Merge from nil src is a noop
|
||||||
|
}
|
||||||
|
if m, ok := dst.(generatedMerger); ok {
|
||||||
|
m.XXX_Merge(src)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
mergeStruct(out.Elem(), in.Elem())
|
mergeStruct(out.Elem(), in.Elem())
|
||||||
@ -84,7 +108,7 @@ func mergeStruct(out, in reflect.Value) {
|
|||||||
mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i])
|
mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i])
|
||||||
}
|
}
|
||||||
|
|
||||||
if emIn, ok := extendable(in.Addr().Interface()); ok {
|
if emIn, err := extendable(in.Addr().Interface()); err == nil {
|
||||||
emOut, _ := extendable(out.Addr().Interface())
|
emOut, _ := extendable(out.Addr().Interface())
|
||||||
mIn, muIn := emIn.extensionsRead()
|
mIn, muIn := emIn.extensionsRead()
|
||||||
if mIn != nil {
|
if mIn != nil {
|
||||||
|
134
vendor/github.com/golang/protobuf/proto/clone_test.go
generated
vendored
134
vendor/github.com/golang/protobuf/proto/clone_test.go
generated
vendored
@ -37,7 +37,7 @@ import (
|
|||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
|
|
||||||
proto3pb "github.com/golang/protobuf/proto/proto3_proto"
|
proto3pb "github.com/golang/protobuf/proto/proto3_proto"
|
||||||
pb "github.com/golang/protobuf/proto/testdata"
|
pb "github.com/golang/protobuf/proto/test_proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
var cloneTestMessage = &pb.MyMessage{
|
var cloneTestMessage = &pb.MyMessage{
|
||||||
@ -72,7 +72,7 @@ func init() {
|
|||||||
func TestClone(t *testing.T) {
|
func TestClone(t *testing.T) {
|
||||||
m := proto.Clone(cloneTestMessage).(*pb.MyMessage)
|
m := proto.Clone(cloneTestMessage).(*pb.MyMessage)
|
||||||
if !proto.Equal(m, cloneTestMessage) {
|
if !proto.Equal(m, cloneTestMessage) {
|
||||||
t.Errorf("Clone(%v) = %v", cloneTestMessage, m)
|
t.Fatalf("Clone(%v) = %v", cloneTestMessage, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify it was a deep copy.
|
// Verify it was a deep copy.
|
||||||
@ -244,27 +244,45 @@ var mergeTests = []struct {
|
|||||||
Data: []byte("texas!"),
|
Data: []byte("texas!"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// Oneof fields should merge by assignment.
|
{ // Oneof fields should merge by assignment.
|
||||||
{
|
src: &pb.Communique{Union: &pb.Communique_Number{41}},
|
||||||
src: &pb.Communique{
|
dst: &pb.Communique{Union: &pb.Communique_Name{"Bobby Tables"}},
|
||||||
Union: &pb.Communique_Number{41},
|
want: &pb.Communique{Union: &pb.Communique_Number{41}},
|
||||||
},
|
},
|
||||||
dst: &pb.Communique{
|
{ // Oneof nil is the same as not set.
|
||||||
Union: &pb.Communique_Name{"Bobby Tables"},
|
src: &pb.Communique{},
|
||||||
},
|
dst: &pb.Communique{Union: &pb.Communique_Name{"Bobby Tables"}},
|
||||||
want: &pb.Communique{
|
want: &pb.Communique{Union: &pb.Communique_Name{"Bobby Tables"}},
|
||||||
Union: &pb.Communique_Number{41},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
// Oneof nil is the same as not set.
|
|
||||||
{
|
{
|
||||||
src: &pb.Communique{},
|
src: &pb.Communique{Union: &pb.Communique_Number{1337}},
|
||||||
dst: &pb.Communique{
|
dst: &pb.Communique{},
|
||||||
Union: &pb.Communique_Name{"Bobby Tables"},
|
want: &pb.Communique{Union: &pb.Communique_Number{1337}},
|
||||||
},
|
},
|
||||||
want: &pb.Communique{
|
{
|
||||||
Union: &pb.Communique_Name{"Bobby Tables"},
|
src: &pb.Communique{Union: &pb.Communique_Col{pb.MyMessage_RED}},
|
||||||
},
|
dst: &pb.Communique{},
|
||||||
|
want: &pb.Communique{Union: &pb.Communique_Col{pb.MyMessage_RED}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: &pb.Communique{Union: &pb.Communique_Data{[]byte("hello")}},
|
||||||
|
dst: &pb.Communique{},
|
||||||
|
want: &pb.Communique{Union: &pb.Communique_Data{[]byte("hello")}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: &pb.Communique{Union: &pb.Communique_Msg{&pb.Strings{BytesField: []byte{1, 2, 3}}}},
|
||||||
|
dst: &pb.Communique{},
|
||||||
|
want: &pb.Communique{Union: &pb.Communique_Msg{&pb.Strings{BytesField: []byte{1, 2, 3}}}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: &pb.Communique{Union: &pb.Communique_Msg{}},
|
||||||
|
dst: &pb.Communique{},
|
||||||
|
want: &pb.Communique{Union: &pb.Communique_Msg{}},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: &pb.Communique{Union: &pb.Communique_Msg{&pb.Strings{StringField: proto.String("123")}}},
|
||||||
|
dst: &pb.Communique{Union: &pb.Communique_Msg{&pb.Strings{BytesField: []byte{1, 2, 3}}}},
|
||||||
|
want: &pb.Communique{Union: &pb.Communique_Msg{&pb.Strings{StringField: proto.String("123"), BytesField: []byte{1, 2, 3}}}},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: &proto3pb.Message{
|
src: &proto3pb.Message{
|
||||||
@ -287,14 +305,86 @@ var mergeTests = []struct {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
src: &pb.GoTest{
|
||||||
|
F_BoolRepeated: []bool{},
|
||||||
|
F_Int32Repeated: []int32{},
|
||||||
|
F_Int64Repeated: []int64{},
|
||||||
|
F_Uint32Repeated: []uint32{},
|
||||||
|
F_Uint64Repeated: []uint64{},
|
||||||
|
F_FloatRepeated: []float32{},
|
||||||
|
F_DoubleRepeated: []float64{},
|
||||||
|
F_StringRepeated: []string{},
|
||||||
|
F_BytesRepeated: [][]byte{},
|
||||||
|
},
|
||||||
|
dst: &pb.GoTest{},
|
||||||
|
want: &pb.GoTest{
|
||||||
|
F_BoolRepeated: []bool{},
|
||||||
|
F_Int32Repeated: []int32{},
|
||||||
|
F_Int64Repeated: []int64{},
|
||||||
|
F_Uint32Repeated: []uint32{},
|
||||||
|
F_Uint64Repeated: []uint64{},
|
||||||
|
F_FloatRepeated: []float32{},
|
||||||
|
F_DoubleRepeated: []float64{},
|
||||||
|
F_StringRepeated: []string{},
|
||||||
|
F_BytesRepeated: [][]byte{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: &pb.GoTest{},
|
||||||
|
dst: &pb.GoTest{
|
||||||
|
F_BoolRepeated: []bool{},
|
||||||
|
F_Int32Repeated: []int32{},
|
||||||
|
F_Int64Repeated: []int64{},
|
||||||
|
F_Uint32Repeated: []uint32{},
|
||||||
|
F_Uint64Repeated: []uint64{},
|
||||||
|
F_FloatRepeated: []float32{},
|
||||||
|
F_DoubleRepeated: []float64{},
|
||||||
|
F_StringRepeated: []string{},
|
||||||
|
F_BytesRepeated: [][]byte{},
|
||||||
|
},
|
||||||
|
want: &pb.GoTest{
|
||||||
|
F_BoolRepeated: []bool{},
|
||||||
|
F_Int32Repeated: []int32{},
|
||||||
|
F_Int64Repeated: []int64{},
|
||||||
|
F_Uint32Repeated: []uint32{},
|
||||||
|
F_Uint64Repeated: []uint64{},
|
||||||
|
F_FloatRepeated: []float32{},
|
||||||
|
F_DoubleRepeated: []float64{},
|
||||||
|
F_StringRepeated: []string{},
|
||||||
|
F_BytesRepeated: [][]byte{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: &pb.GoTest{
|
||||||
|
F_BytesRepeated: [][]byte{nil, []byte{}, []byte{0}},
|
||||||
|
},
|
||||||
|
dst: &pb.GoTest{},
|
||||||
|
want: &pb.GoTest{
|
||||||
|
F_BytesRepeated: [][]byte{nil, []byte{}, []byte{0}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: &pb.MyMessage{
|
||||||
|
Others: []*pb.OtherMessage{},
|
||||||
|
},
|
||||||
|
dst: &pb.MyMessage{},
|
||||||
|
want: &pb.MyMessage{
|
||||||
|
Others: []*pb.OtherMessage{},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMerge(t *testing.T) {
|
func TestMerge(t *testing.T) {
|
||||||
for _, m := range mergeTests {
|
for _, m := range mergeTests {
|
||||||
got := proto.Clone(m.dst)
|
got := proto.Clone(m.dst)
|
||||||
|
if !proto.Equal(got, m.dst) {
|
||||||
|
t.Errorf("Clone()\ngot %v\nwant %v", got, m.dst)
|
||||||
|
continue
|
||||||
|
}
|
||||||
proto.Merge(got, m.src)
|
proto.Merge(got, m.src)
|
||||||
if !proto.Equal(got, m.want) {
|
if !proto.Equal(got, m.want) {
|
||||||
t.Errorf("Merge(%v, %v)\n got %v\nwant %v\n", m.dst, m.src, got, m.want)
|
t.Errorf("Merge(%v, %v)\ngot %v\nwant %v", m.dst, m.src, got, m.want)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
668
vendor/github.com/golang/protobuf/proto/decode.go
generated
vendored
668
vendor/github.com/golang/protobuf/proto/decode.go
generated
vendored
@ -39,8 +39,6 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
|
||||||
"reflect"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// errOverflow is returned when an integer is too large to be represented.
|
// errOverflow is returned when an integer is too large to be represented.
|
||||||
@ -50,10 +48,6 @@ var errOverflow = errors.New("proto: integer overflow")
|
|||||||
// wire type is encountered. It does not get returned to user code.
|
// wire type is encountered. It does not get returned to user code.
|
||||||
var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof")
|
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.
|
// DecodeVarint reads a varint-encoded integer from the slice.
|
||||||
// It returns the integer and the number of bytes consumed, or
|
// It returns the integer and the number of bytes consumed, or
|
||||||
// zero if there is not enough.
|
// zero if there is not enough.
|
||||||
@ -267,9 +261,6 @@ func (p *Buffer) DecodeZigzag32() (x uint64, err error) {
|
|||||||
return
|
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.
|
// DecodeRawBytes reads a count-delimited byte buffer from the Buffer.
|
||||||
// This is the format used for the bytes protocol buffer
|
// This is the format used for the bytes protocol buffer
|
||||||
// type and for embedded messages.
|
// type and for embedded messages.
|
||||||
@ -311,81 +302,29 @@ func (p *Buffer) DecodeStringBytes() (s string, err error) {
|
|||||||
return string(buf), nil
|
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
|
// Unmarshaler is the interface representing objects that can
|
||||||
// unmarshal themselves. The method should reset the receiver before
|
// unmarshal themselves. The argument points to data that may be
|
||||||
// decoding starts. The argument points to data that may be
|
|
||||||
// overwritten, so implementations should not keep references to the
|
// overwritten, so implementations should not keep references to the
|
||||||
// buffer.
|
// buffer.
|
||||||
|
// Unmarshal implementations should not clear the receiver.
|
||||||
|
// Any unmarshaled data should be merged into the receiver.
|
||||||
|
// Callers of Unmarshal that do not want to retain existing data
|
||||||
|
// should Reset the receiver before calling Unmarshal.
|
||||||
type Unmarshaler interface {
|
type Unmarshaler interface {
|
||||||
Unmarshal([]byte) error
|
Unmarshal([]byte) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// newUnmarshaler is the interface representing objects that can
|
||||||
|
// unmarshal themselves. The semantics are identical to Unmarshaler.
|
||||||
|
//
|
||||||
|
// This exists to support protoc-gen-go generated messages.
|
||||||
|
// The proto package will stop type-asserting to this interface in the future.
|
||||||
|
//
|
||||||
|
// DO NOT DEPEND ON THIS.
|
||||||
|
type newUnmarshaler interface {
|
||||||
|
XXX_Unmarshal([]byte) error
|
||||||
|
}
|
||||||
|
|
||||||
// Unmarshal parses the protocol buffer representation in buf and places the
|
// Unmarshal parses the protocol buffer representation in buf and places the
|
||||||
// decoded result in pb. If the struct underlying pb does not match
|
// decoded result in pb. If the struct underlying pb does not match
|
||||||
// the data in buf, the results can be unpredictable.
|
// the data in buf, the results can be unpredictable.
|
||||||
@ -395,7 +334,13 @@ type Unmarshaler interface {
|
|||||||
// to preserve and append to existing data.
|
// to preserve and append to existing data.
|
||||||
func Unmarshal(buf []byte, pb Message) error {
|
func Unmarshal(buf []byte, pb Message) error {
|
||||||
pb.Reset()
|
pb.Reset()
|
||||||
return UnmarshalMerge(buf, pb)
|
if u, ok := pb.(newUnmarshaler); ok {
|
||||||
|
return u.XXX_Unmarshal(buf)
|
||||||
|
}
|
||||||
|
if u, ok := pb.(Unmarshaler); ok {
|
||||||
|
return u.Unmarshal(buf)
|
||||||
|
}
|
||||||
|
return NewBuffer(buf).Unmarshal(pb)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalMerge parses the protocol buffer representation in buf and
|
// UnmarshalMerge parses the protocol buffer representation in buf and
|
||||||
@ -405,8 +350,16 @@ func Unmarshal(buf []byte, pb Message) error {
|
|||||||
// UnmarshalMerge merges into existing data in pb.
|
// UnmarshalMerge merges into existing data in pb.
|
||||||
// Most code should use Unmarshal instead.
|
// Most code should use Unmarshal instead.
|
||||||
func UnmarshalMerge(buf []byte, pb Message) error {
|
func UnmarshalMerge(buf []byte, pb Message) error {
|
||||||
// If the object can unmarshal itself, let it.
|
if u, ok := pb.(newUnmarshaler); ok {
|
||||||
|
return u.XXX_Unmarshal(buf)
|
||||||
|
}
|
||||||
if u, ok := pb.(Unmarshaler); ok {
|
if u, ok := pb.(Unmarshaler); ok {
|
||||||
|
// NOTE: The history of proto have unfortunately been inconsistent
|
||||||
|
// whether Unmarshaler should or should not implicitly clear itself.
|
||||||
|
// Some implementations do, most do not.
|
||||||
|
// Thus, calling this here may or may not do what people want.
|
||||||
|
//
|
||||||
|
// See https://github.com/golang/protobuf/issues/424
|
||||||
return u.Unmarshal(buf)
|
return u.Unmarshal(buf)
|
||||||
}
|
}
|
||||||
return NewBuffer(buf).Unmarshal(pb)
|
return NewBuffer(buf).Unmarshal(pb)
|
||||||
@ -422,12 +375,17 @@ func (p *Buffer) DecodeMessage(pb Message) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DecodeGroup reads a tag-delimited group from the Buffer.
|
// DecodeGroup reads a tag-delimited group from the Buffer.
|
||||||
|
// StartGroup tag is already consumed. This function consumes
|
||||||
|
// EndGroup tag.
|
||||||
func (p *Buffer) DecodeGroup(pb Message) error {
|
func (p *Buffer) DecodeGroup(pb Message) error {
|
||||||
typ, base, err := getbase(pb)
|
b := p.buf[p.index:]
|
||||||
if err != nil {
|
x, y := findEndGroup(b)
|
||||||
return err
|
if x < 0 {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
return p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), true, base)
|
err := Unmarshal(b[:x], pb)
|
||||||
|
p.index += y
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unmarshal parses the protocol buffer representation in the
|
// Unmarshal parses the protocol buffer representation in the
|
||||||
@ -438,533 +396,33 @@ func (p *Buffer) DecodeGroup(pb Message) error {
|
|||||||
// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal.
|
// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal.
|
||||||
func (p *Buffer) Unmarshal(pb Message) error {
|
func (p *Buffer) Unmarshal(pb Message) error {
|
||||||
// If the object can unmarshal itself, let it.
|
// If the object can unmarshal itself, let it.
|
||||||
|
if u, ok := pb.(newUnmarshaler); ok {
|
||||||
|
err := u.XXX_Unmarshal(p.buf[p.index:])
|
||||||
|
p.index = len(p.buf)
|
||||||
|
return err
|
||||||
|
}
|
||||||
if u, ok := pb.(Unmarshaler); ok {
|
if u, ok := pb.(Unmarshaler); ok {
|
||||||
|
// NOTE: The history of proto have unfortunately been inconsistent
|
||||||
|
// whether Unmarshaler should or should not implicitly clear itself.
|
||||||
|
// Some implementations do, most do not.
|
||||||
|
// Thus, calling this here may or may not do what people want.
|
||||||
|
//
|
||||||
|
// See https://github.com/golang/protobuf/issues/424
|
||||||
err := u.Unmarshal(p.buf[p.index:])
|
err := u.Unmarshal(p.buf[p.index:])
|
||||||
p.index = len(p.buf)
|
p.index = len(p.buf)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
typ, base, err := getbase(pb)
|
// Slow workaround for messages that aren't Unmarshalers.
|
||||||
if err != nil {
|
// This includes some hand-coded .pb.go files and
|
||||||
return err
|
// bootstrap protos.
|
||||||
}
|
// TODO: fix all of those and then add Unmarshal to
|
||||||
|
// the Message interface. Then:
|
||||||
err = p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), false, base)
|
// The cast above and code below can be deleted.
|
||||||
|
// The old unmarshaler can be deleted.
|
||||||
if collectStats {
|
// Clients can call Unmarshal directly (can already do that, actually).
|
||||||
stats.Decode++
|
var info InternalMessageInfo
|
||||||
}
|
err := info.Unmarshal(pb, p.buf[p.index:])
|
||||||
|
p.index = len(p.buf)
|
||||||
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
|
return err
|
||||||
}
|
}
|
||||||
|
5
vendor/github.com/golang/protobuf/proto/decode_test.go
generated
vendored
5
vendor/github.com/golang/protobuf/proto/decode_test.go
generated
vendored
@ -41,10 +41,7 @@ import (
|
|||||||
tpb "github.com/golang/protobuf/proto/proto3_proto"
|
tpb "github.com/golang/protobuf/proto/proto3_proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var msgBlackhole = new(tpb.Message)
|
||||||
bytesBlackhole []byte
|
|
||||||
msgBlackhole = new(tpb.Message)
|
|
||||||
)
|
|
||||||
|
|
||||||
// BenchmarkVarint32ArraySmall shows the performance on an array of small int32 fields (1 and
|
// BenchmarkVarint32ArraySmall shows the performance on an array of small int32 fields (1 and
|
||||||
// 2 bytes long).
|
// 2 bytes long).
|
||||||
|
201
vendor/github.com/golang/protobuf/proto/discard.go
generated
vendored
201
vendor/github.com/golang/protobuf/proto/discard.go
generated
vendored
@ -35,8 +35,14 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type generatedDiscarder interface {
|
||||||
|
XXX_DiscardUnknown()
|
||||||
|
}
|
||||||
|
|
||||||
// DiscardUnknown recursively discards all unknown fields from this message
|
// DiscardUnknown recursively discards all unknown fields from this message
|
||||||
// and all embedded messages.
|
// and all embedded messages.
|
||||||
//
|
//
|
||||||
@ -49,9 +55,202 @@ import (
|
|||||||
// For proto2 messages, the unknown fields of message extensions are only
|
// For proto2 messages, the unknown fields of message extensions are only
|
||||||
// discarded from messages that have been accessed via GetExtension.
|
// discarded from messages that have been accessed via GetExtension.
|
||||||
func DiscardUnknown(m Message) {
|
func DiscardUnknown(m Message) {
|
||||||
|
if m, ok := m.(generatedDiscarder); ok {
|
||||||
|
m.XXX_DiscardUnknown()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// TODO: Dynamically populate a InternalMessageInfo for legacy messages,
|
||||||
|
// but the master branch has no implementation for InternalMessageInfo,
|
||||||
|
// so it would be more work to replicate that approach.
|
||||||
discardLegacy(m)
|
discardLegacy(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DiscardUnknown recursively discards all unknown fields.
|
||||||
|
func (a *InternalMessageInfo) DiscardUnknown(m Message) {
|
||||||
|
di := atomicLoadDiscardInfo(&a.discard)
|
||||||
|
if di == nil {
|
||||||
|
di = getDiscardInfo(reflect.TypeOf(m).Elem())
|
||||||
|
atomicStoreDiscardInfo(&a.discard, di)
|
||||||
|
}
|
||||||
|
di.discard(toPointer(&m))
|
||||||
|
}
|
||||||
|
|
||||||
|
type discardInfo struct {
|
||||||
|
typ reflect.Type
|
||||||
|
|
||||||
|
initialized int32 // 0: only typ is valid, 1: everything is valid
|
||||||
|
lock sync.Mutex
|
||||||
|
|
||||||
|
fields []discardFieldInfo
|
||||||
|
unrecognized field
|
||||||
|
}
|
||||||
|
|
||||||
|
type discardFieldInfo struct {
|
||||||
|
field field // Offset of field, guaranteed to be valid
|
||||||
|
discard func(src pointer)
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
discardInfoMap = map[reflect.Type]*discardInfo{}
|
||||||
|
discardInfoLock sync.Mutex
|
||||||
|
)
|
||||||
|
|
||||||
|
func getDiscardInfo(t reflect.Type) *discardInfo {
|
||||||
|
discardInfoLock.Lock()
|
||||||
|
defer discardInfoLock.Unlock()
|
||||||
|
di := discardInfoMap[t]
|
||||||
|
if di == nil {
|
||||||
|
di = &discardInfo{typ: t}
|
||||||
|
discardInfoMap[t] = di
|
||||||
|
}
|
||||||
|
return di
|
||||||
|
}
|
||||||
|
|
||||||
|
func (di *discardInfo) discard(src pointer) {
|
||||||
|
if src.isNil() {
|
||||||
|
return // Nothing to do.
|
||||||
|
}
|
||||||
|
|
||||||
|
if atomic.LoadInt32(&di.initialized) == 0 {
|
||||||
|
di.computeDiscardInfo()
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, fi := range di.fields {
|
||||||
|
sfp := src.offset(fi.field)
|
||||||
|
fi.discard(sfp)
|
||||||
|
}
|
||||||
|
|
||||||
|
// For proto2 messages, only discard unknown fields in message extensions
|
||||||
|
// that have been accessed via GetExtension.
|
||||||
|
if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil {
|
||||||
|
// Ignore lock since DiscardUnknown is not concurrency safe.
|
||||||
|
emm, _ := em.extensionsRead()
|
||||||
|
for _, mx := range emm {
|
||||||
|
if m, ok := mx.value.(Message); ok {
|
||||||
|
DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if di.unrecognized.IsValid() {
|
||||||
|
*src.offset(di.unrecognized).toBytes() = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (di *discardInfo) computeDiscardInfo() {
|
||||||
|
di.lock.Lock()
|
||||||
|
defer di.lock.Unlock()
|
||||||
|
if di.initialized != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t := di.typ
|
||||||
|
n := t.NumField()
|
||||||
|
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
f := t.Field(i)
|
||||||
|
if strings.HasPrefix(f.Name, "XXX_") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
dfi := discardFieldInfo{field: toField(&f)}
|
||||||
|
tf := f.Type
|
||||||
|
|
||||||
|
// Unwrap tf to get its most basic type.
|
||||||
|
var isPointer, isSlice bool
|
||||||
|
if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 {
|
||||||
|
isSlice = true
|
||||||
|
tf = tf.Elem()
|
||||||
|
}
|
||||||
|
if tf.Kind() == reflect.Ptr {
|
||||||
|
isPointer = true
|
||||||
|
tf = tf.Elem()
|
||||||
|
}
|
||||||
|
if isPointer && isSlice && tf.Kind() != reflect.Struct {
|
||||||
|
panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name))
|
||||||
|
}
|
||||||
|
|
||||||
|
switch tf.Kind() {
|
||||||
|
case reflect.Struct:
|
||||||
|
switch {
|
||||||
|
case !isPointer:
|
||||||
|
panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name))
|
||||||
|
case isSlice: // E.g., []*pb.T
|
||||||
|
di := getDiscardInfo(tf)
|
||||||
|
dfi.discard = func(src pointer) {
|
||||||
|
sps := src.getPointerSlice()
|
||||||
|
for _, sp := range sps {
|
||||||
|
if !sp.isNil() {
|
||||||
|
di.discard(sp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default: // E.g., *pb.T
|
||||||
|
di := getDiscardInfo(tf)
|
||||||
|
dfi.discard = func(src pointer) {
|
||||||
|
sp := src.getPointer()
|
||||||
|
if !sp.isNil() {
|
||||||
|
di.discard(sp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case reflect.Map:
|
||||||
|
switch {
|
||||||
|
case isPointer || isSlice:
|
||||||
|
panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name))
|
||||||
|
default: // E.g., map[K]V
|
||||||
|
if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T)
|
||||||
|
dfi.discard = func(src pointer) {
|
||||||
|
sm := src.asPointerTo(tf).Elem()
|
||||||
|
if sm.Len() == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, key := range sm.MapKeys() {
|
||||||
|
val := sm.MapIndex(key)
|
||||||
|
DiscardUnknown(val.Interface().(Message))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dfi.discard = func(pointer) {} // Noop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case reflect.Interface:
|
||||||
|
// Must be oneof field.
|
||||||
|
switch {
|
||||||
|
case isPointer || isSlice:
|
||||||
|
panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name))
|
||||||
|
default: // E.g., interface{}
|
||||||
|
// TODO: Make this faster?
|
||||||
|
dfi.discard = func(src pointer) {
|
||||||
|
su := src.asPointerTo(tf).Elem()
|
||||||
|
if !su.IsNil() {
|
||||||
|
sv := su.Elem().Elem().Field(0)
|
||||||
|
if sv.Kind() == reflect.Ptr && sv.IsNil() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
switch sv.Type().Kind() {
|
||||||
|
case reflect.Ptr: // Proto struct (e.g., *T)
|
||||||
|
DiscardUnknown(sv.Interface().(Message))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
di.fields = append(di.fields, dfi)
|
||||||
|
}
|
||||||
|
|
||||||
|
di.unrecognized = invalidField
|
||||||
|
if f, ok := t.FieldByName("XXX_unrecognized"); ok {
|
||||||
|
if f.Type != reflect.TypeOf([]byte{}) {
|
||||||
|
panic("expected XXX_unrecognized to be of type []byte")
|
||||||
|
}
|
||||||
|
di.unrecognized = toField(&f)
|
||||||
|
}
|
||||||
|
|
||||||
|
atomic.StoreInt32(&di.initialized, 1)
|
||||||
|
}
|
||||||
|
|
||||||
func discardLegacy(m Message) {
|
func discardLegacy(m Message) {
|
||||||
v := reflect.ValueOf(m)
|
v := reflect.ValueOf(m)
|
||||||
if v.Kind() != reflect.Ptr || v.IsNil() {
|
if v.Kind() != reflect.Ptr || v.IsNil() {
|
||||||
@ -139,7 +338,7 @@ func discardLegacy(m Message) {
|
|||||||
|
|
||||||
// For proto2 messages, only discard unknown fields in message extensions
|
// For proto2 messages, only discard unknown fields in message extensions
|
||||||
// that have been accessed via GetExtension.
|
// that have been accessed via GetExtension.
|
||||||
if em, ok := extendable(m); ok {
|
if em, err := extendable(m); err == nil {
|
||||||
// Ignore lock since discardLegacy is not concurrency safe.
|
// Ignore lock since discardLegacy is not concurrency safe.
|
||||||
emm, _ := em.extensionsRead()
|
emm, _ := em.extensionsRead()
|
||||||
for _, mx := range emm {
|
for _, mx := range emm {
|
||||||
|
170
vendor/github.com/golang/protobuf/proto/discard_test.go
generated
vendored
Normal file
170
vendor/github.com/golang/protobuf/proto/discard_test.go
generated
vendored
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
// Go support for Protocol Buffers - Google's data interchange format
|
||||||
|
//
|
||||||
|
// Copyright 2017 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/test_proto"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestDiscardUnknown(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
desc string
|
||||||
|
in, want proto.Message
|
||||||
|
}{{
|
||||||
|
desc: "Nil",
|
||||||
|
in: nil, want: nil, // Should not panic
|
||||||
|
}, {
|
||||||
|
desc: "NilPtr",
|
||||||
|
in: (*proto3pb.Message)(nil), want: (*proto3pb.Message)(nil), // Should not panic
|
||||||
|
}, {
|
||||||
|
desc: "Nested",
|
||||||
|
in: &proto3pb.Message{
|
||||||
|
Name: "Aaron",
|
||||||
|
Nested: &proto3pb.Nested{Cute: true, XXX_unrecognized: []byte("blah")},
|
||||||
|
XXX_unrecognized: []byte("blah"),
|
||||||
|
},
|
||||||
|
want: &proto3pb.Message{
|
||||||
|
Name: "Aaron",
|
||||||
|
Nested: &proto3pb.Nested{Cute: true},
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
desc: "Slice",
|
||||||
|
in: &proto3pb.Message{
|
||||||
|
Name: "Aaron",
|
||||||
|
Children: []*proto3pb.Message{
|
||||||
|
{Name: "Sarah", XXX_unrecognized: []byte("blah")},
|
||||||
|
{Name: "Abraham", XXX_unrecognized: []byte("blah")},
|
||||||
|
},
|
||||||
|
XXX_unrecognized: []byte("blah"),
|
||||||
|
},
|
||||||
|
want: &proto3pb.Message{
|
||||||
|
Name: "Aaron",
|
||||||
|
Children: []*proto3pb.Message{
|
||||||
|
{Name: "Sarah"},
|
||||||
|
{Name: "Abraham"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
desc: "OneOf",
|
||||||
|
in: &pb.Communique{
|
||||||
|
Union: &pb.Communique_Msg{&pb.Strings{
|
||||||
|
StringField: proto.String("123"),
|
||||||
|
XXX_unrecognized: []byte("blah"),
|
||||||
|
}},
|
||||||
|
XXX_unrecognized: []byte("blah"),
|
||||||
|
},
|
||||||
|
want: &pb.Communique{
|
||||||
|
Union: &pb.Communique_Msg{&pb.Strings{StringField: proto.String("123")}},
|
||||||
|
},
|
||||||
|
}, {
|
||||||
|
desc: "Map",
|
||||||
|
in: &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{
|
||||||
|
0x4002: &pb.FloatingPoint{
|
||||||
|
Exact: proto.Bool(true),
|
||||||
|
XXX_unrecognized: []byte("blah"),
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
want: &pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{
|
||||||
|
0x4002: &pb.FloatingPoint{Exact: proto.Bool(true)},
|
||||||
|
}},
|
||||||
|
}, {
|
||||||
|
desc: "Extension",
|
||||||
|
in: func() proto.Message {
|
||||||
|
m := &pb.MyMessage{
|
||||||
|
Count: proto.Int32(42),
|
||||||
|
Somegroup: &pb.MyMessage_SomeGroup{
|
||||||
|
GroupField: proto.Int32(6),
|
||||||
|
XXX_unrecognized: []byte("blah"),
|
||||||
|
},
|
||||||
|
XXX_unrecognized: []byte("blah"),
|
||||||
|
}
|
||||||
|
proto.SetExtension(m, pb.E_Ext_More, &pb.Ext{
|
||||||
|
Data: proto.String("extension"),
|
||||||
|
XXX_unrecognized: []byte("blah"),
|
||||||
|
})
|
||||||
|
return m
|
||||||
|
}(),
|
||||||
|
want: func() proto.Message {
|
||||||
|
m := &pb.MyMessage{
|
||||||
|
Count: proto.Int32(42),
|
||||||
|
Somegroup: &pb.MyMessage_SomeGroup{GroupField: proto.Int32(6)},
|
||||||
|
}
|
||||||
|
proto.SetExtension(m, pb.E_Ext_More, &pb.Ext{Data: proto.String("extension")})
|
||||||
|
return m
|
||||||
|
}(),
|
||||||
|
}}
|
||||||
|
|
||||||
|
// Test the legacy code path.
|
||||||
|
for _, tt := range tests {
|
||||||
|
// Clone the input so that we don't alter the original.
|
||||||
|
in := tt.in
|
||||||
|
if in != nil {
|
||||||
|
in = proto.Clone(tt.in)
|
||||||
|
}
|
||||||
|
|
||||||
|
var m LegacyMessage
|
||||||
|
m.Message, _ = in.(*proto3pb.Message)
|
||||||
|
m.Communique, _ = in.(*pb.Communique)
|
||||||
|
m.MessageWithMap, _ = in.(*pb.MessageWithMap)
|
||||||
|
m.MyMessage, _ = in.(*pb.MyMessage)
|
||||||
|
proto.DiscardUnknown(&m)
|
||||||
|
if !proto.Equal(in, tt.want) {
|
||||||
|
t.Errorf("test %s/Legacy, expected unknown fields to be discarded\ngot %v\nwant %v", tt.desc, in, tt.want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
proto.DiscardUnknown(tt.in)
|
||||||
|
if !proto.Equal(tt.in, tt.want) {
|
||||||
|
t.Errorf("test %s, expected unknown fields to be discarded\ngot %v\nwant %v", tt.desc, tt.in, tt.want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LegacyMessage is a proto.Message that has several nested messages.
|
||||||
|
// This does not have the XXX_DiscardUnknown method and so forces DiscardUnknown
|
||||||
|
// to use the legacy fallback logic.
|
||||||
|
type LegacyMessage struct {
|
||||||
|
Message *proto3pb.Message
|
||||||
|
Communique *pb.Communique
|
||||||
|
MessageWithMap *pb.MessageWithMap
|
||||||
|
MyMessage *pb.MyMessage
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *LegacyMessage) Reset() { *m = LegacyMessage{} }
|
||||||
|
func (m *LegacyMessage) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*LegacyMessage) ProtoMessage() {}
|
1189
vendor/github.com/golang/protobuf/proto/encode.go
generated
vendored
1189
vendor/github.com/golang/protobuf/proto/encode.go
generated
vendored
File diff suppressed because it is too large
Load Diff
30
vendor/github.com/golang/protobuf/proto/equal.go
generated
vendored
30
vendor/github.com/golang/protobuf/proto/equal.go
generated
vendored
@ -109,15 +109,6 @@ func equalStruct(v1, v2 reflect.Value) bool {
|
|||||||
// set/unset mismatch
|
// set/unset mismatch
|
||||||
return false
|
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()
|
f1, f2 = f1.Elem(), f2.Elem()
|
||||||
}
|
}
|
||||||
if !equalAny(f1, f2, sprop.Prop[i]) {
|
if !equalAny(f1, f2, sprop.Prop[i]) {
|
||||||
@ -146,11 +137,7 @@ func equalStruct(v1, v2 reflect.Value) bool {
|
|||||||
|
|
||||||
u1 := uf.Bytes()
|
u1 := uf.Bytes()
|
||||||
u2 := v2.FieldByName("XXX_unrecognized").Bytes()
|
u2 := v2.FieldByName("XXX_unrecognized").Bytes()
|
||||||
if !bytes.Equal(u1, u2) {
|
return bytes.Equal(u1, u2)
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// v1 and v2 are known to have the same type.
|
// v1 and v2 are known to have the same type.
|
||||||
@ -261,6 +248,15 @@ func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool {
|
|||||||
|
|
||||||
m1, m2 := e1.value, e2.value
|
m1, m2 := e1.value, e2.value
|
||||||
|
|
||||||
|
if m1 == nil && m2 == nil {
|
||||||
|
// Both have only encoded form.
|
||||||
|
if bytes.Equal(e1.enc, e2.enc) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// The bytes are different, but the extensions might still be
|
||||||
|
// equal. We need to decode them to compare.
|
||||||
|
}
|
||||||
|
|
||||||
if m1 != nil && m2 != nil {
|
if m1 != nil && m2 != nil {
|
||||||
// Both are unencoded.
|
// Both are unencoded.
|
||||||
if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) {
|
if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) {
|
||||||
@ -276,8 +272,12 @@ func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool {
|
|||||||
desc = m[extNum]
|
desc = m[extNum]
|
||||||
}
|
}
|
||||||
if desc == nil {
|
if desc == nil {
|
||||||
|
// If both have only encoded form and the bytes are the same,
|
||||||
|
// it is handled above. We get here when the bytes are different.
|
||||||
|
// We don't know how to decode it, so just compare them as byte
|
||||||
|
// slices.
|
||||||
log.Printf("proto: don't know how to compare extension %d of %v", extNum, base)
|
log.Printf("proto: don't know how to compare extension %d of %v", extNum, base)
|
||||||
continue
|
return false
|
||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
if m1 == nil {
|
if m1 == nil {
|
||||||
|
22
vendor/github.com/golang/protobuf/proto/equal_test.go
generated
vendored
22
vendor/github.com/golang/protobuf/proto/equal_test.go
generated
vendored
@ -36,7 +36,7 @@ import (
|
|||||||
|
|
||||||
. "github.com/golang/protobuf/proto"
|
. "github.com/golang/protobuf/proto"
|
||||||
proto3pb "github.com/golang/protobuf/proto/proto3_proto"
|
proto3pb "github.com/golang/protobuf/proto/proto3_proto"
|
||||||
pb "github.com/golang/protobuf/proto/testdata"
|
pb "github.com/golang/protobuf/proto/test_proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Four identical base messages.
|
// Four identical base messages.
|
||||||
@ -45,6 +45,9 @@ var messageWithoutExtension = &pb.MyMessage{Count: Int32(7)}
|
|||||||
var messageWithExtension1a = &pb.MyMessage{Count: Int32(7)}
|
var messageWithExtension1a = &pb.MyMessage{Count: Int32(7)}
|
||||||
var messageWithExtension1b = &pb.MyMessage{Count: Int32(7)}
|
var messageWithExtension1b = &pb.MyMessage{Count: Int32(7)}
|
||||||
var messageWithExtension2 = &pb.MyMessage{Count: Int32(7)}
|
var messageWithExtension2 = &pb.MyMessage{Count: Int32(7)}
|
||||||
|
var messageWithExtension3a = &pb.MyMessage{Count: Int32(7)}
|
||||||
|
var messageWithExtension3b = &pb.MyMessage{Count: Int32(7)}
|
||||||
|
var messageWithExtension3c = &pb.MyMessage{Count: Int32(7)}
|
||||||
|
|
||||||
// Two messages with non-message extensions.
|
// Two messages with non-message extensions.
|
||||||
var messageWithInt32Extension1 = &pb.MyMessage{Count: Int32(8)}
|
var messageWithInt32Extension1 = &pb.MyMessage{Count: Int32(8)}
|
||||||
@ -83,6 +86,20 @@ func init() {
|
|||||||
if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(24)); err != nil {
|
if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(24)); err != nil {
|
||||||
panic("SetExtension on Int32-2 failed: " + err.Error())
|
panic("SetExtension on Int32-2 failed: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// messageWithExtension3{a,b,c} has unregistered extension.
|
||||||
|
if RegisteredExtensions(messageWithExtension3a)[200] != nil {
|
||||||
|
panic("expect extension 200 unregistered")
|
||||||
|
}
|
||||||
|
bytes := []byte{
|
||||||
|
0xc0, 0x0c, 0x01, // id=200, wiretype=0 (varint), data=1
|
||||||
|
}
|
||||||
|
bytes2 := []byte{
|
||||||
|
0xc0, 0x0c, 0x02, // id=200, wiretype=0 (varint), data=2
|
||||||
|
}
|
||||||
|
SetRawExtension(messageWithExtension3a, 200, bytes)
|
||||||
|
SetRawExtension(messageWithExtension3b, 200, bytes)
|
||||||
|
SetRawExtension(messageWithExtension3c, 200, bytes2)
|
||||||
}
|
}
|
||||||
|
|
||||||
var EqualTests = []struct {
|
var EqualTests = []struct {
|
||||||
@ -142,6 +159,9 @@ var EqualTests = []struct {
|
|||||||
{"int32 extension vs. itself", messageWithInt32Extension1, messageWithInt32Extension1, true},
|
{"int32 extension vs. itself", messageWithInt32Extension1, messageWithInt32Extension1, true},
|
||||||
{"int32 extension vs. a different int32", messageWithInt32Extension1, messageWithInt32Extension2, false},
|
{"int32 extension vs. a different int32", messageWithInt32Extension1, messageWithInt32Extension2, false},
|
||||||
|
|
||||||
|
{"unregistered extension same", messageWithExtension3a, messageWithExtension3b, true},
|
||||||
|
{"unregistered extension different", messageWithExtension3a, messageWithExtension3c, false},
|
||||||
|
|
||||||
{
|
{
|
||||||
"message with group",
|
"message with group",
|
||||||
&pb.MyMessage{
|
&pb.MyMessage{
|
||||||
|
208
vendor/github.com/golang/protobuf/proto/extensions.go
generated
vendored
208
vendor/github.com/golang/protobuf/proto/extensions.go
generated
vendored
@ -38,6 +38,7 @@ package proto
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
@ -91,14 +92,29 @@ func (n notLocker) Unlock() {}
|
|||||||
// extendable returns the extendableProto interface for the given generated proto message.
|
// 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
|
// If the proto message has the old extension format, it returns a wrapper that implements
|
||||||
// the extendableProto interface.
|
// the extendableProto interface.
|
||||||
func extendable(p interface{}) (extendableProto, bool) {
|
func extendable(p interface{}) (extendableProto, error) {
|
||||||
if ep, ok := p.(extendableProto); ok {
|
switch p := p.(type) {
|
||||||
return ep, ok
|
case extendableProto:
|
||||||
|
if isNilPtr(p) {
|
||||||
|
return nil, fmt.Errorf("proto: nil %T is not extendable", p)
|
||||||
|
}
|
||||||
|
return p, nil
|
||||||
|
case extendableProtoV1:
|
||||||
|
if isNilPtr(p) {
|
||||||
|
return nil, fmt.Errorf("proto: nil %T is not extendable", p)
|
||||||
|
}
|
||||||
|
return extensionAdapter{p}, nil
|
||||||
}
|
}
|
||||||
if ep, ok := p.(extendableProtoV1); ok {
|
// Don't allocate a specific error containing %T:
|
||||||
return extensionAdapter{ep}, ok
|
// this is the hot path for Clone and MarshalText.
|
||||||
}
|
return nil, errNotExtendable
|
||||||
return nil, false
|
}
|
||||||
|
|
||||||
|
var errNotExtendable = errors.New("proto: not an extendable proto.Message")
|
||||||
|
|
||||||
|
func isNilPtr(x interface{}) bool {
|
||||||
|
v := reflect.ValueOf(x)
|
||||||
|
return v.Kind() == reflect.Ptr && v.IsNil()
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX_InternalExtensions is an internal representation of proto extensions.
|
// XXX_InternalExtensions is an internal representation of proto extensions.
|
||||||
@ -143,9 +159,6 @@ func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Loc
|
|||||||
return e.p.extensionMap, &e.p.mu
|
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.
|
// ExtensionDesc represents an extension specification.
|
||||||
// Used in generated code from the protocol compiler.
|
// Used in generated code from the protocol compiler.
|
||||||
type ExtensionDesc struct {
|
type ExtensionDesc struct {
|
||||||
@ -179,8 +192,8 @@ type Extension struct {
|
|||||||
|
|
||||||
// SetRawExtension is for testing only.
|
// SetRawExtension is for testing only.
|
||||||
func SetRawExtension(base Message, id int32, b []byte) {
|
func SetRawExtension(base Message, id int32, b []byte) {
|
||||||
epb, ok := extendable(base)
|
epb, err := extendable(base)
|
||||||
if !ok {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
extmap := epb.extensionsWrite()
|
extmap := epb.extensionsWrite()
|
||||||
@ -205,7 +218,7 @@ func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error {
|
|||||||
pbi = ea.extendableProtoV1
|
pbi = ea.extendableProtoV1
|
||||||
}
|
}
|
||||||
if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b {
|
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())
|
return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a)
|
||||||
}
|
}
|
||||||
// Check the range.
|
// Check the range.
|
||||||
if !isExtensionField(pb, extension.Field) {
|
if !isExtensionField(pb, extension.Field) {
|
||||||
@ -250,85 +263,11 @@ func extensionProperties(ed *ExtensionDesc) *Properties {
|
|||||||
return 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.
|
// HasExtension returns whether the given extension is present in pb.
|
||||||
func HasExtension(pb Message, extension *ExtensionDesc) bool {
|
func HasExtension(pb Message, extension *ExtensionDesc) bool {
|
||||||
// TODO: Check types, field numbers, etc.?
|
// TODO: Check types, field numbers, etc.?
|
||||||
epb, ok := extendable(pb)
|
epb, err := extendable(pb)
|
||||||
if !ok {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
extmap, mu := epb.extensionsRead()
|
extmap, mu := epb.extensionsRead()
|
||||||
@ -336,15 +275,15 @@ func HasExtension(pb Message, extension *ExtensionDesc) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
mu.Lock()
|
mu.Lock()
|
||||||
_, ok = extmap[extension.Field]
|
_, ok := extmap[extension.Field]
|
||||||
mu.Unlock()
|
mu.Unlock()
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClearExtension removes the given extension from pb.
|
// ClearExtension removes the given extension from pb.
|
||||||
func ClearExtension(pb Message, extension *ExtensionDesc) {
|
func ClearExtension(pb Message, extension *ExtensionDesc) {
|
||||||
epb, ok := extendable(pb)
|
epb, err := extendable(pb)
|
||||||
if !ok {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// TODO: Check types, field numbers, etc.?
|
// TODO: Check types, field numbers, etc.?
|
||||||
@ -352,16 +291,26 @@ func ClearExtension(pb Message, extension *ExtensionDesc) {
|
|||||||
delete(extmap, extension.Field)
|
delete(extmap, extension.Field)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetExtension parses and returns the given extension of pb.
|
// GetExtension retrieves a proto2 extended field from pb.
|
||||||
// If the extension is not present and has no default value it returns ErrMissingExtension.
|
//
|
||||||
|
// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil),
|
||||||
|
// then GetExtension parses the encoded field and returns a Go value of the specified type.
|
||||||
|
// If the field is not present, then the default value is returned (if one is specified),
|
||||||
|
// otherwise ErrMissingExtension is reported.
|
||||||
|
//
|
||||||
|
// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil),
|
||||||
|
// then GetExtension returns the raw encoded bytes of the field extension.
|
||||||
func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {
|
func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {
|
||||||
epb, ok := extendable(pb)
|
epb, err := extendable(pb)
|
||||||
if !ok {
|
if err != nil {
|
||||||
return nil, errors.New("proto: not an extendable proto")
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := checkExtensionTypes(epb, extension); err != nil {
|
if extension.ExtendedType != nil {
|
||||||
return nil, err
|
// can only check type if this is a complete descriptor
|
||||||
|
if err := checkExtensionTypes(epb, extension); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
emap, mu := epb.extensionsRead()
|
emap, mu := epb.extensionsRead()
|
||||||
@ -388,6 +337,11 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {
|
|||||||
return e.value, nil
|
return e.value, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if extension.ExtensionType == nil {
|
||||||
|
// incomplete descriptor
|
||||||
|
return e.enc, nil
|
||||||
|
}
|
||||||
|
|
||||||
v, err := decodeExtension(e.enc, extension)
|
v, err := decodeExtension(e.enc, extension)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -405,6 +359,11 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {
|
|||||||
// defaultExtensionValue returns the default value for extension.
|
// defaultExtensionValue returns the default value for extension.
|
||||||
// If no default for an extension is defined ErrMissingExtension is returned.
|
// If no default for an extension is defined ErrMissingExtension is returned.
|
||||||
func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) {
|
func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) {
|
||||||
|
if extension.ExtensionType == nil {
|
||||||
|
// incomplete descriptor, so no default
|
||||||
|
return nil, ErrMissingExtension
|
||||||
|
}
|
||||||
|
|
||||||
t := reflect.TypeOf(extension.ExtensionType)
|
t := reflect.TypeOf(extension.ExtensionType)
|
||||||
props := extensionProperties(extension)
|
props := extensionProperties(extension)
|
||||||
|
|
||||||
@ -439,31 +398,28 @@ func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) {
|
|||||||
|
|
||||||
// decodeExtension decodes an extension encoded in b.
|
// decodeExtension decodes an extension encoded in b.
|
||||||
func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) {
|
func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) {
|
||||||
o := NewBuffer(b)
|
|
||||||
|
|
||||||
t := reflect.TypeOf(extension.ExtensionType)
|
t := reflect.TypeOf(extension.ExtensionType)
|
||||||
|
unmarshal := typeUnmarshaler(t, extension.Tag)
|
||||||
props := extensionProperties(extension)
|
|
||||||
|
|
||||||
// t is a pointer to a struct, pointer to basic type or a slice.
|
// t is a pointer to a struct, pointer to basic type or a slice.
|
||||||
// Allocate a "field" to store the pointer/slice itself; the
|
// Allocate space to store the pointer/slice.
|
||||||
// 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()
|
value := reflect.New(t).Elem()
|
||||||
|
|
||||||
|
var err error
|
||||||
for {
|
for {
|
||||||
// Discard wire type and field number varint. It isn't needed.
|
x, n := decodeVarint(b)
|
||||||
if _, err := o.DecodeVarint(); err != nil {
|
if n == 0 {
|
||||||
|
return nil, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b = b[n:]
|
||||||
|
wire := int(x) & 7
|
||||||
|
|
||||||
|
b, err = unmarshal(b, valToPointer(value.Addr()), wire)
|
||||||
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := props.dec(o, props, toStructPointer(value.Addr())); err != nil {
|
if len(b) == 0 {
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if o.index >= len(o.buf) {
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -473,9 +429,9 @@ func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) {
|
|||||||
// GetExtensions returns a slice of the extensions present in pb that are also listed in es.
|
// 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.
|
// 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) {
|
func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) {
|
||||||
epb, ok := extendable(pb)
|
epb, err := extendable(pb)
|
||||||
if !ok {
|
if err != nil {
|
||||||
return nil, errors.New("proto: not an extendable proto")
|
return nil, err
|
||||||
}
|
}
|
||||||
extensions = make([]interface{}, len(es))
|
extensions = make([]interface{}, len(es))
|
||||||
for i, e := range es {
|
for i, e := range es {
|
||||||
@ -494,9 +450,9 @@ func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, e
|
|||||||
// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing
|
// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing
|
||||||
// just the Field field, which defines the extension's field number.
|
// just the Field field, which defines the extension's field number.
|
||||||
func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) {
|
func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) {
|
||||||
epb, ok := extendable(pb)
|
epb, err := extendable(pb)
|
||||||
if !ok {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("proto: %T is not an extendable proto.Message", pb)
|
return nil, err
|
||||||
}
|
}
|
||||||
registeredExtensions := RegisteredExtensions(pb)
|
registeredExtensions := RegisteredExtensions(pb)
|
||||||
|
|
||||||
@ -523,9 +479,9 @@ func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) {
|
|||||||
|
|
||||||
// SetExtension sets the specified extension of pb to the specified value.
|
// SetExtension sets the specified extension of pb to the specified value.
|
||||||
func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error {
|
func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error {
|
||||||
epb, ok := extendable(pb)
|
epb, err := extendable(pb)
|
||||||
if !ok {
|
if err != nil {
|
||||||
return errors.New("proto: not an extendable proto")
|
return err
|
||||||
}
|
}
|
||||||
if err := checkExtensionTypes(epb, extension); err != nil {
|
if err := checkExtensionTypes(epb, extension); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -550,8 +506,8 @@ func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error
|
|||||||
|
|
||||||
// ClearAllExtensions clears all extensions from pb.
|
// ClearAllExtensions clears all extensions from pb.
|
||||||
func ClearAllExtensions(pb Message) {
|
func ClearAllExtensions(pb Message) {
|
||||||
epb, ok := extendable(pb)
|
epb, err := extendable(pb)
|
||||||
if !ok {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
m := epb.extensionsWrite()
|
m := epb.extensionsWrite()
|
||||||
|
192
vendor/github.com/golang/protobuf/proto/extensions_test.go
generated
vendored
192
vendor/github.com/golang/protobuf/proto/extensions_test.go
generated
vendored
@ -34,12 +34,14 @@ package proto_test
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
pb "github.com/golang/protobuf/proto/testdata"
|
pb "github.com/golang/protobuf/proto/test_proto"
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -64,7 +66,107 @@ func TestGetExtensionsWithMissingExtensions(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestExtensionDescsWithMissingExtensions(t *testing.T) {
|
func TestGetExtensionWithEmptyBuffer(t *testing.T) {
|
||||||
|
// Make sure that GetExtension returns an error if its
|
||||||
|
// undecoded buffer is empty.
|
||||||
|
msg := &pb.MyMessage{}
|
||||||
|
proto.SetRawExtension(msg, pb.E_Ext_More.Field, []byte{})
|
||||||
|
_, err := proto.GetExtension(msg, pb.E_Ext_More)
|
||||||
|
if want := io.ErrUnexpectedEOF; err != want {
|
||||||
|
t.Errorf("unexpected error in GetExtension from empty buffer: got %v, want %v", err, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetExtensionForIncompleteDesc(t *testing.T) {
|
||||||
|
msg := &pb.MyMessage{Count: proto.Int32(0)}
|
||||||
|
extdesc1 := &proto.ExtensionDesc{
|
||||||
|
ExtendedType: (*pb.MyMessage)(nil),
|
||||||
|
ExtensionType: (*bool)(nil),
|
||||||
|
Field: 123456789,
|
||||||
|
Name: "a.b",
|
||||||
|
Tag: "varint,123456789,opt",
|
||||||
|
}
|
||||||
|
ext1 := proto.Bool(true)
|
||||||
|
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: ([]byte)(nil),
|
||||||
|
Field: 123456790,
|
||||||
|
Name: "a.c",
|
||||||
|
Tag: "bytes,123456790,opt",
|
||||||
|
}
|
||||||
|
ext2 := []byte{0, 1, 2, 3, 4, 5, 6, 7}
|
||||||
|
if err := proto.SetExtension(msg, extdesc2, ext2); err != nil {
|
||||||
|
t.Fatalf("Could not set ext2: %s", err)
|
||||||
|
}
|
||||||
|
extdesc3 := &proto.ExtensionDesc{
|
||||||
|
ExtendedType: (*pb.MyMessage)(nil),
|
||||||
|
ExtensionType: (*pb.Ext)(nil),
|
||||||
|
Field: 123456791,
|
||||||
|
Name: "a.d",
|
||||||
|
Tag: "bytes,123456791,opt",
|
||||||
|
}
|
||||||
|
ext3 := &pb.Ext{Data: proto.String("foo")}
|
||||||
|
if err := proto.SetExtension(msg, extdesc3, ext3); err != nil {
|
||||||
|
t.Fatalf("Could not set ext3: %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)
|
||||||
|
}
|
||||||
|
|
||||||
|
var expected proto.Buffer
|
||||||
|
if err := expected.EncodeVarint(uint64((extdesc1.Field << 3) | proto.WireVarint)); err != nil {
|
||||||
|
t.Fatalf("failed to compute expected prefix for ext1: %s", err)
|
||||||
|
}
|
||||||
|
if err := expected.EncodeVarint(1 /* bool true */); err != nil {
|
||||||
|
t.Fatalf("failed to compute expected value for ext1: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if b, err := proto.GetExtension(msg, &proto.ExtensionDesc{Field: extdesc1.Field}); err != nil {
|
||||||
|
t.Fatalf("Failed to get raw value for ext1: %s", err)
|
||||||
|
} else if !reflect.DeepEqual(b, expected.Bytes()) {
|
||||||
|
t.Fatalf("Raw value for ext1: got %v, want %v", b, expected.Bytes())
|
||||||
|
}
|
||||||
|
|
||||||
|
expected = proto.Buffer{} // reset
|
||||||
|
if err := expected.EncodeVarint(uint64((extdesc2.Field << 3) | proto.WireBytes)); err != nil {
|
||||||
|
t.Fatalf("failed to compute expected prefix for ext2: %s", err)
|
||||||
|
}
|
||||||
|
if err := expected.EncodeRawBytes(ext2); err != nil {
|
||||||
|
t.Fatalf("failed to compute expected value for ext2: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if b, err := proto.GetExtension(msg, &proto.ExtensionDesc{Field: extdesc2.Field}); err != nil {
|
||||||
|
t.Fatalf("Failed to get raw value for ext2: %s", err)
|
||||||
|
} else if !reflect.DeepEqual(b, expected.Bytes()) {
|
||||||
|
t.Fatalf("Raw value for ext2: got %v, want %v", b, expected.Bytes())
|
||||||
|
}
|
||||||
|
|
||||||
|
expected = proto.Buffer{} // reset
|
||||||
|
if err := expected.EncodeVarint(uint64((extdesc3.Field << 3) | proto.WireBytes)); err != nil {
|
||||||
|
t.Fatalf("failed to compute expected prefix for ext3: %s", err)
|
||||||
|
}
|
||||||
|
if b, err := proto.Marshal(ext3); err != nil {
|
||||||
|
t.Fatalf("failed to compute expected value for ext3: %s", err)
|
||||||
|
} else if err := expected.EncodeRawBytes(b); err != nil {
|
||||||
|
t.Fatalf("failed to compute expected value for ext3: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if b, err := proto.GetExtension(msg, &proto.ExtensionDesc{Field: extdesc3.Field}); err != nil {
|
||||||
|
t.Fatalf("Failed to get raw value for ext3: %s", err)
|
||||||
|
} else if !reflect.DeepEqual(b, expected.Bytes()) {
|
||||||
|
t.Fatalf("Raw value for ext3: got %v, want %v", b, expected.Bytes())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestExtensionDescsWithUnregisteredExtensions(t *testing.T) {
|
||||||
msg := &pb.MyMessage{Count: proto.Int32(0)}
|
msg := &pb.MyMessage{Count: proto.Int32(0)}
|
||||||
extdesc1 := pb.E_Ext_More
|
extdesc1 := pb.E_Ext_More
|
||||||
if descs, err := proto.ExtensionDescs(msg); len(descs) != 0 || err != nil {
|
if descs, err := proto.ExtensionDescs(msg); len(descs) != 0 || err != nil {
|
||||||
@ -100,7 +202,7 @@ func TestExtensionDescsWithMissingExtensions(t *testing.T) {
|
|||||||
t.Fatalf("proto.ExtensionDescs: got error %v", err)
|
t.Fatalf("proto.ExtensionDescs: got error %v", err)
|
||||||
}
|
}
|
||||||
sortExtDescs(descs)
|
sortExtDescs(descs)
|
||||||
wantDescs := []*proto.ExtensionDesc{extdesc1, &proto.ExtensionDesc{Field: extdesc2.Field}}
|
wantDescs := []*proto.ExtensionDesc{extdesc1, {Field: extdesc2.Field}}
|
||||||
if !reflect.DeepEqual(descs, wantDescs) {
|
if !reflect.DeepEqual(descs, wantDescs) {
|
||||||
t.Errorf("proto.ExtensionDescs(msg) sorted extension ids: got %+v, want %+v", descs, wantDescs)
|
t.Errorf("proto.ExtensionDescs(msg) sorted extension ids: got %+v, want %+v", descs, wantDescs)
|
||||||
}
|
}
|
||||||
@ -200,7 +302,7 @@ func TestGetExtensionDefaults(t *testing.T) {
|
|||||||
{pb.E_DefaultSfixed64, setInt64, int64(51)},
|
{pb.E_DefaultSfixed64, setInt64, int64(51)},
|
||||||
{pb.E_DefaultBool, setBool, true},
|
{pb.E_DefaultBool, setBool, true},
|
||||||
{pb.E_DefaultBool, setBool2, true},
|
{pb.E_DefaultBool, setBool2, true},
|
||||||
{pb.E_DefaultString, setString, "Hello, string"},
|
{pb.E_DefaultString, setString, "Hello, string,def=foo"},
|
||||||
{pb.E_DefaultBytes, setBytes, []byte("Hello, bytes")},
|
{pb.E_DefaultBytes, setBytes, []byte("Hello, bytes")},
|
||||||
{pb.E_DefaultEnum, setEnum, pb.DefaultsMessage_ONE},
|
{pb.E_DefaultEnum, setEnum, pb.DefaultsMessage_ONE},
|
||||||
}
|
}
|
||||||
@ -287,6 +389,44 @@ func TestGetExtensionDefaults(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNilMessage(t *testing.T) {
|
||||||
|
name := "nil interface"
|
||||||
|
if got, err := proto.GetExtension(nil, pb.E_Ext_More); err == nil {
|
||||||
|
t.Errorf("%s: got %T %v, expected to fail", name, got, got)
|
||||||
|
} else if !strings.Contains(err.Error(), "extendable") {
|
||||||
|
t.Errorf("%s: got error %v, expected not-extendable error", name, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Regression tests: all functions of the Extension API
|
||||||
|
// used to panic when passed (*M)(nil), where M is a concrete message
|
||||||
|
// type. Now they handle this gracefully as a no-op or reported error.
|
||||||
|
var nilMsg *pb.MyMessage
|
||||||
|
desc := pb.E_Ext_More
|
||||||
|
|
||||||
|
isNotExtendable := func(err error) bool {
|
||||||
|
return strings.Contains(fmt.Sprint(err), "not extendable")
|
||||||
|
}
|
||||||
|
|
||||||
|
if proto.HasExtension(nilMsg, desc) {
|
||||||
|
t.Error("HasExtension(nil) = true")
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := proto.GetExtensions(nilMsg, []*proto.ExtensionDesc{desc}); !isNotExtendable(err) {
|
||||||
|
t.Errorf("GetExtensions(nil) = %q (wrong error)", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := proto.ExtensionDescs(nilMsg); !isNotExtendable(err) {
|
||||||
|
t.Errorf("ExtensionDescs(nil) = %q (wrong error)", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := proto.SetExtension(nilMsg, desc, nil); !isNotExtendable(err) {
|
||||||
|
t.Errorf("SetExtension(nil) = %q (wrong error)", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
proto.ClearExtension(nilMsg, desc) // no-op
|
||||||
|
proto.ClearAllExtensions(nilMsg) // no-op
|
||||||
|
}
|
||||||
|
|
||||||
func TestExtensionsRoundTrip(t *testing.T) {
|
func TestExtensionsRoundTrip(t *testing.T) {
|
||||||
msg := &pb.MyMessage{}
|
msg := &pb.MyMessage{}
|
||||||
ext1 := &pb.Ext{
|
ext1 := &pb.Ext{
|
||||||
@ -311,7 +451,7 @@ func TestExtensionsRoundTrip(t *testing.T) {
|
|||||||
}
|
}
|
||||||
x, ok := e.(*pb.Ext)
|
x, ok := e.(*pb.Ext)
|
||||||
if !ok {
|
if !ok {
|
||||||
t.Errorf("e has type %T, expected testdata.Ext", e)
|
t.Errorf("e has type %T, expected test_proto.Ext", e)
|
||||||
} else if *x.Data != "there" {
|
} else if *x.Data != "there" {
|
||||||
t.Errorf("SetExtension failed to overwrite, got %+v, not 'there'", x)
|
t.Errorf("SetExtension failed to overwrite, got %+v, not 'there'", x)
|
||||||
}
|
}
|
||||||
@ -339,7 +479,7 @@ func TestNilExtension(t *testing.T) {
|
|||||||
}
|
}
|
||||||
if err := proto.SetExtension(msg, pb.E_Ext_More, (*pb.Ext)(nil)); err == nil {
|
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")
|
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 {
|
} else if want := fmt.Sprintf("proto: SetExtension called with nil value of type %T", new(pb.Ext)); err.Error() != want {
|
||||||
t.Errorf("expected error %v, got %v", want, err)
|
t.Errorf("expected error %v, got %v", want, err)
|
||||||
}
|
}
|
||||||
// Note: if the behavior of Marshal is ever changed to ignore nil extensions, update
|
// Note: if the behavior of Marshal is ever changed to ignore nil extensions, update
|
||||||
@ -402,8 +542,13 @@ func TestMarshalUnmarshalRepeatedExtension(t *testing.T) {
|
|||||||
if ext == nil {
|
if ext == nil {
|
||||||
t.Fatalf("[%s] Invalid extension", test.name)
|
t.Fatalf("[%s] Invalid extension", test.name)
|
||||||
}
|
}
|
||||||
if !reflect.DeepEqual(ext, test.ext) {
|
if len(ext) != len(test.ext) {
|
||||||
t.Errorf("[%s] Wrong value for ComplexExtension: got: %v want: %v\n", test.name, ext, test.ext)
|
t.Errorf("[%s] Wrong length of ComplexExtension: got: %v want: %v\n", test.name, len(ext), len(test.ext))
|
||||||
|
}
|
||||||
|
for i := range test.ext {
|
||||||
|
if !proto.Equal(ext[i], test.ext[i]) {
|
||||||
|
t.Errorf("[%s] Wrong value for ComplexExtension[%d]: got: %v want: %v\n", test.name, i, ext[i], test.ext[i])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -477,8 +622,8 @@ func TestUnmarshalRepeatingNonRepeatedExtension(t *testing.T) {
|
|||||||
if ext == nil {
|
if ext == nil {
|
||||||
t.Fatalf("[%s] Invalid extension", test.name)
|
t.Fatalf("[%s] Invalid extension", test.name)
|
||||||
}
|
}
|
||||||
if !reflect.DeepEqual(*ext, want) {
|
if !proto.Equal(ext, &want) {
|
||||||
t.Errorf("[%s] Wrong value for ComplexExtension: got: %s want: %s\n", test.name, ext, want)
|
t.Errorf("[%s] Wrong value for ComplexExtension: got: %s want: %s\n", test.name, ext, &want)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -509,19 +654,22 @@ func TestClearAllExtensions(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestMarshalRace(t *testing.T) {
|
func TestMarshalRace(t *testing.T) {
|
||||||
// unregistered extension
|
ext := &pb.Ext{}
|
||||||
desc := &proto.ExtensionDesc{
|
m := &pb.MyMessage{Count: proto.Int32(4)}
|
||||||
ExtendedType: (*pb.MyMessage)(nil),
|
if err := proto.SetExtension(m, pb.E_Ext_More, ext); err != nil {
|
||||||
ExtensionType: (*bool)(nil),
|
t.Fatalf("proto.SetExtension(m, desc, true): got error %q, want nil", err)
|
||||||
Field: 101010100,
|
|
||||||
Name: "emptyextension",
|
|
||||||
Tag: "varint,0,opt",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m := &pb.MyMessage{Count: proto.Int32(4)}
|
b, err := proto.Marshal(m)
|
||||||
if err := proto.SetExtension(m, desc, proto.Bool(true)); err != nil {
|
if err != nil {
|
||||||
t.Errorf("proto.SetExtension(m, desc, true): got error %q, want nil", err)
|
t.Fatalf("Could not marshal message: %v", err)
|
||||||
}
|
}
|
||||||
|
if err := proto.Unmarshal(b, m); err != nil {
|
||||||
|
t.Fatalf("Could not unmarshal message: %v", err)
|
||||||
|
}
|
||||||
|
// after Unmarshal, the extension is in undecoded form.
|
||||||
|
// GetExtension will decode it lazily. Make sure this does
|
||||||
|
// not race against Marshal.
|
||||||
|
|
||||||
var g errgroup.Group
|
var g errgroup.Group
|
||||||
for n := 3; n > 0; n-- {
|
for n := 3; n > 0; n-- {
|
||||||
@ -529,6 +677,10 @@ func TestMarshalRace(t *testing.T) {
|
|||||||
_, err := proto.Marshal(m)
|
_, err := proto.Marshal(m)
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
|
g.Go(func() error {
|
||||||
|
_, err := proto.GetExtension(m, pb.E_Ext_More)
|
||||||
|
return err
|
||||||
|
})
|
||||||
}
|
}
|
||||||
if err := g.Wait(); err != nil {
|
if err := g.Wait(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
70
vendor/github.com/golang/protobuf/proto/lib.go
generated
vendored
70
vendor/github.com/golang/protobuf/proto/lib.go
generated
vendored
@ -265,6 +265,7 @@ package proto
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"reflect"
|
"reflect"
|
||||||
@ -273,6 +274,8 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var errInvalidUTF8 = errors.New("proto: invalid UTF-8 string")
|
||||||
|
|
||||||
// Message is implemented by generated protocol buffer messages.
|
// Message is implemented by generated protocol buffer messages.
|
||||||
type Message interface {
|
type Message interface {
|
||||||
Reset()
|
Reset()
|
||||||
@ -309,16 +312,7 @@ type Buffer struct {
|
|||||||
buf []byte // encode/decode byte stream
|
buf []byte // encode/decode byte stream
|
||||||
index int // read point
|
index int // read point
|
||||||
|
|
||||||
// pools of basic types to amortize allocation.
|
deterministic bool
|
||||||
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
|
// NewBuffer allocates a new Buffer and initializes its internal data to
|
||||||
@ -343,6 +337,30 @@ func (p *Buffer) SetBuf(s []byte) {
|
|||||||
// Bytes returns the contents of the Buffer.
|
// Bytes returns the contents of the Buffer.
|
||||||
func (p *Buffer) Bytes() []byte { return p.buf }
|
func (p *Buffer) Bytes() []byte { return p.buf }
|
||||||
|
|
||||||
|
// SetDeterministic sets whether to use deterministic serialization.
|
||||||
|
//
|
||||||
|
// Deterministic serialization guarantees that for a given binary, equal
|
||||||
|
// messages will always be serialized to the same bytes. This implies:
|
||||||
|
//
|
||||||
|
// - Repeated serialization of a message will return the same bytes.
|
||||||
|
// - Different processes of the same binary (which may be executing on
|
||||||
|
// different machines) will serialize equal messages to the same bytes.
|
||||||
|
//
|
||||||
|
// Note that the deterministic serialization is NOT canonical across
|
||||||
|
// languages. It is not guaranteed to remain stable over time. It is unstable
|
||||||
|
// across different builds with schema changes due to unknown fields.
|
||||||
|
// Users who need canonical serialization (e.g., persistent storage in a
|
||||||
|
// canonical form, fingerprinting, etc.) should define their own
|
||||||
|
// canonicalization specification and implement their own serializer rather
|
||||||
|
// than relying on this API.
|
||||||
|
//
|
||||||
|
// If deterministic serialization is requested, map entries will be sorted
|
||||||
|
// by keys in lexographical order. This is an implementation detail and
|
||||||
|
// subject to change.
|
||||||
|
func (p *Buffer) SetDeterministic(deterministic bool) {
|
||||||
|
p.deterministic = deterministic
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Helper routines for simplifying the creation of optional fields of basic type.
|
* Helper routines for simplifying the creation of optional fields of basic type.
|
||||||
*/
|
*/
|
||||||
@ -831,22 +849,12 @@ func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMes
|
|||||||
return sf, false, nil
|
return sf, false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// mapKeys returns a sort.Interface to be used for sorting the map keys.
|
||||||
// Map fields may have key types of non-float scalars, strings and enums.
|
// 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 {
|
func mapKeys(vs []reflect.Value) sort.Interface {
|
||||||
s := mapKeySorter{
|
s := mapKeySorter{vs: vs}
|
||||||
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;
|
// Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps.
|
||||||
// numeric keys are sorted numerically.
|
|
||||||
if len(vs) == 0 {
|
if len(vs) == 0 {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
@ -855,6 +863,12 @@ func mapKeys(vs []reflect.Value) sort.Interface {
|
|||||||
s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() }
|
s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() }
|
||||||
case reflect.Uint32, reflect.Uint64:
|
case reflect.Uint32, reflect.Uint64:
|
||||||
s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() }
|
s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() }
|
||||||
|
case reflect.Bool:
|
||||||
|
s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true
|
||||||
|
case reflect.String:
|
||||||
|
s.less = func(a, b reflect.Value) bool { return a.String() < b.String() }
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind()))
|
||||||
}
|
}
|
||||||
|
|
||||||
return s
|
return s
|
||||||
@ -895,3 +909,13 @@ const ProtoPackageIsVersion2 = true
|
|||||||
// ProtoPackageIsVersion1 is referenced from generated protocol buffer files
|
// ProtoPackageIsVersion1 is referenced from generated protocol buffer files
|
||||||
// to assert that that code is compatible with this version of the proto package.
|
// to assert that that code is compatible with this version of the proto package.
|
||||||
const ProtoPackageIsVersion1 = true
|
const ProtoPackageIsVersion1 = true
|
||||||
|
|
||||||
|
// InternalMessageInfo is a type used internally by generated .pb.go files.
|
||||||
|
// This type is not intended to be used by non-generated code.
|
||||||
|
// This type is not subject to any compatibility guarantee.
|
||||||
|
type InternalMessageInfo struct {
|
||||||
|
marshal *marshalInfo
|
||||||
|
unmarshal *unmarshalInfo
|
||||||
|
merge *mergeInfo
|
||||||
|
discard *discardInfo
|
||||||
|
}
|
||||||
|
24
vendor/github.com/golang/protobuf/proto/map_test.go
generated
vendored
24
vendor/github.com/golang/protobuf/proto/map_test.go
generated
vendored
@ -2,12 +2,36 @@ package proto_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
ppb "github.com/golang/protobuf/proto/proto3_proto"
|
ppb "github.com/golang/protobuf/proto/proto3_proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestMap(t *testing.T) {
|
||||||
|
var b []byte
|
||||||
|
fmt.Sscanf("a2010c0a044b657931120456616c31a201130a044b657932120556616c3261120456616c32a201240a044b6579330d05000000120556616c33621a0556616c3361120456616c331505000000a20100a201260a044b657934130a07536f6d6555524c1209536f6d655469746c651a08536e69707065743114", "%x", &b)
|
||||||
|
|
||||||
|
var m ppb.Message
|
||||||
|
if err := proto.Unmarshal(b, &m); err != nil {
|
||||||
|
t.Fatalf("proto.Unmarshal error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
got := m.StringMap
|
||||||
|
want := map[string]string{
|
||||||
|
"": "",
|
||||||
|
"Key1": "Val1",
|
||||||
|
"Key2": "Val2",
|
||||||
|
"Key3": "Val3",
|
||||||
|
"Key4": "",
|
||||||
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(got, want) {
|
||||||
|
t.Errorf("maps differ:\ngot %#v\nwant %#v", got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func marshalled() []byte {
|
func marshalled() []byte {
|
||||||
m := &ppb.IntMaps{}
|
m := &ppb.IntMaps{}
|
||||||
for i := 0; i < 1000; i++ {
|
for i := 0; i < 1000; i++ {
|
||||||
|
81
vendor/github.com/golang/protobuf/proto/message_set.go
generated
vendored
81
vendor/github.com/golang/protobuf/proto/message_set.go
generated
vendored
@ -42,6 +42,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID.
|
// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID.
|
||||||
@ -94,10 +95,7 @@ func (ms *messageSet) find(pb Message) *_MessageSet_Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ms *messageSet) Has(pb Message) bool {
|
func (ms *messageSet) Has(pb Message) bool {
|
||||||
if ms.find(pb) != nil {
|
return ms.find(pb) != nil
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ms *messageSet) Unmarshal(pb Message) error {
|
func (ms *messageSet) Unmarshal(pb Message) error {
|
||||||
@ -150,46 +148,42 @@ func skipVarint(buf []byte) []byte {
|
|||||||
// MarshalMessageSet encodes the extension map represented by m in the message set wire format.
|
// 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.
|
// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option.
|
||||||
func MarshalMessageSet(exts interface{}) ([]byte, error) {
|
func MarshalMessageSet(exts interface{}) ([]byte, error) {
|
||||||
var m map[int32]Extension
|
return marshalMessageSet(exts, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// marshaMessageSet implements above function, with the opt to turn on / off deterministic during Marshal.
|
||||||
|
func marshalMessageSet(exts interface{}, deterministic bool) ([]byte, error) {
|
||||||
switch exts := exts.(type) {
|
switch exts := exts.(type) {
|
||||||
case *XXX_InternalExtensions:
|
case *XXX_InternalExtensions:
|
||||||
if err := encodeExtensions(exts); err != nil {
|
var u marshalInfo
|
||||||
return nil, err
|
siz := u.sizeMessageSet(exts)
|
||||||
}
|
b := make([]byte, 0, siz)
|
||||||
m, _ = exts.extensionsRead()
|
return u.appendMessageSet(b, exts, deterministic)
|
||||||
|
|
||||||
case map[int32]Extension:
|
case map[int32]Extension:
|
||||||
if err := encodeExtensionsMap(exts); err != nil {
|
// This is an old-style extension map.
|
||||||
return nil, err
|
// Wrap it in a new-style XXX_InternalExtensions.
|
||||||
|
ie := XXX_InternalExtensions{
|
||||||
|
p: &struct {
|
||||||
|
mu sync.Mutex
|
||||||
|
extensionMap map[int32]Extension
|
||||||
|
}{
|
||||||
|
extensionMap: exts,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
m = exts
|
|
||||||
|
var u marshalInfo
|
||||||
|
siz := u.sizeMessageSet(&ie)
|
||||||
|
b := make([]byte, 0, siz)
|
||||||
|
return u.appendMessageSet(b, &ie, deterministic)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return nil, errors.New("proto: not an extension map")
|
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.
|
// 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.
|
// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option.
|
||||||
func UnmarshalMessageSet(buf []byte, exts interface{}) error {
|
func UnmarshalMessageSet(buf []byte, exts interface{}) error {
|
||||||
var m map[int32]Extension
|
var m map[int32]Extension
|
||||||
switch exts := exts.(type) {
|
switch exts := exts.(type) {
|
||||||
@ -235,7 +229,15 @@ func MarshalMessageSetJSON(exts interface{}) ([]byte, error) {
|
|||||||
var m map[int32]Extension
|
var m map[int32]Extension
|
||||||
switch exts := exts.(type) {
|
switch exts := exts.(type) {
|
||||||
case *XXX_InternalExtensions:
|
case *XXX_InternalExtensions:
|
||||||
m, _ = exts.extensionsRead()
|
var mu sync.Locker
|
||||||
|
m, mu = exts.extensionsRead()
|
||||||
|
if m != nil {
|
||||||
|
// Keep the extensions map locked until we're done marshaling to prevent
|
||||||
|
// races between marshaling and unmarshaling the lazily-{en,de}coded
|
||||||
|
// values.
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
}
|
||||||
case map[int32]Extension:
|
case map[int32]Extension:
|
||||||
m = exts
|
m = exts
|
||||||
default:
|
default:
|
||||||
@ -253,15 +255,16 @@ func MarshalMessageSetJSON(exts interface{}) ([]byte, error) {
|
|||||||
|
|
||||||
for i, id := range ids {
|
for i, id := range ids {
|
||||||
ext := m[id]
|
ext := m[id]
|
||||||
if i > 0 {
|
|
||||||
b.WriteByte(',')
|
|
||||||
}
|
|
||||||
|
|
||||||
msd, ok := messageSetMap[id]
|
msd, ok := messageSetMap[id]
|
||||||
if !ok {
|
if !ok {
|
||||||
// Unknown type; we can't render it, so skip it.
|
// Unknown type; we can't render it, so skip it.
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if i > 0 && b.Len() > 1 {
|
||||||
|
b.WriteByte(',')
|
||||||
|
}
|
||||||
|
|
||||||
fmt.Fprintf(&b, `"[%s]":`, msd.name)
|
fmt.Fprintf(&b, `"[%s]":`, msd.name)
|
||||||
|
|
||||||
x := ext.value
|
x := ext.value
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user