chore: upgrade dependencies
This commit is contained in:
		
							
								
								
									
										8
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								go.mod
									
									
									
									
									
								
							@@ -3,19 +3,19 @@ module github.com/cyrilix/robocar-led
 | 
				
			|||||||
go 1.17
 | 
					go 1.17
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/cyrilix/robocar-base v0.1.5
 | 
						github.com/cyrilix/robocar-base v0.1.6
 | 
				
			||||||
	github.com/cyrilix/robocar-protobuf/go v1.0.3
 | 
						github.com/cyrilix/robocar-protobuf/go v1.0.4
 | 
				
			||||||
	github.com/eclipse/paho.mqtt.golang v1.3.5
 | 
						github.com/eclipse/paho.mqtt.golang v1.3.5
 | 
				
			||||||
	github.com/golang/protobuf v1.5.2
 | 
					 | 
				
			||||||
	go.uber.org/zap v1.19.1
 | 
						go.uber.org/zap v1.19.1
 | 
				
			||||||
 | 
						google.golang.org/protobuf v1.27.1
 | 
				
			||||||
	periph.io/x/conn/v3 v3.6.10
 | 
						periph.io/x/conn/v3 v3.6.10
 | 
				
			||||||
	periph.io/x/host/v3 v3.7.2
 | 
						periph.io/x/host/v3 v3.7.2
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
 | 
						github.com/golang/protobuf v1.5.2 // indirect
 | 
				
			||||||
	github.com/gorilla/websocket v1.4.2 // indirect
 | 
						github.com/gorilla/websocket v1.4.2 // indirect
 | 
				
			||||||
	go.uber.org/atomic v1.7.0 // indirect
 | 
						go.uber.org/atomic v1.7.0 // indirect
 | 
				
			||||||
	go.uber.org/multierr v1.6.0 // indirect
 | 
						go.uber.org/multierr v1.6.0 // indirect
 | 
				
			||||||
	golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect
 | 
						golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect
 | 
				
			||||||
	google.golang.org/protobuf v1.27.1 // indirect
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										8
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								go.sum
									
									
									
									
									
								
							@@ -8,10 +8,10 @@ github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QH
 | 
				
			|||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
					github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
				
			||||||
github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
 | 
					github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
 | 
				
			||||||
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 | 
					github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 | 
				
			||||||
github.com/cyrilix/robocar-base v0.1.5 h1:EfbYHB69hgyQCVuzZ9/ifdSrQfXS7+04M8O9BDu1/5w=
 | 
					github.com/cyrilix/robocar-base v0.1.6 h1:VVcSZD8DPsha3XDLxRBMvtcd6uC8CcIjqbxG482dxvo=
 | 
				
			||||||
github.com/cyrilix/robocar-base v0.1.5/go.mod h1:tb7R5OFoBn9EWNLX3Kzx6R/3cQ9/7r8XsHvlLSESOAM=
 | 
					github.com/cyrilix/robocar-base v0.1.6/go.mod h1:m5ov/7hpRHi0yMp2prKafL6UEsM2O71Uea85WR0/jjI=
 | 
				
			||||||
github.com/cyrilix/robocar-protobuf/go v1.0.3 h1:iPHw2+7FVXG2C4+Th1m11hQ+2RpAQzlxKhc5M7XOa6Q=
 | 
					github.com/cyrilix/robocar-protobuf/go v1.0.4 h1:XTolFYbiKw4gQ2l+z/LMZkLrmAUMzlHcQBzp/czlANo=
 | 
				
			||||||
github.com/cyrilix/robocar-protobuf/go v1.0.3/go.mod h1:xb95cK07lYXnKcHZKnGafmAgYRrqZWZgV9LMiJAp+gE=
 | 
					github.com/cyrilix/robocar-protobuf/go v1.0.4/go.mod h1:1fyGMVm4ZodfYRrbWCEQgtvKyvrhyTBe5zA7/Qeh/H0=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
					github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,8 +6,8 @@ import (
 | 
				
			|||||||
	"github.com/cyrilix/robocar-led/pkg/led"
 | 
						"github.com/cyrilix/robocar-led/pkg/led"
 | 
				
			||||||
	"github.com/cyrilix/robocar-protobuf/go/events"
 | 
						"github.com/cyrilix/robocar-protobuf/go/events"
 | 
				
			||||||
	mqtt "github.com/eclipse/paho.mqtt.golang"
 | 
						mqtt "github.com/eclipse/paho.mqtt.golang"
 | 
				
			||||||
	"github.com/golang/protobuf/proto"
 | 
					 | 
				
			||||||
	"go.uber.org/zap"
 | 
						"go.uber.org/zap"
 | 
				
			||||||
 | 
						"google.golang.org/protobuf/proto"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@ import (
 | 
				
			|||||||
	"github.com/cyrilix/robocar-led/pkg/led"
 | 
						"github.com/cyrilix/robocar-led/pkg/led"
 | 
				
			||||||
	"github.com/cyrilix/robocar-protobuf/go/events"
 | 
						"github.com/cyrilix/robocar-protobuf/go/events"
 | 
				
			||||||
	mqtt "github.com/eclipse/paho.mqtt.golang"
 | 
						mqtt "github.com/eclipse/paho.mqtt.golang"
 | 
				
			||||||
	"github.com/golang/protobuf/proto"
 | 
						"google.golang.org/protobuf/proto"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/cyrilix/robocar-base/testtools/testtools.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/cyrilix/robocar-base/testtools/testtools.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,8 +2,8 @@ package testtools
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	mqtt "github.com/eclipse/paho.mqtt.golang"
 | 
						mqtt "github.com/eclipse/paho.mqtt.golang"
 | 
				
			||||||
	"github.com/golang/protobuf/proto"
 | 
					 | 
				
			||||||
	"go.uber.org/zap"
 | 
						"go.uber.org/zap"
 | 
				
			||||||
 | 
						"google.golang.org/protobuf/proto"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type fakeMessage struct {
 | 
					type fakeMessage struct {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/cyrilix/robocar-protobuf/go/events/events.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/cyrilix/robocar-protobuf/go/events/events.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
					// Code generated by protoc-gen-go. DO NOT EDIT.
 | 
				
			||||||
// versions:
 | 
					// versions:
 | 
				
			||||||
// 	protoc-gen-go v1.26.0
 | 
					// 	protoc-gen-go v1.27.1
 | 
				
			||||||
// 	protoc        v3.12.4
 | 
					// 	protoc        v3.12.4
 | 
				
			||||||
// source: events/events.proto
 | 
					// source: events/events.proto
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										324
									
								
								vendor/github.com/golang/protobuf/proto/buffer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										324
									
								
								vendor/github.com/golang/protobuf/proto/buffer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,324 +0,0 @@
 | 
				
			|||||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/encoding/prototext"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/encoding/protowire"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/runtime/protoimpl"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	WireVarint     = 0
 | 
					 | 
				
			||||||
	WireFixed32    = 5
 | 
					 | 
				
			||||||
	WireFixed64    = 1
 | 
					 | 
				
			||||||
	WireBytes      = 2
 | 
					 | 
				
			||||||
	WireStartGroup = 3
 | 
					 | 
				
			||||||
	WireEndGroup   = 4
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// EncodeVarint returns the varint encoded bytes of v.
 | 
					 | 
				
			||||||
func EncodeVarint(v uint64) []byte {
 | 
					 | 
				
			||||||
	return protowire.AppendVarint(nil, v)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SizeVarint returns the length of the varint encoded bytes of v.
 | 
					 | 
				
			||||||
// This is equal to len(EncodeVarint(v)).
 | 
					 | 
				
			||||||
func SizeVarint(v uint64) int {
 | 
					 | 
				
			||||||
	return protowire.SizeVarint(v)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DecodeVarint parses a varint encoded integer from b,
 | 
					 | 
				
			||||||
// returning the integer value and the length of the varint.
 | 
					 | 
				
			||||||
// It returns (0, 0) if there is a parse error.
 | 
					 | 
				
			||||||
func DecodeVarint(b []byte) (uint64, int) {
 | 
					 | 
				
			||||||
	v, n := protowire.ConsumeVarint(b)
 | 
					 | 
				
			||||||
	if n < 0 {
 | 
					 | 
				
			||||||
		return 0, 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return v, n
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Buffer is a buffer for encoding and decoding the protobuf wire format.
 | 
					 | 
				
			||||||
// It may be reused between invocations to reduce memory usage.
 | 
					 | 
				
			||||||
type Buffer struct {
 | 
					 | 
				
			||||||
	buf           []byte
 | 
					 | 
				
			||||||
	idx           int
 | 
					 | 
				
			||||||
	deterministic bool
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewBuffer allocates a new Buffer initialized with buf,
 | 
					 | 
				
			||||||
// where the contents of buf are considered the unread portion of the buffer.
 | 
					 | 
				
			||||||
func NewBuffer(buf []byte) *Buffer {
 | 
					 | 
				
			||||||
	return &Buffer{buf: buf}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SetDeterministic specifies 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 (b *Buffer) SetDeterministic(deterministic bool) {
 | 
					 | 
				
			||||||
	b.deterministic = deterministic
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SetBuf sets buf as the internal buffer,
 | 
					 | 
				
			||||||
// where the contents of buf are considered the unread portion of the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) SetBuf(buf []byte) {
 | 
					 | 
				
			||||||
	b.buf = buf
 | 
					 | 
				
			||||||
	b.idx = 0
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Reset clears the internal buffer of all written and unread data.
 | 
					 | 
				
			||||||
func (b *Buffer) Reset() {
 | 
					 | 
				
			||||||
	b.buf = b.buf[:0]
 | 
					 | 
				
			||||||
	b.idx = 0
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Bytes returns the internal buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) Bytes() []byte {
 | 
					 | 
				
			||||||
	return b.buf
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Unread returns the unread portion of the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) Unread() []byte {
 | 
					 | 
				
			||||||
	return b.buf[b.idx:]
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Marshal appends the wire-format encoding of m to the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) Marshal(m Message) error {
 | 
					 | 
				
			||||||
	var err error
 | 
					 | 
				
			||||||
	b.buf, err = marshalAppend(b.buf, m, b.deterministic)
 | 
					 | 
				
			||||||
	return err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Unmarshal parses the wire-format message in the buffer and
 | 
					 | 
				
			||||||
// places the decoded results in m.
 | 
					 | 
				
			||||||
// It does not reset m before unmarshaling.
 | 
					 | 
				
			||||||
func (b *Buffer) Unmarshal(m Message) error {
 | 
					 | 
				
			||||||
	err := UnmarshalMerge(b.Unread(), m)
 | 
					 | 
				
			||||||
	b.idx = len(b.buf)
 | 
					 | 
				
			||||||
	return err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type unknownFields struct{ XXX_unrecognized protoimpl.UnknownFields }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (m *unknownFields) String() string { panic("not implemented") }
 | 
					 | 
				
			||||||
func (m *unknownFields) Reset()         { panic("not implemented") }
 | 
					 | 
				
			||||||
func (m *unknownFields) ProtoMessage()  { panic("not implemented") }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DebugPrint dumps the encoded bytes of b with a header and footer including s
 | 
					 | 
				
			||||||
// to stdout. This is only intended for debugging.
 | 
					 | 
				
			||||||
func (*Buffer) DebugPrint(s string, b []byte) {
 | 
					 | 
				
			||||||
	m := MessageReflect(new(unknownFields))
 | 
					 | 
				
			||||||
	m.SetUnknown(b)
 | 
					 | 
				
			||||||
	b, _ = prototext.MarshalOptions{AllowPartial: true, Indent: "\t"}.Marshal(m.Interface())
 | 
					 | 
				
			||||||
	fmt.Printf("==== %s ====\n%s==== %s ====\n", s, b, s)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// EncodeVarint appends an unsigned varint encoding to the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) EncodeVarint(v uint64) error {
 | 
					 | 
				
			||||||
	b.buf = protowire.AppendVarint(b.buf, v)
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// EncodeZigzag32 appends a 32-bit zig-zag varint encoding to the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) EncodeZigzag32(v uint64) error {
 | 
					 | 
				
			||||||
	return b.EncodeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31))))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// EncodeZigzag64 appends a 64-bit zig-zag varint encoding to the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) EncodeZigzag64(v uint64) error {
 | 
					 | 
				
			||||||
	return b.EncodeVarint(uint64((uint64(v) << 1) ^ uint64((int64(v) >> 63))))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// EncodeFixed32 appends a 32-bit little-endian integer to the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) EncodeFixed32(v uint64) error {
 | 
					 | 
				
			||||||
	b.buf = protowire.AppendFixed32(b.buf, uint32(v))
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// EncodeFixed64 appends a 64-bit little-endian integer to the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) EncodeFixed64(v uint64) error {
 | 
					 | 
				
			||||||
	b.buf = protowire.AppendFixed64(b.buf, uint64(v))
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// EncodeRawBytes appends a length-prefixed raw bytes to the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) EncodeRawBytes(v []byte) error {
 | 
					 | 
				
			||||||
	b.buf = protowire.AppendBytes(b.buf, v)
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// EncodeStringBytes appends a length-prefixed raw bytes to the buffer.
 | 
					 | 
				
			||||||
// It does not validate whether v contains valid UTF-8.
 | 
					 | 
				
			||||||
func (b *Buffer) EncodeStringBytes(v string) error {
 | 
					 | 
				
			||||||
	b.buf = protowire.AppendString(b.buf, v)
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// EncodeMessage appends a length-prefixed encoded message to the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) EncodeMessage(m Message) error {
 | 
					 | 
				
			||||||
	var err error
 | 
					 | 
				
			||||||
	b.buf = protowire.AppendVarint(b.buf, uint64(Size(m)))
 | 
					 | 
				
			||||||
	b.buf, err = marshalAppend(b.buf, m, b.deterministic)
 | 
					 | 
				
			||||||
	return err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DecodeVarint consumes an encoded unsigned varint from the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) DecodeVarint() (uint64, error) {
 | 
					 | 
				
			||||||
	v, n := protowire.ConsumeVarint(b.buf[b.idx:])
 | 
					 | 
				
			||||||
	if n < 0 {
 | 
					 | 
				
			||||||
		return 0, protowire.ParseError(n)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	b.idx += n
 | 
					 | 
				
			||||||
	return uint64(v), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DecodeZigzag32 consumes an encoded 32-bit zig-zag varint from the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) DecodeZigzag32() (uint64, error) {
 | 
					 | 
				
			||||||
	v, err := b.DecodeVarint()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return 0, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return uint64((uint32(v) >> 1) ^ uint32((int32(v&1)<<31)>>31)), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DecodeZigzag64 consumes an encoded 64-bit zig-zag varint from the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) DecodeZigzag64() (uint64, error) {
 | 
					 | 
				
			||||||
	v, err := b.DecodeVarint()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return 0, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return uint64((uint64(v) >> 1) ^ uint64((int64(v&1)<<63)>>63)), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DecodeFixed32 consumes a 32-bit little-endian integer from the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) DecodeFixed32() (uint64, error) {
 | 
					 | 
				
			||||||
	v, n := protowire.ConsumeFixed32(b.buf[b.idx:])
 | 
					 | 
				
			||||||
	if n < 0 {
 | 
					 | 
				
			||||||
		return 0, protowire.ParseError(n)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	b.idx += n
 | 
					 | 
				
			||||||
	return uint64(v), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DecodeFixed64 consumes a 64-bit little-endian integer from the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) DecodeFixed64() (uint64, error) {
 | 
					 | 
				
			||||||
	v, n := protowire.ConsumeFixed64(b.buf[b.idx:])
 | 
					 | 
				
			||||||
	if n < 0 {
 | 
					 | 
				
			||||||
		return 0, protowire.ParseError(n)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	b.idx += n
 | 
					 | 
				
			||||||
	return uint64(v), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DecodeRawBytes consumes a length-prefixed raw bytes from the buffer.
 | 
					 | 
				
			||||||
// If alloc is specified, it returns a copy the raw bytes
 | 
					 | 
				
			||||||
// rather than a sub-slice of the buffer.
 | 
					 | 
				
			||||||
func (b *Buffer) DecodeRawBytes(alloc bool) ([]byte, error) {
 | 
					 | 
				
			||||||
	v, n := protowire.ConsumeBytes(b.buf[b.idx:])
 | 
					 | 
				
			||||||
	if n < 0 {
 | 
					 | 
				
			||||||
		return nil, protowire.ParseError(n)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	b.idx += n
 | 
					 | 
				
			||||||
	if alloc {
 | 
					 | 
				
			||||||
		v = append([]byte(nil), v...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return v, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DecodeStringBytes consumes a length-prefixed raw bytes from the buffer.
 | 
					 | 
				
			||||||
// It does not validate whether the raw bytes contain valid UTF-8.
 | 
					 | 
				
			||||||
func (b *Buffer) DecodeStringBytes() (string, error) {
 | 
					 | 
				
			||||||
	v, n := protowire.ConsumeString(b.buf[b.idx:])
 | 
					 | 
				
			||||||
	if n < 0 {
 | 
					 | 
				
			||||||
		return "", protowire.ParseError(n)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	b.idx += n
 | 
					 | 
				
			||||||
	return v, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DecodeMessage consumes a length-prefixed message from the buffer.
 | 
					 | 
				
			||||||
// It does not reset m before unmarshaling.
 | 
					 | 
				
			||||||
func (b *Buffer) DecodeMessage(m Message) error {
 | 
					 | 
				
			||||||
	v, err := b.DecodeRawBytes(false)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return UnmarshalMerge(v, m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// DecodeGroup consumes a message group from the buffer.
 | 
					 | 
				
			||||||
// It assumes that the start group marker has already been consumed and
 | 
					 | 
				
			||||||
// consumes all bytes until (and including the end group marker).
 | 
					 | 
				
			||||||
// It does not reset m before unmarshaling.
 | 
					 | 
				
			||||||
func (b *Buffer) DecodeGroup(m Message) error {
 | 
					 | 
				
			||||||
	v, n, err := consumeGroup(b.buf[b.idx:])
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	b.idx += n
 | 
					 | 
				
			||||||
	return UnmarshalMerge(v, m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// consumeGroup parses b until it finds an end group marker, returning
 | 
					 | 
				
			||||||
// the raw bytes of the message (excluding the end group marker) and the
 | 
					 | 
				
			||||||
// the total length of the message (including the end group marker).
 | 
					 | 
				
			||||||
func consumeGroup(b []byte) ([]byte, int, error) {
 | 
					 | 
				
			||||||
	b0 := b
 | 
					 | 
				
			||||||
	depth := 1 // assume this follows a start group marker
 | 
					 | 
				
			||||||
	for {
 | 
					 | 
				
			||||||
		_, wtyp, tagLen := protowire.ConsumeTag(b)
 | 
					 | 
				
			||||||
		if tagLen < 0 {
 | 
					 | 
				
			||||||
			return nil, 0, protowire.ParseError(tagLen)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		b = b[tagLen:]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		var valLen int
 | 
					 | 
				
			||||||
		switch wtyp {
 | 
					 | 
				
			||||||
		case protowire.VarintType:
 | 
					 | 
				
			||||||
			_, valLen = protowire.ConsumeVarint(b)
 | 
					 | 
				
			||||||
		case protowire.Fixed32Type:
 | 
					 | 
				
			||||||
			_, valLen = protowire.ConsumeFixed32(b)
 | 
					 | 
				
			||||||
		case protowire.Fixed64Type:
 | 
					 | 
				
			||||||
			_, valLen = protowire.ConsumeFixed64(b)
 | 
					 | 
				
			||||||
		case protowire.BytesType:
 | 
					 | 
				
			||||||
			_, valLen = protowire.ConsumeBytes(b)
 | 
					 | 
				
			||||||
		case protowire.StartGroupType:
 | 
					 | 
				
			||||||
			depth++
 | 
					 | 
				
			||||||
		case protowire.EndGroupType:
 | 
					 | 
				
			||||||
			depth--
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			return nil, 0, errors.New("proto: cannot parse reserved wire type")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if valLen < 0 {
 | 
					 | 
				
			||||||
			return nil, 0, protowire.ParseError(valLen)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		b = b[valLen:]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if depth == 0 {
 | 
					 | 
				
			||||||
			return b0[:len(b0)-len(b)-tagLen], len(b0) - len(b), nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										63
									
								
								vendor/github.com/golang/protobuf/proto/defaults.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/golang/protobuf/proto/defaults.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,63 +0,0 @@
 | 
				
			|||||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SetDefaults sets unpopulated scalar fields to their default values.
 | 
					 | 
				
			||||||
// Fields within a oneof are not set even if they have a default value.
 | 
					 | 
				
			||||||
// SetDefaults is recursively called upon any populated message fields.
 | 
					 | 
				
			||||||
func SetDefaults(m Message) {
 | 
					 | 
				
			||||||
	if m != nil {
 | 
					 | 
				
			||||||
		setDefaults(MessageReflect(m))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func setDefaults(m protoreflect.Message) {
 | 
					 | 
				
			||||||
	fds := m.Descriptor().Fields()
 | 
					 | 
				
			||||||
	for i := 0; i < fds.Len(); i++ {
 | 
					 | 
				
			||||||
		fd := fds.Get(i)
 | 
					 | 
				
			||||||
		if !m.Has(fd) {
 | 
					 | 
				
			||||||
			if fd.HasDefault() && fd.ContainingOneof() == nil {
 | 
					 | 
				
			||||||
				v := fd.Default()
 | 
					 | 
				
			||||||
				if fd.Kind() == protoreflect.BytesKind {
 | 
					 | 
				
			||||||
					v = protoreflect.ValueOf(append([]byte(nil), v.Bytes()...)) // copy the default bytes
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				m.Set(fd, v)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {
 | 
					 | 
				
			||||||
		switch {
 | 
					 | 
				
			||||||
		// Handle singular message.
 | 
					 | 
				
			||||||
		case fd.Cardinality() != protoreflect.Repeated:
 | 
					 | 
				
			||||||
			if fd.Message() != nil {
 | 
					 | 
				
			||||||
				setDefaults(m.Get(fd).Message())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		// Handle list of messages.
 | 
					 | 
				
			||||||
		case fd.IsList():
 | 
					 | 
				
			||||||
			if fd.Message() != nil {
 | 
					 | 
				
			||||||
				ls := m.Get(fd).List()
 | 
					 | 
				
			||||||
				for i := 0; i < ls.Len(); i++ {
 | 
					 | 
				
			||||||
					setDefaults(ls.Get(i).Message())
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		// Handle map of messages.
 | 
					 | 
				
			||||||
		case fd.IsMap():
 | 
					 | 
				
			||||||
			if fd.MapValue().Message() != nil {
 | 
					 | 
				
			||||||
				ms := m.Get(fd).Map()
 | 
					 | 
				
			||||||
				ms.Range(func(_ protoreflect.MapKey, v protoreflect.Value) bool {
 | 
					 | 
				
			||||||
					setDefaults(v.Message())
 | 
					 | 
				
			||||||
					return true
 | 
					 | 
				
			||||||
				})
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										113
									
								
								vendor/github.com/golang/protobuf/proto/deprecated.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										113
									
								
								vendor/github.com/golang/protobuf/proto/deprecated.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,113 +0,0 @@
 | 
				
			|||||||
// Copyright 2018 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"strconv"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	protoV2 "google.golang.org/protobuf/proto"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	// Deprecated: No longer returned.
 | 
					 | 
				
			||||||
	ErrNil = errors.New("proto: Marshal called with nil")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Deprecated: No longer returned.
 | 
					 | 
				
			||||||
	ErrTooLarge = errors.New("proto: message encodes to over 2 GB")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Deprecated: No longer returned.
 | 
					 | 
				
			||||||
	ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof")
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
type Stats struct{ Emalloc, Dmalloc, Encode, Decode, Chit, Cmiss, Size uint64 }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
func GetStats() Stats { return Stats{} }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
func MarshalMessageSet(interface{}) ([]byte, error) {
 | 
					 | 
				
			||||||
	return nil, errors.New("proto: not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
func UnmarshalMessageSet([]byte, interface{}) error {
 | 
					 | 
				
			||||||
	return errors.New("proto: not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
func MarshalMessageSetJSON(interface{}) ([]byte, error) {
 | 
					 | 
				
			||||||
	return nil, errors.New("proto: not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
func UnmarshalMessageSetJSON([]byte, interface{}) error {
 | 
					 | 
				
			||||||
	return errors.New("proto: not implemented")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
func RegisterMessageSetType(Message, int32, string) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
func EnumName(m map[int32]string, v int32) string {
 | 
					 | 
				
			||||||
	s, ok := m[v]
 | 
					 | 
				
			||||||
	if ok {
 | 
					 | 
				
			||||||
		return s
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return strconv.Itoa(int(v))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
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
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use; this type existed for intenal-use only.
 | 
					 | 
				
			||||||
type InternalMessageInfo struct{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use; this method existed for intenal-use only.
 | 
					 | 
				
			||||||
func (*InternalMessageInfo) DiscardUnknown(m Message) {
 | 
					 | 
				
			||||||
	DiscardUnknown(m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use; this method existed for intenal-use only.
 | 
					 | 
				
			||||||
func (*InternalMessageInfo) Marshal(b []byte, m Message, deterministic bool) ([]byte, error) {
 | 
					 | 
				
			||||||
	return protoV2.MarshalOptions{Deterministic: deterministic}.MarshalAppend(b, MessageV2(m))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use; this method existed for intenal-use only.
 | 
					 | 
				
			||||||
func (*InternalMessageInfo) Merge(dst, src Message) {
 | 
					 | 
				
			||||||
	protoV2.Merge(MessageV2(dst), MessageV2(src))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use; this method existed for intenal-use only.
 | 
					 | 
				
			||||||
func (*InternalMessageInfo) Size(m Message) int {
 | 
					 | 
				
			||||||
	return protoV2.Size(MessageV2(m))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Deprecated: Do not use; this method existed for intenal-use only.
 | 
					 | 
				
			||||||
func (*InternalMessageInfo) Unmarshal(m Message, b []byte) error {
 | 
					 | 
				
			||||||
	return protoV2.UnmarshalOptions{Merge: true}.Unmarshal(b, MessageV2(m))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										58
									
								
								vendor/github.com/golang/protobuf/proto/discard.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										58
									
								
								vendor/github.com/golang/protobuf/proto/discard.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,58 +0,0 @@
 | 
				
			|||||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 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.
 | 
					 | 
				
			||||||
func DiscardUnknown(m Message) {
 | 
					 | 
				
			||||||
	if m != nil {
 | 
					 | 
				
			||||||
		discardUnknown(MessageReflect(m))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func discardUnknown(m protoreflect.Message) {
 | 
					 | 
				
			||||||
	m.Range(func(fd protoreflect.FieldDescriptor, val protoreflect.Value) bool {
 | 
					 | 
				
			||||||
		switch {
 | 
					 | 
				
			||||||
		// Handle singular message.
 | 
					 | 
				
			||||||
		case fd.Cardinality() != protoreflect.Repeated:
 | 
					 | 
				
			||||||
			if fd.Message() != nil {
 | 
					 | 
				
			||||||
				discardUnknown(m.Get(fd).Message())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		// Handle list of messages.
 | 
					 | 
				
			||||||
		case fd.IsList():
 | 
					 | 
				
			||||||
			if fd.Message() != nil {
 | 
					 | 
				
			||||||
				ls := m.Get(fd).List()
 | 
					 | 
				
			||||||
				for i := 0; i < ls.Len(); i++ {
 | 
					 | 
				
			||||||
					discardUnknown(ls.Get(i).Message())
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		// Handle map of messages.
 | 
					 | 
				
			||||||
		case fd.IsMap():
 | 
					 | 
				
			||||||
			if fd.MapValue().Message() != nil {
 | 
					 | 
				
			||||||
				ms := m.Get(fd).Map()
 | 
					 | 
				
			||||||
				ms.Range(func(_ protoreflect.MapKey, v protoreflect.Value) bool {
 | 
					 | 
				
			||||||
					discardUnknown(v.Message())
 | 
					 | 
				
			||||||
					return true
 | 
					 | 
				
			||||||
				})
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Discard unknown fields.
 | 
					 | 
				
			||||||
	if len(m.GetUnknown()) > 0 {
 | 
					 | 
				
			||||||
		m.SetUnknown(nil)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										356
									
								
								vendor/github.com/golang/protobuf/proto/extensions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										356
									
								
								vendor/github.com/golang/protobuf/proto/extensions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,356 +0,0 @@
 | 
				
			|||||||
// Copyright 2010 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reflect"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/encoding/protowire"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/proto"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoregistry"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/runtime/protoiface"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/runtime/protoimpl"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type (
 | 
					 | 
				
			||||||
	// ExtensionDesc represents an extension descriptor and
 | 
					 | 
				
			||||||
	// is used to interact with an extension field in a message.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// Variables of this type are generated in code by protoc-gen-go.
 | 
					 | 
				
			||||||
	ExtensionDesc = protoimpl.ExtensionInfo
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// ExtensionRange represents a range of message extensions.
 | 
					 | 
				
			||||||
	// Used in code generated by protoc-gen-go.
 | 
					 | 
				
			||||||
	ExtensionRange = protoiface.ExtensionRangeV1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Deprecated: Do not use; this is an internal type.
 | 
					 | 
				
			||||||
	Extension = protoimpl.ExtensionFieldV1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Deprecated: Do not use; this is an internal type.
 | 
					 | 
				
			||||||
	XXX_InternalExtensions = protoimpl.ExtensionFields
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ErrMissingExtension reports whether the extension was not present.
 | 
					 | 
				
			||||||
var ErrMissingExtension = errors.New("proto: missing extension")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var errNotExtendable = errors.New("proto: not an extendable proto.Message")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// HasExtension reports whether the extension field is present in m
 | 
					 | 
				
			||||||
// either as an explicitly populated field or as an unknown field.
 | 
					 | 
				
			||||||
func HasExtension(m Message, xt *ExtensionDesc) (has bool) {
 | 
					 | 
				
			||||||
	mr := MessageReflect(m)
 | 
					 | 
				
			||||||
	if mr == nil || !mr.IsValid() {
 | 
					 | 
				
			||||||
		return false
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Check whether any populated known field matches the field number.
 | 
					 | 
				
			||||||
	xtd := xt.TypeDescriptor()
 | 
					 | 
				
			||||||
	if isValidExtension(mr.Descriptor(), xtd) {
 | 
					 | 
				
			||||||
		has = mr.Has(xtd)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool {
 | 
					 | 
				
			||||||
			has = int32(fd.Number()) == xt.Field
 | 
					 | 
				
			||||||
			return !has
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Check whether any unknown field matches the field number.
 | 
					 | 
				
			||||||
	for b := mr.GetUnknown(); !has && len(b) > 0; {
 | 
					 | 
				
			||||||
		num, _, n := protowire.ConsumeField(b)
 | 
					 | 
				
			||||||
		has = int32(num) == xt.Field
 | 
					 | 
				
			||||||
		b = b[n:]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return has
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ClearExtension removes the extension field from m
 | 
					 | 
				
			||||||
// either as an explicitly populated field or as an unknown field.
 | 
					 | 
				
			||||||
func ClearExtension(m Message, xt *ExtensionDesc) {
 | 
					 | 
				
			||||||
	mr := MessageReflect(m)
 | 
					 | 
				
			||||||
	if mr == nil || !mr.IsValid() {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	xtd := xt.TypeDescriptor()
 | 
					 | 
				
			||||||
	if isValidExtension(mr.Descriptor(), xtd) {
 | 
					 | 
				
			||||||
		mr.Clear(xtd)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool {
 | 
					 | 
				
			||||||
			if int32(fd.Number()) == xt.Field {
 | 
					 | 
				
			||||||
				mr.Clear(fd)
 | 
					 | 
				
			||||||
				return false
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return true
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	clearUnknown(mr, fieldNum(xt.Field))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ClearAllExtensions clears all extensions from m.
 | 
					 | 
				
			||||||
// This includes populated fields and unknown fields in the extension range.
 | 
					 | 
				
			||||||
func ClearAllExtensions(m Message) {
 | 
					 | 
				
			||||||
	mr := MessageReflect(m)
 | 
					 | 
				
			||||||
	if mr == nil || !mr.IsValid() {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mr.Range(func(fd protoreflect.FieldDescriptor, _ protoreflect.Value) bool {
 | 
					 | 
				
			||||||
		if fd.IsExtension() {
 | 
					 | 
				
			||||||
			mr.Clear(fd)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	clearUnknown(mr, mr.Descriptor().ExtensionRanges())
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GetExtension retrieves a proto2 extended field from m.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// 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 type incomplete (i.e., ExtensionDesc.ExtensionType is nil),
 | 
					 | 
				
			||||||
// then GetExtension returns the raw encoded bytes for the extension field.
 | 
					 | 
				
			||||||
func GetExtension(m Message, xt *ExtensionDesc) (interface{}, error) {
 | 
					 | 
				
			||||||
	mr := MessageReflect(m)
 | 
					 | 
				
			||||||
	if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 {
 | 
					 | 
				
			||||||
		return nil, errNotExtendable
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Retrieve the unknown fields for this extension field.
 | 
					 | 
				
			||||||
	var bo protoreflect.RawFields
 | 
					 | 
				
			||||||
	for bi := mr.GetUnknown(); len(bi) > 0; {
 | 
					 | 
				
			||||||
		num, _, n := protowire.ConsumeField(bi)
 | 
					 | 
				
			||||||
		if int32(num) == xt.Field {
 | 
					 | 
				
			||||||
			bo = append(bo, bi[:n]...)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		bi = bi[n:]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// For type incomplete descriptors, only retrieve the unknown fields.
 | 
					 | 
				
			||||||
	if xt.ExtensionType == nil {
 | 
					 | 
				
			||||||
		return []byte(bo), nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// If the extension field only exists as unknown fields, unmarshal it.
 | 
					 | 
				
			||||||
	// This is rarely done since proto.Unmarshal eagerly unmarshals extensions.
 | 
					 | 
				
			||||||
	xtd := xt.TypeDescriptor()
 | 
					 | 
				
			||||||
	if !isValidExtension(mr.Descriptor(), xtd) {
 | 
					 | 
				
			||||||
		return nil, fmt.Errorf("proto: bad extended type; %T does not extend %T", xt.ExtendedType, m)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if !mr.Has(xtd) && len(bo) > 0 {
 | 
					 | 
				
			||||||
		m2 := mr.New()
 | 
					 | 
				
			||||||
		if err := (proto.UnmarshalOptions{
 | 
					 | 
				
			||||||
			Resolver: extensionResolver{xt},
 | 
					 | 
				
			||||||
		}.Unmarshal(bo, m2.Interface())); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if m2.Has(xtd) {
 | 
					 | 
				
			||||||
			mr.Set(xtd, m2.Get(xtd))
 | 
					 | 
				
			||||||
			clearUnknown(mr, fieldNum(xt.Field))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Check whether the message has the extension field set or a default.
 | 
					 | 
				
			||||||
	var pv protoreflect.Value
 | 
					 | 
				
			||||||
	switch {
 | 
					 | 
				
			||||||
	case mr.Has(xtd):
 | 
					 | 
				
			||||||
		pv = mr.Get(xtd)
 | 
					 | 
				
			||||||
	case xtd.HasDefault():
 | 
					 | 
				
			||||||
		pv = xtd.Default()
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return nil, ErrMissingExtension
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	v := xt.InterfaceOf(pv)
 | 
					 | 
				
			||||||
	rv := reflect.ValueOf(v)
 | 
					 | 
				
			||||||
	if isScalarKind(rv.Kind()) {
 | 
					 | 
				
			||||||
		rv2 := reflect.New(rv.Type())
 | 
					 | 
				
			||||||
		rv2.Elem().Set(rv)
 | 
					 | 
				
			||||||
		v = rv2.Interface()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return v, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// extensionResolver is a custom extension resolver that stores a single
 | 
					 | 
				
			||||||
// extension type that takes precedence over the global registry.
 | 
					 | 
				
			||||||
type extensionResolver struct{ xt protoreflect.ExtensionType }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r extensionResolver) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) {
 | 
					 | 
				
			||||||
	if xtd := r.xt.TypeDescriptor(); xtd.FullName() == field {
 | 
					 | 
				
			||||||
		return r.xt, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return protoregistry.GlobalTypes.FindExtensionByName(field)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r extensionResolver) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) {
 | 
					 | 
				
			||||||
	if xtd := r.xt.TypeDescriptor(); xtd.ContainingMessage().FullName() == message && xtd.Number() == field {
 | 
					 | 
				
			||||||
		return r.xt, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return protoregistry.GlobalTypes.FindExtensionByNumber(message, field)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GetExtensions returns a list of the extensions values present in m,
 | 
					 | 
				
			||||||
// corresponding with the provided list of extension descriptors, xts.
 | 
					 | 
				
			||||||
// If an extension is missing in m, the corresponding value is nil.
 | 
					 | 
				
			||||||
func GetExtensions(m Message, xts []*ExtensionDesc) ([]interface{}, error) {
 | 
					 | 
				
			||||||
	mr := MessageReflect(m)
 | 
					 | 
				
			||||||
	if mr == nil || !mr.IsValid() {
 | 
					 | 
				
			||||||
		return nil, errNotExtendable
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	vs := make([]interface{}, len(xts))
 | 
					 | 
				
			||||||
	for i, xt := range xts {
 | 
					 | 
				
			||||||
		v, err := GetExtension(m, xt)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			if err == ErrMissingExtension {
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return vs, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		vs[i] = v
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return vs, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SetExtension sets an extension field in m to the provided value.
 | 
					 | 
				
			||||||
func SetExtension(m Message, xt *ExtensionDesc, v interface{}) error {
 | 
					 | 
				
			||||||
	mr := MessageReflect(m)
 | 
					 | 
				
			||||||
	if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 {
 | 
					 | 
				
			||||||
		return errNotExtendable
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	rv := reflect.ValueOf(v)
 | 
					 | 
				
			||||||
	if reflect.TypeOf(v) != reflect.TypeOf(xt.ExtensionType) {
 | 
					 | 
				
			||||||
		return fmt.Errorf("proto: bad extension value type. got: %T, want: %T", v, xt.ExtensionType)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if rv.Kind() == reflect.Ptr {
 | 
					 | 
				
			||||||
		if rv.IsNil() {
 | 
					 | 
				
			||||||
			return fmt.Errorf("proto: SetExtension called with nil value of type %T", v)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if isScalarKind(rv.Elem().Kind()) {
 | 
					 | 
				
			||||||
			v = rv.Elem().Interface()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	xtd := xt.TypeDescriptor()
 | 
					 | 
				
			||||||
	if !isValidExtension(mr.Descriptor(), xtd) {
 | 
					 | 
				
			||||||
		return fmt.Errorf("proto: bad extended type; %T does not extend %T", xt.ExtendedType, m)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	mr.Set(xtd, xt.ValueOf(v))
 | 
					 | 
				
			||||||
	clearUnknown(mr, fieldNum(xt.Field))
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// SetRawExtension inserts b into the unknown fields of m.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Use Message.ProtoReflect.SetUnknown instead.
 | 
					 | 
				
			||||||
func SetRawExtension(m Message, fnum int32, b []byte) {
 | 
					 | 
				
			||||||
	mr := MessageReflect(m)
 | 
					 | 
				
			||||||
	if mr == nil || !mr.IsValid() {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Verify that the raw field is valid.
 | 
					 | 
				
			||||||
	for b0 := b; len(b0) > 0; {
 | 
					 | 
				
			||||||
		num, _, n := protowire.ConsumeField(b0)
 | 
					 | 
				
			||||||
		if int32(num) != fnum {
 | 
					 | 
				
			||||||
			panic(fmt.Sprintf("mismatching field number: got %d, want %d", num, fnum))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		b0 = b0[n:]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ClearExtension(m, &ExtensionDesc{Field: fnum})
 | 
					 | 
				
			||||||
	mr.SetUnknown(append(mr.GetUnknown(), b...))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ExtensionDescs returns a list of extension descriptors found in m,
 | 
					 | 
				
			||||||
// containing descriptors for both populated extension fields in m and
 | 
					 | 
				
			||||||
// also unknown fields of m that are in the extension range.
 | 
					 | 
				
			||||||
// For the later case, an type incomplete descriptor is provided where only
 | 
					 | 
				
			||||||
// the ExtensionDesc.Field field is populated.
 | 
					 | 
				
			||||||
// The order of the extension descriptors is undefined.
 | 
					 | 
				
			||||||
func ExtensionDescs(m Message) ([]*ExtensionDesc, error) {
 | 
					 | 
				
			||||||
	mr := MessageReflect(m)
 | 
					 | 
				
			||||||
	if mr == nil || !mr.IsValid() || mr.Descriptor().ExtensionRanges().Len() == 0 {
 | 
					 | 
				
			||||||
		return nil, errNotExtendable
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Collect a set of known extension descriptors.
 | 
					 | 
				
			||||||
	extDescs := make(map[protoreflect.FieldNumber]*ExtensionDesc)
 | 
					 | 
				
			||||||
	mr.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {
 | 
					 | 
				
			||||||
		if fd.IsExtension() {
 | 
					 | 
				
			||||||
			xt := fd.(protoreflect.ExtensionTypeDescriptor)
 | 
					 | 
				
			||||||
			if xd, ok := xt.Type().(*ExtensionDesc); ok {
 | 
					 | 
				
			||||||
				extDescs[fd.Number()] = xd
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Collect a set of unknown extension descriptors.
 | 
					 | 
				
			||||||
	extRanges := mr.Descriptor().ExtensionRanges()
 | 
					 | 
				
			||||||
	for b := mr.GetUnknown(); len(b) > 0; {
 | 
					 | 
				
			||||||
		num, _, n := protowire.ConsumeField(b)
 | 
					 | 
				
			||||||
		if extRanges.Has(num) && extDescs[num] == nil {
 | 
					 | 
				
			||||||
			extDescs[num] = nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		b = b[n:]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Transpose the set of descriptors into a list.
 | 
					 | 
				
			||||||
	var xts []*ExtensionDesc
 | 
					 | 
				
			||||||
	for num, xt := range extDescs {
 | 
					 | 
				
			||||||
		if xt == nil {
 | 
					 | 
				
			||||||
			xt = &ExtensionDesc{Field: int32(num)}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		xts = append(xts, xt)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return xts, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// isValidExtension reports whether xtd is a valid extension descriptor for md.
 | 
					 | 
				
			||||||
func isValidExtension(md protoreflect.MessageDescriptor, xtd protoreflect.ExtensionTypeDescriptor) bool {
 | 
					 | 
				
			||||||
	return xtd.ContainingMessage() == md && md.ExtensionRanges().Has(xtd.Number())
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// isScalarKind reports whether k is a protobuf scalar kind (except bytes).
 | 
					 | 
				
			||||||
// This function exists for historical reasons since the representation of
 | 
					 | 
				
			||||||
// scalars differs between v1 and v2, where v1 uses *T and v2 uses T.
 | 
					 | 
				
			||||||
func isScalarKind(k reflect.Kind) bool {
 | 
					 | 
				
			||||||
	switch k {
 | 
					 | 
				
			||||||
	case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String:
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return false
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// clearUnknown removes unknown fields from m where remover.Has reports true.
 | 
					 | 
				
			||||||
func clearUnknown(m protoreflect.Message, remover interface {
 | 
					 | 
				
			||||||
	Has(protoreflect.FieldNumber) bool
 | 
					 | 
				
			||||||
}) {
 | 
					 | 
				
			||||||
	var bo protoreflect.RawFields
 | 
					 | 
				
			||||||
	for bi := m.GetUnknown(); len(bi) > 0; {
 | 
					 | 
				
			||||||
		num, _, n := protowire.ConsumeField(bi)
 | 
					 | 
				
			||||||
		if !remover.Has(num) {
 | 
					 | 
				
			||||||
			bo = append(bo, bi[:n]...)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		bi = bi[n:]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if bi := m.GetUnknown(); len(bi) != len(bo) {
 | 
					 | 
				
			||||||
		m.SetUnknown(bo)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type fieldNum protoreflect.FieldNumber
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (n1 fieldNum) Has(n2 protoreflect.FieldNumber) bool {
 | 
					 | 
				
			||||||
	return protoreflect.FieldNumber(n1) == n2
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										306
									
								
								vendor/github.com/golang/protobuf/proto/properties.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										306
									
								
								vendor/github.com/golang/protobuf/proto/properties.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,306 +0,0 @@
 | 
				
			|||||||
// Copyright 2010 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reflect"
 | 
					 | 
				
			||||||
	"strconv"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
	"sync"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/runtime/protoimpl"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// StructProperties represents protocol buffer type information for a
 | 
					 | 
				
			||||||
// generated protobuf message in the open-struct API.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
type StructProperties struct {
 | 
					 | 
				
			||||||
	// Prop are the properties for each field.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// Fields belonging to a oneof are stored in OneofTypes instead, with a
 | 
					 | 
				
			||||||
	// single Properties representing the parent oneof held here.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// The order of Prop matches the order of fields in the Go struct.
 | 
					 | 
				
			||||||
	// Struct fields that are not related to protobufs have a "XXX_" prefix
 | 
					 | 
				
			||||||
	// in the Properties.Name and must be ignored by the user.
 | 
					 | 
				
			||||||
	Prop []*Properties
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// OneofTypes contains information about the oneof fields in this message.
 | 
					 | 
				
			||||||
	// It is keyed by the protobuf field name.
 | 
					 | 
				
			||||||
	OneofTypes map[string]*OneofProperties
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Properties represents the type information for a protobuf message field.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
type Properties struct {
 | 
					 | 
				
			||||||
	// Name is a placeholder name with little meaningful semantic value.
 | 
					 | 
				
			||||||
	// If the name has an "XXX_" prefix, the entire Properties must be ignored.
 | 
					 | 
				
			||||||
	Name string
 | 
					 | 
				
			||||||
	// OrigName is the protobuf field name or oneof name.
 | 
					 | 
				
			||||||
	OrigName string
 | 
					 | 
				
			||||||
	// JSONName is the JSON name for the protobuf field.
 | 
					 | 
				
			||||||
	JSONName string
 | 
					 | 
				
			||||||
	// Enum is a placeholder name for enums.
 | 
					 | 
				
			||||||
	// For historical reasons, this is neither the Go name for the enum,
 | 
					 | 
				
			||||||
	// nor the protobuf name for the enum.
 | 
					 | 
				
			||||||
	Enum string // Deprecated: Do not use.
 | 
					 | 
				
			||||||
	// Weak contains the full name of the weakly referenced message.
 | 
					 | 
				
			||||||
	Weak string
 | 
					 | 
				
			||||||
	// Wire is a string representation of the wire type.
 | 
					 | 
				
			||||||
	Wire string
 | 
					 | 
				
			||||||
	// WireType is the protobuf wire type for the field.
 | 
					 | 
				
			||||||
	WireType int
 | 
					 | 
				
			||||||
	// Tag is the protobuf field number.
 | 
					 | 
				
			||||||
	Tag int
 | 
					 | 
				
			||||||
	// Required reports whether this is a required field.
 | 
					 | 
				
			||||||
	Required bool
 | 
					 | 
				
			||||||
	// Optional reports whether this is a optional field.
 | 
					 | 
				
			||||||
	Optional bool
 | 
					 | 
				
			||||||
	// Repeated reports whether this is a repeated field.
 | 
					 | 
				
			||||||
	Repeated bool
 | 
					 | 
				
			||||||
	// Packed reports whether this is a packed repeated field of scalars.
 | 
					 | 
				
			||||||
	Packed bool
 | 
					 | 
				
			||||||
	// Proto3 reports whether this field operates under the proto3 syntax.
 | 
					 | 
				
			||||||
	Proto3 bool
 | 
					 | 
				
			||||||
	// Oneof reports whether this field belongs within a oneof.
 | 
					 | 
				
			||||||
	Oneof bool
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Default is the default value in string form.
 | 
					 | 
				
			||||||
	Default string
 | 
					 | 
				
			||||||
	// HasDefault reports whether the field has a default value.
 | 
					 | 
				
			||||||
	HasDefault bool
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// MapKeyProp is the properties for the key field for a map field.
 | 
					 | 
				
			||||||
	MapKeyProp *Properties
 | 
					 | 
				
			||||||
	// MapValProp is the properties for the value field for a map field.
 | 
					 | 
				
			||||||
	MapValProp *Properties
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// OneofProperties represents the type information for a protobuf oneof.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
type OneofProperties struct {
 | 
					 | 
				
			||||||
	// Type is a pointer to the generated wrapper type for the field value.
 | 
					 | 
				
			||||||
	// This is nil for messages that are not in the open-struct API.
 | 
					 | 
				
			||||||
	Type reflect.Type
 | 
					 | 
				
			||||||
	// Field is the index into StructProperties.Prop for the containing oneof.
 | 
					 | 
				
			||||||
	Field int
 | 
					 | 
				
			||||||
	// Prop is the properties for the field.
 | 
					 | 
				
			||||||
	Prop *Properties
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// String formats the properties in the protobuf struct field tag style.
 | 
					 | 
				
			||||||
func (p *Properties) String() string {
 | 
					 | 
				
			||||||
	s := p.Wire
 | 
					 | 
				
			||||||
	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 != "" {
 | 
					 | 
				
			||||||
		s += ",json=" + p.JSONName
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if len(p.Enum) > 0 {
 | 
					 | 
				
			||||||
		s += ",enum=" + p.Enum
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if len(p.Weak) > 0 {
 | 
					 | 
				
			||||||
		s += ",weak=" + p.Weak
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if p.Proto3 {
 | 
					 | 
				
			||||||
		s += ",proto3"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if p.Oneof {
 | 
					 | 
				
			||||||
		s += ",oneof"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	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(tag string) {
 | 
					 | 
				
			||||||
	// For example: "bytes,49,opt,name=foo,def=hello!"
 | 
					 | 
				
			||||||
	for len(tag) > 0 {
 | 
					 | 
				
			||||||
		i := strings.IndexByte(tag, ',')
 | 
					 | 
				
			||||||
		if i < 0 {
 | 
					 | 
				
			||||||
			i = len(tag)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		switch s := tag[:i]; {
 | 
					 | 
				
			||||||
		case strings.HasPrefix(s, "name="):
 | 
					 | 
				
			||||||
			p.OrigName = s[len("name="):]
 | 
					 | 
				
			||||||
		case strings.HasPrefix(s, "json="):
 | 
					 | 
				
			||||||
			p.JSONName = s[len("json="):]
 | 
					 | 
				
			||||||
		case strings.HasPrefix(s, "enum="):
 | 
					 | 
				
			||||||
			p.Enum = s[len("enum="):]
 | 
					 | 
				
			||||||
		case strings.HasPrefix(s, "weak="):
 | 
					 | 
				
			||||||
			p.Weak = s[len("weak="):]
 | 
					 | 
				
			||||||
		case strings.Trim(s, "0123456789") == "":
 | 
					 | 
				
			||||||
			n, _ := strconv.ParseUint(s, 10, 32)
 | 
					 | 
				
			||||||
			p.Tag = int(n)
 | 
					 | 
				
			||||||
		case s == "opt":
 | 
					 | 
				
			||||||
			p.Optional = true
 | 
					 | 
				
			||||||
		case s == "req":
 | 
					 | 
				
			||||||
			p.Required = true
 | 
					 | 
				
			||||||
		case s == "rep":
 | 
					 | 
				
			||||||
			p.Repeated = true
 | 
					 | 
				
			||||||
		case s == "varint" || s == "zigzag32" || s == "zigzag64":
 | 
					 | 
				
			||||||
			p.Wire = s
 | 
					 | 
				
			||||||
			p.WireType = WireVarint
 | 
					 | 
				
			||||||
		case s == "fixed32":
 | 
					 | 
				
			||||||
			p.Wire = s
 | 
					 | 
				
			||||||
			p.WireType = WireFixed32
 | 
					 | 
				
			||||||
		case s == "fixed64":
 | 
					 | 
				
			||||||
			p.Wire = s
 | 
					 | 
				
			||||||
			p.WireType = WireFixed64
 | 
					 | 
				
			||||||
		case s == "bytes":
 | 
					 | 
				
			||||||
			p.Wire = s
 | 
					 | 
				
			||||||
			p.WireType = WireBytes
 | 
					 | 
				
			||||||
		case s == "group":
 | 
					 | 
				
			||||||
			p.Wire = s
 | 
					 | 
				
			||||||
			p.WireType = WireStartGroup
 | 
					 | 
				
			||||||
		case s == "packed":
 | 
					 | 
				
			||||||
			p.Packed = true
 | 
					 | 
				
			||||||
		case s == "proto3":
 | 
					 | 
				
			||||||
			p.Proto3 = true
 | 
					 | 
				
			||||||
		case s == "oneof":
 | 
					 | 
				
			||||||
			p.Oneof = true
 | 
					 | 
				
			||||||
		case strings.HasPrefix(s, "def="):
 | 
					 | 
				
			||||||
			// The default tag is special in that everything afterwards is the
 | 
					 | 
				
			||||||
			// default regardless of the presence of commas.
 | 
					 | 
				
			||||||
			p.HasDefault = true
 | 
					 | 
				
			||||||
			p.Default, i = tag[len("def="):], len(tag)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		tag = strings.TrimPrefix(tag[i:], ",")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Init populates the properties from a protocol buffer struct tag.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) {
 | 
					 | 
				
			||||||
	p.Name = name
 | 
					 | 
				
			||||||
	p.OrigName = name
 | 
					 | 
				
			||||||
	if tag == "" {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	p.Parse(tag)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if typ != nil && typ.Kind() == reflect.Map {
 | 
					 | 
				
			||||||
		p.MapKeyProp = new(Properties)
 | 
					 | 
				
			||||||
		p.MapKeyProp.Init(nil, "Key", f.Tag.Get("protobuf_key"), nil)
 | 
					 | 
				
			||||||
		p.MapValProp = new(Properties)
 | 
					 | 
				
			||||||
		p.MapValProp.Init(nil, "Value", f.Tag.Get("protobuf_val"), nil)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var propertiesCache sync.Map // map[reflect.Type]*StructProperties
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GetProperties returns the list of properties for the type represented by t,
 | 
					 | 
				
			||||||
// which must be a generated protocol buffer message in the open-struct API,
 | 
					 | 
				
			||||||
// where protobuf message fields are represented by exported Go struct fields.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Use protobuf reflection instead.
 | 
					 | 
				
			||||||
func GetProperties(t reflect.Type) *StructProperties {
 | 
					 | 
				
			||||||
	if p, ok := propertiesCache.Load(t); ok {
 | 
					 | 
				
			||||||
		return p.(*StructProperties)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	p, _ := propertiesCache.LoadOrStore(t, newProperties(t))
 | 
					 | 
				
			||||||
	return p.(*StructProperties)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func newProperties(t reflect.Type) *StructProperties {
 | 
					 | 
				
			||||||
	if t.Kind() != reflect.Struct {
 | 
					 | 
				
			||||||
		panic(fmt.Sprintf("%v is not a generated message in the open-struct API", t))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var hasOneof bool
 | 
					 | 
				
			||||||
	prop := new(StructProperties)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Construct a list of properties for each field in the struct.
 | 
					 | 
				
			||||||
	for i := 0; i < t.NumField(); i++ {
 | 
					 | 
				
			||||||
		p := new(Properties)
 | 
					 | 
				
			||||||
		f := t.Field(i)
 | 
					 | 
				
			||||||
		tagField := f.Tag.Get("protobuf")
 | 
					 | 
				
			||||||
		p.Init(f.Type, f.Name, tagField, &f)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		tagOneof := f.Tag.Get("protobuf_oneof")
 | 
					 | 
				
			||||||
		if tagOneof != "" {
 | 
					 | 
				
			||||||
			hasOneof = true
 | 
					 | 
				
			||||||
			p.OrigName = tagOneof
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Rename unrelated struct fields with the "XXX_" prefix since so much
 | 
					 | 
				
			||||||
		// user code simply checks for this to exclude special fields.
 | 
					 | 
				
			||||||
		if tagField == "" && tagOneof == "" && !strings.HasPrefix(p.Name, "XXX_") {
 | 
					 | 
				
			||||||
			p.Name = "XXX_" + p.Name
 | 
					 | 
				
			||||||
			p.OrigName = "XXX_" + p.OrigName
 | 
					 | 
				
			||||||
		} else if p.Weak != "" {
 | 
					 | 
				
			||||||
			p.Name = p.OrigName // avoid possible "XXX_" prefix on weak field
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		prop.Prop = append(prop.Prop, p)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Construct a mapping of oneof field names to properties.
 | 
					 | 
				
			||||||
	if hasOneof {
 | 
					 | 
				
			||||||
		var oneofWrappers []interface{}
 | 
					 | 
				
			||||||
		if fn, ok := reflect.PtrTo(t).MethodByName("XXX_OneofFuncs"); ok {
 | 
					 | 
				
			||||||
			oneofWrappers = fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[3].Interface().([]interface{})
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if fn, ok := reflect.PtrTo(t).MethodByName("XXX_OneofWrappers"); ok {
 | 
					 | 
				
			||||||
			oneofWrappers = fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[0].Interface().([]interface{})
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(protoreflect.ProtoMessage); ok {
 | 
					 | 
				
			||||||
			if m, ok := m.ProtoReflect().(interface{ ProtoMessageInfo() *protoimpl.MessageInfo }); ok {
 | 
					 | 
				
			||||||
				oneofWrappers = m.ProtoMessageInfo().OneofWrappers
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		prop.OneofTypes = make(map[string]*OneofProperties)
 | 
					 | 
				
			||||||
		for _, wrapper := range oneofWrappers {
 | 
					 | 
				
			||||||
			p := &OneofProperties{
 | 
					 | 
				
			||||||
				Type: reflect.ValueOf(wrapper).Type(), // *T
 | 
					 | 
				
			||||||
				Prop: new(Properties),
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			f := p.Type.Elem().Field(0)
 | 
					 | 
				
			||||||
			p.Prop.Name = f.Name
 | 
					 | 
				
			||||||
			p.Prop.Parse(f.Tag.Get("protobuf"))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Determine the struct field that contains this oneof.
 | 
					 | 
				
			||||||
			// Each wrapper is assignable to exactly one parent field.
 | 
					 | 
				
			||||||
			var foundOneof bool
 | 
					 | 
				
			||||||
			for i := 0; i < t.NumField() && !foundOneof; i++ {
 | 
					 | 
				
			||||||
				if p.Type.AssignableTo(t.Field(i).Type) {
 | 
					 | 
				
			||||||
					p.Field = i
 | 
					 | 
				
			||||||
					foundOneof = true
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if !foundOneof {
 | 
					 | 
				
			||||||
				panic(fmt.Sprintf("%v is not a generated message in the open-struct API", t))
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			prop.OneofTypes[p.Prop.OrigName] = p
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return prop
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (sp *StructProperties) Len() int           { return len(sp.Prop) }
 | 
					 | 
				
			||||||
func (sp *StructProperties) Less(i, j int) bool { return false }
 | 
					 | 
				
			||||||
func (sp *StructProperties) Swap(i, j int)      { return }
 | 
					 | 
				
			||||||
							
								
								
									
										167
									
								
								vendor/github.com/golang/protobuf/proto/proto.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										167
									
								
								vendor/github.com/golang/protobuf/proto/proto.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,167 +0,0 @@
 | 
				
			|||||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Package proto provides functionality for handling protocol buffer messages.
 | 
					 | 
				
			||||||
// In particular, it provides marshaling and unmarshaling between a protobuf
 | 
					 | 
				
			||||||
// message and the binary wire format.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// See https://developers.google.com/protocol-buffers/docs/gotutorial for
 | 
					 | 
				
			||||||
// more information.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Use the "google.golang.org/protobuf/proto" package instead.
 | 
					 | 
				
			||||||
package proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	protoV2 "google.golang.org/protobuf/proto"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/runtime/protoiface"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/runtime/protoimpl"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	ProtoPackageIsVersion1 = true
 | 
					 | 
				
			||||||
	ProtoPackageIsVersion2 = true
 | 
					 | 
				
			||||||
	ProtoPackageIsVersion3 = true
 | 
					 | 
				
			||||||
	ProtoPackageIsVersion4 = true
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GeneratedEnum is any enum type generated by protoc-gen-go
 | 
					 | 
				
			||||||
// which is a named int32 kind.
 | 
					 | 
				
			||||||
// This type exists for documentation purposes.
 | 
					 | 
				
			||||||
type GeneratedEnum interface{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// GeneratedMessage is any message type generated by protoc-gen-go
 | 
					 | 
				
			||||||
// which is a pointer to a named struct kind.
 | 
					 | 
				
			||||||
// This type exists for documentation purposes.
 | 
					 | 
				
			||||||
type GeneratedMessage interface{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Message is a protocol buffer message.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// This is the v1 version of the message interface and is marginally better
 | 
					 | 
				
			||||||
// than an empty interface as it lacks any method to programatically interact
 | 
					 | 
				
			||||||
// with the contents of the message.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// A v2 message is declared in "google.golang.org/protobuf/proto".Message and
 | 
					 | 
				
			||||||
// exposes protobuf reflection as a first-class feature of the interface.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// To convert a v1 message to a v2 message, use the MessageV2 function.
 | 
					 | 
				
			||||||
// To convert a v2 message to a v1 message, use the MessageV1 function.
 | 
					 | 
				
			||||||
type Message = protoiface.MessageV1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// MessageV1 converts either a v1 or v2 message to a v1 message.
 | 
					 | 
				
			||||||
// It returns nil if m is nil.
 | 
					 | 
				
			||||||
func MessageV1(m GeneratedMessage) protoiface.MessageV1 {
 | 
					 | 
				
			||||||
	return protoimpl.X.ProtoMessageV1Of(m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// MessageV2 converts either a v1 or v2 message to a v2 message.
 | 
					 | 
				
			||||||
// It returns nil if m is nil.
 | 
					 | 
				
			||||||
func MessageV2(m GeneratedMessage) protoV2.Message {
 | 
					 | 
				
			||||||
	return protoimpl.X.ProtoMessageV2Of(m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// MessageReflect returns a reflective view for a message.
 | 
					 | 
				
			||||||
// It returns nil if m is nil.
 | 
					 | 
				
			||||||
func MessageReflect(m Message) protoreflect.Message {
 | 
					 | 
				
			||||||
	return protoimpl.X.MessageOf(m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Marshaler is implemented by messages that can marshal themselves.
 | 
					 | 
				
			||||||
// This interface is used by the following functions: Size, Marshal,
 | 
					 | 
				
			||||||
// Buffer.Marshal, and Buffer.EncodeMessage.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Do not implement.
 | 
					 | 
				
			||||||
type Marshaler interface {
 | 
					 | 
				
			||||||
	// Marshal formats the encoded bytes of the message.
 | 
					 | 
				
			||||||
	// It should be deterministic and emit valid protobuf wire data.
 | 
					 | 
				
			||||||
	// The caller takes ownership of the returned buffer.
 | 
					 | 
				
			||||||
	Marshal() ([]byte, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Unmarshaler is implemented by messages that can unmarshal themselves.
 | 
					 | 
				
			||||||
// This interface is used by the following functions: Unmarshal, UnmarshalMerge,
 | 
					 | 
				
			||||||
// Buffer.Unmarshal, Buffer.DecodeMessage, and Buffer.DecodeGroup.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Do not implement.
 | 
					 | 
				
			||||||
type Unmarshaler interface {
 | 
					 | 
				
			||||||
	// Unmarshal parses the encoded bytes of the protobuf wire input.
 | 
					 | 
				
			||||||
	// The provided buffer is only valid for during method call.
 | 
					 | 
				
			||||||
	// It should not reset the receiver message.
 | 
					 | 
				
			||||||
	Unmarshal([]byte) error
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Merger is implemented by messages that can merge themselves.
 | 
					 | 
				
			||||||
// This interface is used by the following functions: Clone and Merge.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Do not implement.
 | 
					 | 
				
			||||||
type Merger interface {
 | 
					 | 
				
			||||||
	// Merge merges the contents of src into the receiver message.
 | 
					 | 
				
			||||||
	// It clones all data structures in src such that it aliases no mutable
 | 
					 | 
				
			||||||
	// memory referenced by src.
 | 
					 | 
				
			||||||
	Merge(src Message)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// RequiredNotSetError is an error type returned when
 | 
					 | 
				
			||||||
// marshaling or unmarshaling a message with missing required fields.
 | 
					 | 
				
			||||||
type RequiredNotSetError struct {
 | 
					 | 
				
			||||||
	err error
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (e *RequiredNotSetError) Error() string {
 | 
					 | 
				
			||||||
	if e.err != nil {
 | 
					 | 
				
			||||||
		return e.err.Error()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return "proto: required field not set"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (e *RequiredNotSetError) RequiredNotSet() bool {
 | 
					 | 
				
			||||||
	return true
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func checkRequiredNotSet(m protoV2.Message) error {
 | 
					 | 
				
			||||||
	if err := protoV2.CheckInitialized(m); err != nil {
 | 
					 | 
				
			||||||
		return &RequiredNotSetError{err: err}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Clone returns a deep copy of src.
 | 
					 | 
				
			||||||
func Clone(src Message) Message {
 | 
					 | 
				
			||||||
	return MessageV1(protoV2.Clone(MessageV2(src)))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Merge merges src into dst, which must be messages of the same type.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Populated scalar fields in src are copied to dst, while populated
 | 
					 | 
				
			||||||
// singular messages in src are merged into dst by recursively calling Merge.
 | 
					 | 
				
			||||||
// The elements of every list field in src is appended to the corresponded
 | 
					 | 
				
			||||||
// list fields in dst. The entries of every map field in src is copied into
 | 
					 | 
				
			||||||
// the corresponding map field in dst, possibly replacing existing entries.
 | 
					 | 
				
			||||||
// The unknown fields of src are appended to the unknown fields of dst.
 | 
					 | 
				
			||||||
func Merge(dst, src Message) {
 | 
					 | 
				
			||||||
	protoV2.Merge(MessageV2(dst), MessageV2(src))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Equal reports whether two messages are equal.
 | 
					 | 
				
			||||||
// If two messages marshal to the same bytes under deterministic serialization,
 | 
					 | 
				
			||||||
// then Equal is guaranteed to report true.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Two messages are equal if they are the same protobuf message type,
 | 
					 | 
				
			||||||
// have the same set of populated known and extension field values,
 | 
					 | 
				
			||||||
// and the same set of unknown fields values.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Scalar values are compared with the equivalent of the == operator in Go,
 | 
					 | 
				
			||||||
// except bytes values which are compared using bytes.Equal and
 | 
					 | 
				
			||||||
// floating point values which specially treat NaNs as equal.
 | 
					 | 
				
			||||||
// Message values are compared by recursively calling Equal.
 | 
					 | 
				
			||||||
// Lists are equal if each element value is also equal.
 | 
					 | 
				
			||||||
// Maps are equal if they have the same set of keys, where the pair of values
 | 
					 | 
				
			||||||
// for each key is also equal.
 | 
					 | 
				
			||||||
func Equal(x, y Message) bool {
 | 
					 | 
				
			||||||
	return protoV2.Equal(MessageV2(x), MessageV2(y))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func isMessageSet(md protoreflect.MessageDescriptor) bool {
 | 
					 | 
				
			||||||
	ms, ok := md.(interface{ IsMessageSet() bool })
 | 
					 | 
				
			||||||
	return ok && ms.IsMessageSet()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										317
									
								
								vendor/github.com/golang/protobuf/proto/registry.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										317
									
								
								vendor/github.com/golang/protobuf/proto/registry.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,317 +0,0 @@
 | 
				
			|||||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"bytes"
 | 
					 | 
				
			||||||
	"compress/gzip"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"io/ioutil"
 | 
					 | 
				
			||||||
	"reflect"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
	"sync"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protodesc"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoregistry"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/runtime/protoimpl"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// filePath is the path to the proto source file.
 | 
					 | 
				
			||||||
type filePath = string // e.g., "google/protobuf/descriptor.proto"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// fileDescGZIP is the compressed contents of the encoded FileDescriptorProto.
 | 
					 | 
				
			||||||
type fileDescGZIP = []byte
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var fileCache sync.Map // map[filePath]fileDescGZIP
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// RegisterFile is called from generated code to register the compressed
 | 
					 | 
				
			||||||
// FileDescriptorProto with the file path for a proto source file.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Use protoregistry.GlobalFiles.RegisterFile instead.
 | 
					 | 
				
			||||||
func RegisterFile(s filePath, d fileDescGZIP) {
 | 
					 | 
				
			||||||
	// Decompress the descriptor.
 | 
					 | 
				
			||||||
	zr, err := gzip.NewReader(bytes.NewReader(d))
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", err))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	b, err := ioutil.ReadAll(zr)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", err))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Construct a protoreflect.FileDescriptor from the raw descriptor.
 | 
					 | 
				
			||||||
	// Note that DescBuilder.Build automatically registers the constructed
 | 
					 | 
				
			||||||
	// file descriptor with the v2 registry.
 | 
					 | 
				
			||||||
	protoimpl.DescBuilder{RawDescriptor: b}.Build()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Locally cache the raw descriptor form for the file.
 | 
					 | 
				
			||||||
	fileCache.Store(s, d)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// FileDescriptor returns the compressed FileDescriptorProto given the file path
 | 
					 | 
				
			||||||
// for a proto source file. It returns nil if not found.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Use protoregistry.GlobalFiles.FindFileByPath instead.
 | 
					 | 
				
			||||||
func FileDescriptor(s filePath) fileDescGZIP {
 | 
					 | 
				
			||||||
	if v, ok := fileCache.Load(s); ok {
 | 
					 | 
				
			||||||
		return v.(fileDescGZIP)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Find the descriptor in the v2 registry.
 | 
					 | 
				
			||||||
	var b []byte
 | 
					 | 
				
			||||||
	if fd, _ := protoregistry.GlobalFiles.FindFileByPath(s); fd != nil {
 | 
					 | 
				
			||||||
		b, _ = Marshal(protodesc.ToFileDescriptorProto(fd))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Locally cache the raw descriptor form for the file.
 | 
					 | 
				
			||||||
	if len(b) > 0 {
 | 
					 | 
				
			||||||
		v, _ := fileCache.LoadOrStore(s, protoimpl.X.CompressGZIP(b))
 | 
					 | 
				
			||||||
		return v.(fileDescGZIP)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// enumName is the name of an enum. For historical reasons, the enum name is
 | 
					 | 
				
			||||||
// neither the full Go name nor the full protobuf name of the enum.
 | 
					 | 
				
			||||||
// The name is the dot-separated combination of just the proto package that the
 | 
					 | 
				
			||||||
// enum is declared within followed by the Go type name of the generated enum.
 | 
					 | 
				
			||||||
type enumName = string // e.g., "my.proto.package.GoMessage_GoEnum"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// enumsByName maps enum values by name to their numeric counterpart.
 | 
					 | 
				
			||||||
type enumsByName = map[string]int32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// enumsByNumber maps enum values by number to their name counterpart.
 | 
					 | 
				
			||||||
type enumsByNumber = map[int32]string
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var enumCache sync.Map     // map[enumName]enumsByName
 | 
					 | 
				
			||||||
var numFilesCache sync.Map // map[protoreflect.FullName]int
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// RegisterEnum is called from the generated code to register the mapping of
 | 
					 | 
				
			||||||
// enum value names to enum numbers for the enum identified by s.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Use protoregistry.GlobalTypes.RegisterEnum instead.
 | 
					 | 
				
			||||||
func RegisterEnum(s enumName, _ enumsByNumber, m enumsByName) {
 | 
					 | 
				
			||||||
	if _, ok := enumCache.Load(s); ok {
 | 
					 | 
				
			||||||
		panic("proto: duplicate enum registered: " + s)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	enumCache.Store(s, m)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// This does not forward registration to the v2 registry since this API
 | 
					 | 
				
			||||||
	// lacks sufficient information to construct a complete v2 enum descriptor.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// EnumValueMap returns the mapping from enum value names to enum numbers for
 | 
					 | 
				
			||||||
// the enum of the given name. It returns nil if not found.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Use protoregistry.GlobalTypes.FindEnumByName instead.
 | 
					 | 
				
			||||||
func EnumValueMap(s enumName) enumsByName {
 | 
					 | 
				
			||||||
	if v, ok := enumCache.Load(s); ok {
 | 
					 | 
				
			||||||
		return v.(enumsByName)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Check whether the cache is stale. If the number of files in the current
 | 
					 | 
				
			||||||
	// package differs, then it means that some enums may have been recently
 | 
					 | 
				
			||||||
	// registered upstream that we do not know about.
 | 
					 | 
				
			||||||
	var protoPkg protoreflect.FullName
 | 
					 | 
				
			||||||
	if i := strings.LastIndexByte(s, '.'); i >= 0 {
 | 
					 | 
				
			||||||
		protoPkg = protoreflect.FullName(s[:i])
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	v, _ := numFilesCache.Load(protoPkg)
 | 
					 | 
				
			||||||
	numFiles, _ := v.(int)
 | 
					 | 
				
			||||||
	if protoregistry.GlobalFiles.NumFilesByPackage(protoPkg) == numFiles {
 | 
					 | 
				
			||||||
		return nil // cache is up-to-date; was not found earlier
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Update the enum cache for all enums declared in the given proto package.
 | 
					 | 
				
			||||||
	numFiles = 0
 | 
					 | 
				
			||||||
	protoregistry.GlobalFiles.RangeFilesByPackage(protoPkg, func(fd protoreflect.FileDescriptor) bool {
 | 
					 | 
				
			||||||
		walkEnums(fd, func(ed protoreflect.EnumDescriptor) {
 | 
					 | 
				
			||||||
			name := protoimpl.X.LegacyEnumName(ed)
 | 
					 | 
				
			||||||
			if _, ok := enumCache.Load(name); !ok {
 | 
					 | 
				
			||||||
				m := make(enumsByName)
 | 
					 | 
				
			||||||
				evs := ed.Values()
 | 
					 | 
				
			||||||
				for i := evs.Len() - 1; i >= 0; i-- {
 | 
					 | 
				
			||||||
					ev := evs.Get(i)
 | 
					 | 
				
			||||||
					m[string(ev.Name())] = int32(ev.Number())
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				enumCache.LoadOrStore(name, m)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
		numFiles++
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	numFilesCache.Store(protoPkg, numFiles)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Check cache again for enum map.
 | 
					 | 
				
			||||||
	if v, ok := enumCache.Load(s); ok {
 | 
					 | 
				
			||||||
		return v.(enumsByName)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// walkEnums recursively walks all enums declared in d.
 | 
					 | 
				
			||||||
func walkEnums(d interface {
 | 
					 | 
				
			||||||
	Enums() protoreflect.EnumDescriptors
 | 
					 | 
				
			||||||
	Messages() protoreflect.MessageDescriptors
 | 
					 | 
				
			||||||
}, f func(protoreflect.EnumDescriptor)) {
 | 
					 | 
				
			||||||
	eds := d.Enums()
 | 
					 | 
				
			||||||
	for i := eds.Len() - 1; i >= 0; i-- {
 | 
					 | 
				
			||||||
		f(eds.Get(i))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	mds := d.Messages()
 | 
					 | 
				
			||||||
	for i := mds.Len() - 1; i >= 0; i-- {
 | 
					 | 
				
			||||||
		walkEnums(mds.Get(i), f)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// messageName is the full name of protobuf message.
 | 
					 | 
				
			||||||
type messageName = string
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var messageTypeCache sync.Map // map[messageName]reflect.Type
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// RegisterType is called from generated code to register the message Go type
 | 
					 | 
				
			||||||
// for a message of the given name.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Use protoregistry.GlobalTypes.RegisterMessage instead.
 | 
					 | 
				
			||||||
func RegisterType(m Message, s messageName) {
 | 
					 | 
				
			||||||
	mt := protoimpl.X.LegacyMessageTypeOf(m, protoreflect.FullName(s))
 | 
					 | 
				
			||||||
	if err := protoregistry.GlobalTypes.RegisterMessage(mt); err != nil {
 | 
					 | 
				
			||||||
		panic(err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	messageTypeCache.Store(s, reflect.TypeOf(m))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// RegisterMapType is called from generated code to register the Go map type
 | 
					 | 
				
			||||||
// for a protobuf message representing a map entry.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Do not use.
 | 
					 | 
				
			||||||
func RegisterMapType(m interface{}, s messageName) {
 | 
					 | 
				
			||||||
	t := reflect.TypeOf(m)
 | 
					 | 
				
			||||||
	if t.Kind() != reflect.Map {
 | 
					 | 
				
			||||||
		panic(fmt.Sprintf("invalid map kind: %v", t))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if _, ok := messageTypeCache.Load(s); ok {
 | 
					 | 
				
			||||||
		panic(fmt.Errorf("proto: duplicate proto message registered: %s", s))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	messageTypeCache.Store(s, t)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// MessageType returns the message type for a named message.
 | 
					 | 
				
			||||||
// It returns nil if not found.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Use protoregistry.GlobalTypes.FindMessageByName instead.
 | 
					 | 
				
			||||||
func MessageType(s messageName) reflect.Type {
 | 
					 | 
				
			||||||
	if v, ok := messageTypeCache.Load(s); ok {
 | 
					 | 
				
			||||||
		return v.(reflect.Type)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Derive the message type from the v2 registry.
 | 
					 | 
				
			||||||
	var t reflect.Type
 | 
					 | 
				
			||||||
	if mt, _ := protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName(s)); mt != nil {
 | 
					 | 
				
			||||||
		t = messageGoType(mt)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// If we could not get a concrete type, it is possible that it is a
 | 
					 | 
				
			||||||
	// pseudo-message for a map entry.
 | 
					 | 
				
			||||||
	if t == nil {
 | 
					 | 
				
			||||||
		d, _ := protoregistry.GlobalFiles.FindDescriptorByName(protoreflect.FullName(s))
 | 
					 | 
				
			||||||
		if md, _ := d.(protoreflect.MessageDescriptor); md != nil && md.IsMapEntry() {
 | 
					 | 
				
			||||||
			kt := goTypeForField(md.Fields().ByNumber(1))
 | 
					 | 
				
			||||||
			vt := goTypeForField(md.Fields().ByNumber(2))
 | 
					 | 
				
			||||||
			t = reflect.MapOf(kt, vt)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Locally cache the message type for the given name.
 | 
					 | 
				
			||||||
	if t != nil {
 | 
					 | 
				
			||||||
		v, _ := messageTypeCache.LoadOrStore(s, t)
 | 
					 | 
				
			||||||
		return v.(reflect.Type)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func goTypeForField(fd protoreflect.FieldDescriptor) reflect.Type {
 | 
					 | 
				
			||||||
	switch k := fd.Kind(); k {
 | 
					 | 
				
			||||||
	case protoreflect.EnumKind:
 | 
					 | 
				
			||||||
		if et, _ := protoregistry.GlobalTypes.FindEnumByName(fd.Enum().FullName()); et != nil {
 | 
					 | 
				
			||||||
			return enumGoType(et)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return reflect.TypeOf(protoreflect.EnumNumber(0))
 | 
					 | 
				
			||||||
	case protoreflect.MessageKind, protoreflect.GroupKind:
 | 
					 | 
				
			||||||
		if mt, _ := protoregistry.GlobalTypes.FindMessageByName(fd.Message().FullName()); mt != nil {
 | 
					 | 
				
			||||||
			return messageGoType(mt)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return reflect.TypeOf((*protoreflect.Message)(nil)).Elem()
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return reflect.TypeOf(fd.Default().Interface())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func enumGoType(et protoreflect.EnumType) reflect.Type {
 | 
					 | 
				
			||||||
	return reflect.TypeOf(et.New(0))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func messageGoType(mt protoreflect.MessageType) reflect.Type {
 | 
					 | 
				
			||||||
	return reflect.TypeOf(MessageV1(mt.Zero().Interface()))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// MessageName returns the full protobuf name for the given message type.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Use protoreflect.MessageDescriptor.FullName instead.
 | 
					 | 
				
			||||||
func MessageName(m Message) messageName {
 | 
					 | 
				
			||||||
	if m == nil {
 | 
					 | 
				
			||||||
		return ""
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if m, ok := m.(interface{ XXX_MessageName() messageName }); ok {
 | 
					 | 
				
			||||||
		return m.XXX_MessageName()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return messageName(protoimpl.X.MessageDescriptorOf(m).FullName())
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// RegisterExtension is called from the generated code to register
 | 
					 | 
				
			||||||
// the extension descriptor.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Use protoregistry.GlobalTypes.RegisterExtension instead.
 | 
					 | 
				
			||||||
func RegisterExtension(d *ExtensionDesc) {
 | 
					 | 
				
			||||||
	if err := protoregistry.GlobalTypes.RegisterExtension(d); err != nil {
 | 
					 | 
				
			||||||
		panic(err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type extensionsByNumber = map[int32]*ExtensionDesc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var extensionCache sync.Map // map[messageName]extensionsByNumber
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// RegisteredExtensions returns a map of the registered extensions for the
 | 
					 | 
				
			||||||
// provided protobuf message, indexed by the extension field number.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Use protoregistry.GlobalTypes.RangeExtensionsByMessage instead.
 | 
					 | 
				
			||||||
func RegisteredExtensions(m Message) extensionsByNumber {
 | 
					 | 
				
			||||||
	// Check whether the cache is stale. If the number of extensions for
 | 
					 | 
				
			||||||
	// the given message differs, then it means that some extensions were
 | 
					 | 
				
			||||||
	// recently registered upstream that we do not know about.
 | 
					 | 
				
			||||||
	s := MessageName(m)
 | 
					 | 
				
			||||||
	v, _ := extensionCache.Load(s)
 | 
					 | 
				
			||||||
	xs, _ := v.(extensionsByNumber)
 | 
					 | 
				
			||||||
	if protoregistry.GlobalTypes.NumExtensionsByMessage(protoreflect.FullName(s)) == len(xs) {
 | 
					 | 
				
			||||||
		return xs // cache is up-to-date
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Cache is stale, re-compute the extensions map.
 | 
					 | 
				
			||||||
	xs = make(extensionsByNumber)
 | 
					 | 
				
			||||||
	protoregistry.GlobalTypes.RangeExtensionsByMessage(protoreflect.FullName(s), func(xt protoreflect.ExtensionType) bool {
 | 
					 | 
				
			||||||
		if xd, ok := xt.(*ExtensionDesc); ok {
 | 
					 | 
				
			||||||
			xs[int32(xt.TypeDescriptor().Number())] = xd
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			// TODO: This implies that the protoreflect.ExtensionType is a
 | 
					 | 
				
			||||||
			// custom type not generated by protoc-gen-go. We could try and
 | 
					 | 
				
			||||||
			// convert the type to an ExtensionDesc.
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	extensionCache.Store(s, xs)
 | 
					 | 
				
			||||||
	return xs
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										801
									
								
								vendor/github.com/golang/protobuf/proto/text_decode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										801
									
								
								vendor/github.com/golang/protobuf/proto/text_decode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,801 +0,0 @@
 | 
				
			|||||||
// Copyright 2010 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"encoding"
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"reflect"
 | 
					 | 
				
			||||||
	"strconv"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
	"unicode/utf8"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/encoding/prototext"
 | 
					 | 
				
			||||||
	protoV2 "google.golang.org/protobuf/proto"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoregistry"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const wrapTextUnmarshalV2 = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ParseError is returned by UnmarshalText.
 | 
					 | 
				
			||||||
type ParseError struct {
 | 
					 | 
				
			||||||
	Message string
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Deprecated: Do not use.
 | 
					 | 
				
			||||||
	Line, Offset int
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (e *ParseError) Error() string {
 | 
					 | 
				
			||||||
	if wrapTextUnmarshalV2 {
 | 
					 | 
				
			||||||
		return e.Message
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if e.Line == 1 {
 | 
					 | 
				
			||||||
		return fmt.Sprintf("line 1.%d: %v", e.Offset, e.Message)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return fmt.Sprintf("line %d: %v", e.Line, e.Message)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// UnmarshalText parses a proto text formatted string into m.
 | 
					 | 
				
			||||||
func UnmarshalText(s string, m Message) error {
 | 
					 | 
				
			||||||
	if u, ok := m.(encoding.TextUnmarshaler); ok {
 | 
					 | 
				
			||||||
		return u.UnmarshalText([]byte(s))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	m.Reset()
 | 
					 | 
				
			||||||
	mi := MessageV2(m)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if wrapTextUnmarshalV2 {
 | 
					 | 
				
			||||||
		err := prototext.UnmarshalOptions{
 | 
					 | 
				
			||||||
			AllowPartial: true,
 | 
					 | 
				
			||||||
		}.Unmarshal([]byte(s), mi)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return &ParseError{Message: err.Error()}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return checkRequiredNotSet(mi)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		if err := newTextParser(s).unmarshalMessage(mi.ProtoReflect(), ""); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return checkRequiredNotSet(mi)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type textParser struct {
 | 
					 | 
				
			||||||
	s            string // remaining input
 | 
					 | 
				
			||||||
	done         bool   // whether the parsing is finished (success or error)
 | 
					 | 
				
			||||||
	backed       bool   // whether back() was called
 | 
					 | 
				
			||||||
	offset, line int
 | 
					 | 
				
			||||||
	cur          token
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type token struct {
 | 
					 | 
				
			||||||
	value    string
 | 
					 | 
				
			||||||
	err      *ParseError
 | 
					 | 
				
			||||||
	line     int    // line number
 | 
					 | 
				
			||||||
	offset   int    // byte number from start of input, not start of line
 | 
					 | 
				
			||||||
	unquoted string // the unquoted version of value, if it was a quoted string
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func newTextParser(s string) *textParser {
 | 
					 | 
				
			||||||
	p := new(textParser)
 | 
					 | 
				
			||||||
	p.s = s
 | 
					 | 
				
			||||||
	p.line = 1
 | 
					 | 
				
			||||||
	p.cur.line = 1
 | 
					 | 
				
			||||||
	return p
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (p *textParser) unmarshalMessage(m protoreflect.Message, terminator string) (err error) {
 | 
					 | 
				
			||||||
	md := m.Descriptor()
 | 
					 | 
				
			||||||
	fds := md.Fields()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// A struct is a sequence of "name: value", terminated by one of
 | 
					 | 
				
			||||||
	// '>' or '}', or the end of the input.  A name may also be
 | 
					 | 
				
			||||||
	// "[extension]" or "[type/url]".
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// The whole struct can also be an expanded Any message, like:
 | 
					 | 
				
			||||||
	// [type/url] < ... struct contents ... >
 | 
					 | 
				
			||||||
	seen := make(map[protoreflect.FieldNumber]bool)
 | 
					 | 
				
			||||||
	for {
 | 
					 | 
				
			||||||
		tok := p.next()
 | 
					 | 
				
			||||||
		if tok.err != nil {
 | 
					 | 
				
			||||||
			return tok.err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if tok.value == terminator {
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if tok.value == "[" {
 | 
					 | 
				
			||||||
			if err := p.unmarshalExtensionOrAny(m, seen); err != nil {
 | 
					 | 
				
			||||||
				return err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// This is a normal, non-extension field.
 | 
					 | 
				
			||||||
		name := protoreflect.Name(tok.value)
 | 
					 | 
				
			||||||
		fd := fds.ByName(name)
 | 
					 | 
				
			||||||
		switch {
 | 
					 | 
				
			||||||
		case fd == nil:
 | 
					 | 
				
			||||||
			gd := fds.ByName(protoreflect.Name(strings.ToLower(string(name))))
 | 
					 | 
				
			||||||
			if gd != nil && gd.Kind() == protoreflect.GroupKind && gd.Message().Name() == name {
 | 
					 | 
				
			||||||
				fd = gd
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		case fd.Kind() == protoreflect.GroupKind && fd.Message().Name() != name:
 | 
					 | 
				
			||||||
			fd = nil
 | 
					 | 
				
			||||||
		case fd.IsWeak() && fd.Message().IsPlaceholder():
 | 
					 | 
				
			||||||
			fd = nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if fd == nil {
 | 
					 | 
				
			||||||
			typeName := string(md.FullName())
 | 
					 | 
				
			||||||
			if m, ok := m.Interface().(Message); ok {
 | 
					 | 
				
			||||||
				t := reflect.TypeOf(m)
 | 
					 | 
				
			||||||
				if t.Kind() == reflect.Ptr {
 | 
					 | 
				
			||||||
					typeName = t.Elem().String()
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return p.errorf("unknown field name %q in %v", name, typeName)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if od := fd.ContainingOneof(); od != nil && m.WhichOneof(od) != nil {
 | 
					 | 
				
			||||||
			return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, od.Name())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if fd.Cardinality() != protoreflect.Repeated && seen[fd.Number()] {
 | 
					 | 
				
			||||||
			return p.errorf("non-repeated field %q was repeated", fd.Name())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		seen[fd.Number()] = true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Consume any colon.
 | 
					 | 
				
			||||||
		if err := p.checkForColon(fd); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Parse into the field.
 | 
					 | 
				
			||||||
		v := m.Get(fd)
 | 
					 | 
				
			||||||
		if !m.Has(fd) && (fd.IsList() || fd.IsMap() || fd.Message() != nil) {
 | 
					 | 
				
			||||||
			v = m.Mutable(fd)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if v, err = p.unmarshalValue(v, fd); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		m.Set(fd, v)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if err := p.consumeOptionalSeparator(); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (p *textParser) unmarshalExtensionOrAny(m protoreflect.Message, seen map[protoreflect.FieldNumber]bool) error {
 | 
					 | 
				
			||||||
	name, err := p.consumeExtensionOrAnyName()
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// If it contains a slash, it's an Any type URL.
 | 
					 | 
				
			||||||
	if slashIdx := strings.LastIndex(name, "/"); slashIdx >= 0 {
 | 
					 | 
				
			||||||
		tok := p.next()
 | 
					 | 
				
			||||||
		if tok.err != nil {
 | 
					 | 
				
			||||||
			return tok.err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		// consume an optional colon
 | 
					 | 
				
			||||||
		if tok.value == ":" {
 | 
					 | 
				
			||||||
			tok = p.next()
 | 
					 | 
				
			||||||
			if tok.err != nil {
 | 
					 | 
				
			||||||
				return tok.err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		var terminator string
 | 
					 | 
				
			||||||
		switch tok.value {
 | 
					 | 
				
			||||||
		case "<":
 | 
					 | 
				
			||||||
			terminator = ">"
 | 
					 | 
				
			||||||
		case "{":
 | 
					 | 
				
			||||||
			terminator = "}"
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			return p.errorf("expected '{' or '<', found %q", tok.value)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		mt, err := protoregistry.GlobalTypes.FindMessageByURL(name)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return p.errorf("unrecognized message %q in google.protobuf.Any", name[slashIdx+len("/"):])
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		m2 := mt.New()
 | 
					 | 
				
			||||||
		if err := p.unmarshalMessage(m2, terminator); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		b, err := protoV2.Marshal(m2.Interface())
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return p.errorf("failed to marshal message of type %q: %v", name[slashIdx+len("/"):], err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		urlFD := m.Descriptor().Fields().ByName("type_url")
 | 
					 | 
				
			||||||
		valFD := m.Descriptor().Fields().ByName("value")
 | 
					 | 
				
			||||||
		if seen[urlFD.Number()] {
 | 
					 | 
				
			||||||
			return p.errorf("Any message unpacked multiple times, or %q already set", urlFD.Name())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if seen[valFD.Number()] {
 | 
					 | 
				
			||||||
			return p.errorf("Any message unpacked multiple times, or %q already set", valFD.Name())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		m.Set(urlFD, protoreflect.ValueOfString(name))
 | 
					 | 
				
			||||||
		m.Set(valFD, protoreflect.ValueOfBytes(b))
 | 
					 | 
				
			||||||
		seen[urlFD.Number()] = true
 | 
					 | 
				
			||||||
		seen[valFD.Number()] = true
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	xname := protoreflect.FullName(name)
 | 
					 | 
				
			||||||
	xt, _ := protoregistry.GlobalTypes.FindExtensionByName(xname)
 | 
					 | 
				
			||||||
	if xt == nil && isMessageSet(m.Descriptor()) {
 | 
					 | 
				
			||||||
		xt, _ = protoregistry.GlobalTypes.FindExtensionByName(xname.Append("message_set_extension"))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if xt == nil {
 | 
					 | 
				
			||||||
		return p.errorf("unrecognized extension %q", name)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	fd := xt.TypeDescriptor()
 | 
					 | 
				
			||||||
	if fd.ContainingMessage().FullName() != m.Descriptor().FullName() {
 | 
					 | 
				
			||||||
		return p.errorf("extension field %q does not extend message %q", name, m.Descriptor().FullName())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if err := p.checkForColon(fd); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	v := m.Get(fd)
 | 
					 | 
				
			||||||
	if !m.Has(fd) && (fd.IsList() || fd.IsMap() || fd.Message() != nil) {
 | 
					 | 
				
			||||||
		v = m.Mutable(fd)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	v, err = p.unmarshalValue(v, fd)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	m.Set(fd, v)
 | 
					 | 
				
			||||||
	return p.consumeOptionalSeparator()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (p *textParser) unmarshalValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) {
 | 
					 | 
				
			||||||
	tok := p.next()
 | 
					 | 
				
			||||||
	if tok.err != nil {
 | 
					 | 
				
			||||||
		return v, tok.err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if tok.value == "" {
 | 
					 | 
				
			||||||
		return v, p.errorf("unexpected EOF")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	switch {
 | 
					 | 
				
			||||||
	case fd.IsList():
 | 
					 | 
				
			||||||
		lv := v.List()
 | 
					 | 
				
			||||||
		var err error
 | 
					 | 
				
			||||||
		if tok.value == "[" {
 | 
					 | 
				
			||||||
			// Repeated field with list notation, like [1,2,3].
 | 
					 | 
				
			||||||
			for {
 | 
					 | 
				
			||||||
				vv := lv.NewElement()
 | 
					 | 
				
			||||||
				vv, err = p.unmarshalSingularValue(vv, fd)
 | 
					 | 
				
			||||||
				if err != nil {
 | 
					 | 
				
			||||||
					return v, err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				lv.Append(vv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				tok := p.next()
 | 
					 | 
				
			||||||
				if tok.err != nil {
 | 
					 | 
				
			||||||
					return v, tok.err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if tok.value == "]" {
 | 
					 | 
				
			||||||
					break
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if tok.value != "," {
 | 
					 | 
				
			||||||
					return v, p.errorf("Expected ']' or ',' found %q", tok.value)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return v, nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// One value of the repeated field.
 | 
					 | 
				
			||||||
		p.back()
 | 
					 | 
				
			||||||
		vv := lv.NewElement()
 | 
					 | 
				
			||||||
		vv, err = p.unmarshalSingularValue(vv, fd)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return v, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		lv.Append(vv)
 | 
					 | 
				
			||||||
		return v, nil
 | 
					 | 
				
			||||||
	case fd.IsMap():
 | 
					 | 
				
			||||||
		// The map entry should be this sequence of tokens:
 | 
					 | 
				
			||||||
		//	< key : KEY value : VALUE >
 | 
					 | 
				
			||||||
		// However, implementations may omit key or value, and technically
 | 
					 | 
				
			||||||
		// we should support them in any order.
 | 
					 | 
				
			||||||
		var terminator string
 | 
					 | 
				
			||||||
		switch tok.value {
 | 
					 | 
				
			||||||
		case "<":
 | 
					 | 
				
			||||||
			terminator = ">"
 | 
					 | 
				
			||||||
		case "{":
 | 
					 | 
				
			||||||
			terminator = "}"
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			return v, p.errorf("expected '{' or '<', found %q", tok.value)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		keyFD := fd.MapKey()
 | 
					 | 
				
			||||||
		valFD := fd.MapValue()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		mv := v.Map()
 | 
					 | 
				
			||||||
		kv := keyFD.Default()
 | 
					 | 
				
			||||||
		vv := mv.NewValue()
 | 
					 | 
				
			||||||
		for {
 | 
					 | 
				
			||||||
			tok := p.next()
 | 
					 | 
				
			||||||
			if tok.err != nil {
 | 
					 | 
				
			||||||
				return v, tok.err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if tok.value == terminator {
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			var err error
 | 
					 | 
				
			||||||
			switch tok.value {
 | 
					 | 
				
			||||||
			case "key":
 | 
					 | 
				
			||||||
				if err := p.consumeToken(":"); err != nil {
 | 
					 | 
				
			||||||
					return v, err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if kv, err = p.unmarshalSingularValue(kv, keyFD); err != nil {
 | 
					 | 
				
			||||||
					return v, err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if err := p.consumeOptionalSeparator(); err != nil {
 | 
					 | 
				
			||||||
					return v, err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			case "value":
 | 
					 | 
				
			||||||
				if err := p.checkForColon(valFD); err != nil {
 | 
					 | 
				
			||||||
					return v, err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if vv, err = p.unmarshalSingularValue(vv, valFD); err != nil {
 | 
					 | 
				
			||||||
					return v, err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if err := p.consumeOptionalSeparator(); err != nil {
 | 
					 | 
				
			||||||
					return v, err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			default:
 | 
					 | 
				
			||||||
				p.back()
 | 
					 | 
				
			||||||
				return v, p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		mv.Set(kv.MapKey(), vv)
 | 
					 | 
				
			||||||
		return v, nil
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		p.back()
 | 
					 | 
				
			||||||
		return p.unmarshalSingularValue(v, fd)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (p *textParser) unmarshalSingularValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) {
 | 
					 | 
				
			||||||
	tok := p.next()
 | 
					 | 
				
			||||||
	if tok.err != nil {
 | 
					 | 
				
			||||||
		return v, tok.err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if tok.value == "" {
 | 
					 | 
				
			||||||
		return v, p.errorf("unexpected EOF")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	switch fd.Kind() {
 | 
					 | 
				
			||||||
	case protoreflect.BoolKind:
 | 
					 | 
				
			||||||
		switch tok.value {
 | 
					 | 
				
			||||||
		case "true", "1", "t", "True":
 | 
					 | 
				
			||||||
			return protoreflect.ValueOfBool(true), nil
 | 
					 | 
				
			||||||
		case "false", "0", "f", "False":
 | 
					 | 
				
			||||||
			return protoreflect.ValueOfBool(false), nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind:
 | 
					 | 
				
			||||||
		if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil {
 | 
					 | 
				
			||||||
			return protoreflect.ValueOfInt32(int32(x)), nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// The C++ parser accepts large positive hex numbers that uses
 | 
					 | 
				
			||||||
		// two's complement arithmetic to represent negative numbers.
 | 
					 | 
				
			||||||
		// This feature is here for backwards compatibility with C++.
 | 
					 | 
				
			||||||
		if strings.HasPrefix(tok.value, "0x") {
 | 
					 | 
				
			||||||
			if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil {
 | 
					 | 
				
			||||||
				return protoreflect.ValueOfInt32(int32(-(int64(^x) + 1))), nil
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind:
 | 
					 | 
				
			||||||
		if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil {
 | 
					 | 
				
			||||||
			return protoreflect.ValueOfInt64(int64(x)), nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// The C++ parser accepts large positive hex numbers that uses
 | 
					 | 
				
			||||||
		// two's complement arithmetic to represent negative numbers.
 | 
					 | 
				
			||||||
		// This feature is here for backwards compatibility with C++.
 | 
					 | 
				
			||||||
		if strings.HasPrefix(tok.value, "0x") {
 | 
					 | 
				
			||||||
			if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil {
 | 
					 | 
				
			||||||
				return protoreflect.ValueOfInt64(int64(-(int64(^x) + 1))), nil
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case protoreflect.Uint32Kind, protoreflect.Fixed32Kind:
 | 
					 | 
				
			||||||
		if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil {
 | 
					 | 
				
			||||||
			return protoreflect.ValueOfUint32(uint32(x)), nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case protoreflect.Uint64Kind, protoreflect.Fixed64Kind:
 | 
					 | 
				
			||||||
		if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil {
 | 
					 | 
				
			||||||
			return protoreflect.ValueOfUint64(uint64(x)), nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case protoreflect.FloatKind:
 | 
					 | 
				
			||||||
		// Ignore 'f' for compatibility with output generated by C++,
 | 
					 | 
				
			||||||
		// but don't remove 'f' when the value is "-inf" or "inf".
 | 
					 | 
				
			||||||
		v := tok.value
 | 
					 | 
				
			||||||
		if strings.HasSuffix(v, "f") && v != "-inf" && v != "inf" {
 | 
					 | 
				
			||||||
			v = v[:len(v)-len("f")]
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if x, err := strconv.ParseFloat(v, 32); err == nil {
 | 
					 | 
				
			||||||
			return protoreflect.ValueOfFloat32(float32(x)), nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case protoreflect.DoubleKind:
 | 
					 | 
				
			||||||
		// Ignore 'f' for compatibility with output generated by C++,
 | 
					 | 
				
			||||||
		// but don't remove 'f' when the value is "-inf" or "inf".
 | 
					 | 
				
			||||||
		v := tok.value
 | 
					 | 
				
			||||||
		if strings.HasSuffix(v, "f") && v != "-inf" && v != "inf" {
 | 
					 | 
				
			||||||
			v = v[:len(v)-len("f")]
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if x, err := strconv.ParseFloat(v, 64); err == nil {
 | 
					 | 
				
			||||||
			return protoreflect.ValueOfFloat64(float64(x)), nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case protoreflect.StringKind:
 | 
					 | 
				
			||||||
		if isQuote(tok.value[0]) {
 | 
					 | 
				
			||||||
			return protoreflect.ValueOfString(tok.unquoted), nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case protoreflect.BytesKind:
 | 
					 | 
				
			||||||
		if isQuote(tok.value[0]) {
 | 
					 | 
				
			||||||
			return protoreflect.ValueOfBytes([]byte(tok.unquoted)), nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case protoreflect.EnumKind:
 | 
					 | 
				
			||||||
		if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil {
 | 
					 | 
				
			||||||
			return protoreflect.ValueOfEnum(protoreflect.EnumNumber(x)), nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		vd := fd.Enum().Values().ByName(protoreflect.Name(tok.value))
 | 
					 | 
				
			||||||
		if vd != nil {
 | 
					 | 
				
			||||||
			return protoreflect.ValueOfEnum(vd.Number()), nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case protoreflect.MessageKind, protoreflect.GroupKind:
 | 
					 | 
				
			||||||
		var terminator string
 | 
					 | 
				
			||||||
		switch tok.value {
 | 
					 | 
				
			||||||
		case "{":
 | 
					 | 
				
			||||||
			terminator = "}"
 | 
					 | 
				
			||||||
		case "<":
 | 
					 | 
				
			||||||
			terminator = ">"
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			return v, p.errorf("expected '{' or '<', found %q", tok.value)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		err := p.unmarshalMessage(v.Message(), terminator)
 | 
					 | 
				
			||||||
		return v, err
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		panic(fmt.Sprintf("invalid kind %v", fd.Kind()))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return v, p.errorf("invalid %v: %v", fd.Kind(), tok.value)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Consume a ':' from the input stream (if the next token is a colon),
 | 
					 | 
				
			||||||
// returning an error if a colon is needed but not present.
 | 
					 | 
				
			||||||
func (p *textParser) checkForColon(fd protoreflect.FieldDescriptor) *ParseError {
 | 
					 | 
				
			||||||
	tok := p.next()
 | 
					 | 
				
			||||||
	if tok.err != nil {
 | 
					 | 
				
			||||||
		return tok.err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if tok.value != ":" {
 | 
					 | 
				
			||||||
		if fd.Message() == nil {
 | 
					 | 
				
			||||||
			return p.errorf("expected ':', found %q", tok.value)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		p.back()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// consumeExtensionOrAnyName consumes an extension name or an Any type URL and
 | 
					 | 
				
			||||||
// the following ']'. It returns the name or URL consumed.
 | 
					 | 
				
			||||||
func (p *textParser) consumeExtensionOrAnyName() (string, error) {
 | 
					 | 
				
			||||||
	tok := p.next()
 | 
					 | 
				
			||||||
	if tok.err != nil {
 | 
					 | 
				
			||||||
		return "", tok.err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// If extension name or type url is quoted, it's a single token.
 | 
					 | 
				
			||||||
	if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] {
 | 
					 | 
				
			||||||
		name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0]))
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return "", err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return name, p.consumeToken("]")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Consume everything up to "]"
 | 
					 | 
				
			||||||
	var parts []string
 | 
					 | 
				
			||||||
	for tok.value != "]" {
 | 
					 | 
				
			||||||
		parts = append(parts, tok.value)
 | 
					 | 
				
			||||||
		tok = p.next()
 | 
					 | 
				
			||||||
		if tok.err != nil {
 | 
					 | 
				
			||||||
			return "", p.errorf("unrecognized type_url or extension name: %s", tok.err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if p.done && tok.value != "]" {
 | 
					 | 
				
			||||||
			return "", p.errorf("unclosed type_url or extension name")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return strings.Join(parts, ""), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// consumeOptionalSeparator consumes an optional semicolon or comma.
 | 
					 | 
				
			||||||
// It is used in unmarshalMessage to provide backward compatibility.
 | 
					 | 
				
			||||||
func (p *textParser) consumeOptionalSeparator() error {
 | 
					 | 
				
			||||||
	tok := p.next()
 | 
					 | 
				
			||||||
	if tok.err != nil {
 | 
					 | 
				
			||||||
		return tok.err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if tok.value != ";" && tok.value != "," {
 | 
					 | 
				
			||||||
		p.back()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (p *textParser) errorf(format string, a ...interface{}) *ParseError {
 | 
					 | 
				
			||||||
	pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset}
 | 
					 | 
				
			||||||
	p.cur.err = pe
 | 
					 | 
				
			||||||
	p.done = true
 | 
					 | 
				
			||||||
	return pe
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (p *textParser) skipWhitespace() {
 | 
					 | 
				
			||||||
	i := 0
 | 
					 | 
				
			||||||
	for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') {
 | 
					 | 
				
			||||||
		if p.s[i] == '#' {
 | 
					 | 
				
			||||||
			// comment; skip to end of line or input
 | 
					 | 
				
			||||||
			for i < len(p.s) && p.s[i] != '\n' {
 | 
					 | 
				
			||||||
				i++
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if i == len(p.s) {
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if p.s[i] == '\n' {
 | 
					 | 
				
			||||||
			p.line++
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		i++
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	p.offset += i
 | 
					 | 
				
			||||||
	p.s = p.s[i:len(p.s)]
 | 
					 | 
				
			||||||
	if len(p.s) == 0 {
 | 
					 | 
				
			||||||
		p.done = true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (p *textParser) advance() {
 | 
					 | 
				
			||||||
	// Skip whitespace
 | 
					 | 
				
			||||||
	p.skipWhitespace()
 | 
					 | 
				
			||||||
	if p.done {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Start of non-whitespace
 | 
					 | 
				
			||||||
	p.cur.err = nil
 | 
					 | 
				
			||||||
	p.cur.offset, p.cur.line = p.offset, p.line
 | 
					 | 
				
			||||||
	p.cur.unquoted = ""
 | 
					 | 
				
			||||||
	switch p.s[0] {
 | 
					 | 
				
			||||||
	case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/':
 | 
					 | 
				
			||||||
		// Single symbol
 | 
					 | 
				
			||||||
		p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)]
 | 
					 | 
				
			||||||
	case '"', '\'':
 | 
					 | 
				
			||||||
		// Quoted string
 | 
					 | 
				
			||||||
		i := 1
 | 
					 | 
				
			||||||
		for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' {
 | 
					 | 
				
			||||||
			if p.s[i] == '\\' && i+1 < len(p.s) {
 | 
					 | 
				
			||||||
				// skip escaped char
 | 
					 | 
				
			||||||
				i++
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			i++
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if i >= len(p.s) || p.s[i] != p.s[0] {
 | 
					 | 
				
			||||||
			p.errorf("unmatched quote")
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		unq, err := unquoteC(p.s[1:i], rune(p.s[0]))
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err)
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)]
 | 
					 | 
				
			||||||
		p.cur.unquoted = unq
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		i := 0
 | 
					 | 
				
			||||||
		for i < len(p.s) && isIdentOrNumberChar(p.s[i]) {
 | 
					 | 
				
			||||||
			i++
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if i == 0 {
 | 
					 | 
				
			||||||
			p.errorf("unexpected byte %#x", p.s[0])
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	p.offset += len(p.cur.value)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Back off the parser by one token. Can only be done between calls to next().
 | 
					 | 
				
			||||||
// It makes the next advance() a no-op.
 | 
					 | 
				
			||||||
func (p *textParser) back() { p.backed = true }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Advances the parser and returns the new current token.
 | 
					 | 
				
			||||||
func (p *textParser) next() *token {
 | 
					 | 
				
			||||||
	if p.backed || p.done {
 | 
					 | 
				
			||||||
		p.backed = false
 | 
					 | 
				
			||||||
		return &p.cur
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	p.advance()
 | 
					 | 
				
			||||||
	if p.done {
 | 
					 | 
				
			||||||
		p.cur.value = ""
 | 
					 | 
				
			||||||
	} else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) {
 | 
					 | 
				
			||||||
		// Look for multiple quoted strings separated by whitespace,
 | 
					 | 
				
			||||||
		// and concatenate them.
 | 
					 | 
				
			||||||
		cat := p.cur
 | 
					 | 
				
			||||||
		for {
 | 
					 | 
				
			||||||
			p.skipWhitespace()
 | 
					 | 
				
			||||||
			if p.done || !isQuote(p.s[0]) {
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			p.advance()
 | 
					 | 
				
			||||||
			if p.cur.err != nil {
 | 
					 | 
				
			||||||
				return &p.cur
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			cat.value += " " + p.cur.value
 | 
					 | 
				
			||||||
			cat.unquoted += p.cur.unquoted
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		p.done = false // parser may have seen EOF, but we want to return cat
 | 
					 | 
				
			||||||
		p.cur = cat
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return &p.cur
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (p *textParser) consumeToken(s string) error {
 | 
					 | 
				
			||||||
	tok := p.next()
 | 
					 | 
				
			||||||
	if tok.err != nil {
 | 
					 | 
				
			||||||
		return tok.err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if tok.value != s {
 | 
					 | 
				
			||||||
		p.back()
 | 
					 | 
				
			||||||
		return p.errorf("expected %q, found %q", s, tok.value)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var errBadUTF8 = errors.New("proto: bad UTF-8")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func unquoteC(s string, quote rune) (string, error) {
 | 
					 | 
				
			||||||
	// This is based on C++'s tokenizer.cc.
 | 
					 | 
				
			||||||
	// Despite its name, this is *not* parsing C syntax.
 | 
					 | 
				
			||||||
	// For instance, "\0" is an invalid quoted string.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Avoid allocation in trivial cases.
 | 
					 | 
				
			||||||
	simple := true
 | 
					 | 
				
			||||||
	for _, r := range s {
 | 
					 | 
				
			||||||
		if r == '\\' || r == quote {
 | 
					 | 
				
			||||||
			simple = false
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if simple {
 | 
					 | 
				
			||||||
		return s, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	buf := make([]byte, 0, 3*len(s)/2)
 | 
					 | 
				
			||||||
	for len(s) > 0 {
 | 
					 | 
				
			||||||
		r, n := utf8.DecodeRuneInString(s)
 | 
					 | 
				
			||||||
		if r == utf8.RuneError && n == 1 {
 | 
					 | 
				
			||||||
			return "", errBadUTF8
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		s = s[n:]
 | 
					 | 
				
			||||||
		if r != '\\' {
 | 
					 | 
				
			||||||
			if r < utf8.RuneSelf {
 | 
					 | 
				
			||||||
				buf = append(buf, byte(r))
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				buf = append(buf, string(r)...)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		ch, tail, err := unescape(s)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return "", err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		buf = append(buf, ch...)
 | 
					 | 
				
			||||||
		s = tail
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return string(buf), nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func unescape(s string) (ch string, tail string, err error) {
 | 
					 | 
				
			||||||
	r, n := utf8.DecodeRuneInString(s)
 | 
					 | 
				
			||||||
	if r == utf8.RuneError && n == 1 {
 | 
					 | 
				
			||||||
		return "", "", errBadUTF8
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	s = s[n:]
 | 
					 | 
				
			||||||
	switch r {
 | 
					 | 
				
			||||||
	case 'a':
 | 
					 | 
				
			||||||
		return "\a", s, nil
 | 
					 | 
				
			||||||
	case 'b':
 | 
					 | 
				
			||||||
		return "\b", s, nil
 | 
					 | 
				
			||||||
	case 'f':
 | 
					 | 
				
			||||||
		return "\f", s, nil
 | 
					 | 
				
			||||||
	case 'n':
 | 
					 | 
				
			||||||
		return "\n", s, nil
 | 
					 | 
				
			||||||
	case 'r':
 | 
					 | 
				
			||||||
		return "\r", s, nil
 | 
					 | 
				
			||||||
	case 't':
 | 
					 | 
				
			||||||
		return "\t", s, nil
 | 
					 | 
				
			||||||
	case 'v':
 | 
					 | 
				
			||||||
		return "\v", s, nil
 | 
					 | 
				
			||||||
	case '?':
 | 
					 | 
				
			||||||
		return "?", s, nil // trigraph workaround
 | 
					 | 
				
			||||||
	case '\'', '"', '\\':
 | 
					 | 
				
			||||||
		return string(r), s, nil
 | 
					 | 
				
			||||||
	case '0', '1', '2', '3', '4', '5', '6', '7':
 | 
					 | 
				
			||||||
		if len(s) < 2 {
 | 
					 | 
				
			||||||
			return "", "", fmt.Errorf(`\%c requires 2 following digits`, r)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ss := string(r) + s[:2]
 | 
					 | 
				
			||||||
		s = s[2:]
 | 
					 | 
				
			||||||
		i, err := strconv.ParseUint(ss, 8, 8)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return string([]byte{byte(i)}), s, nil
 | 
					 | 
				
			||||||
	case 'x', 'X', 'u', 'U':
 | 
					 | 
				
			||||||
		var n int
 | 
					 | 
				
			||||||
		switch r {
 | 
					 | 
				
			||||||
		case 'x', 'X':
 | 
					 | 
				
			||||||
			n = 2
 | 
					 | 
				
			||||||
		case 'u':
 | 
					 | 
				
			||||||
			n = 4
 | 
					 | 
				
			||||||
		case 'U':
 | 
					 | 
				
			||||||
			n = 8
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if len(s) < n {
 | 
					 | 
				
			||||||
			return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ss := s[:n]
 | 
					 | 
				
			||||||
		s = s[n:]
 | 
					 | 
				
			||||||
		i, err := strconv.ParseUint(ss, 16, 64)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if r == 'x' || r == 'X' {
 | 
					 | 
				
			||||||
			return string([]byte{byte(i)}), s, nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if i > utf8.MaxRune {
 | 
					 | 
				
			||||||
			return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return string(rune(i)), s, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return "", "", fmt.Errorf(`unknown escape \%c`, r)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func isIdentOrNumberChar(c byte) bool {
 | 
					 | 
				
			||||||
	switch {
 | 
					 | 
				
			||||||
	case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z':
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	case '0' <= c && c <= '9':
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	switch c {
 | 
					 | 
				
			||||||
	case '-', '+', '.', '_':
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func isWhitespace(c byte) bool {
 | 
					 | 
				
			||||||
	switch c {
 | 
					 | 
				
			||||||
	case ' ', '\t', '\n', '\r':
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func isQuote(c byte) bool {
 | 
					 | 
				
			||||||
	switch c {
 | 
					 | 
				
			||||||
	case '"', '\'':
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										560
									
								
								vendor/github.com/golang/protobuf/proto/text_encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										560
									
								
								vendor/github.com/golang/protobuf/proto/text_encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,560 +0,0 @@
 | 
				
			|||||||
// Copyright 2010 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"bytes"
 | 
					 | 
				
			||||||
	"encoding"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"io"
 | 
					 | 
				
			||||||
	"math"
 | 
					 | 
				
			||||||
	"sort"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/encoding/prototext"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/encoding/protowire"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/proto"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoregistry"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const wrapTextMarshalV2 = 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 the proto text format of m to w.
 | 
					 | 
				
			||||||
func (tm *TextMarshaler) Marshal(w io.Writer, m Message) error {
 | 
					 | 
				
			||||||
	b, err := tm.marshal(m)
 | 
					 | 
				
			||||||
	if len(b) > 0 {
 | 
					 | 
				
			||||||
		if _, err := w.Write(b); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Text returns a proto text formatted string of m.
 | 
					 | 
				
			||||||
func (tm *TextMarshaler) Text(m Message) string {
 | 
					 | 
				
			||||||
	b, _ := tm.marshal(m)
 | 
					 | 
				
			||||||
	return string(b)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (tm *TextMarshaler) marshal(m Message) ([]byte, error) {
 | 
					 | 
				
			||||||
	mr := MessageReflect(m)
 | 
					 | 
				
			||||||
	if mr == nil || !mr.IsValid() {
 | 
					 | 
				
			||||||
		return []byte("<nil>"), nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if wrapTextMarshalV2 {
 | 
					 | 
				
			||||||
		if m, ok := m.(encoding.TextMarshaler); ok {
 | 
					 | 
				
			||||||
			return m.MarshalText()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		opts := prototext.MarshalOptions{
 | 
					 | 
				
			||||||
			AllowPartial: true,
 | 
					 | 
				
			||||||
			EmitUnknown:  true,
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !tm.Compact {
 | 
					 | 
				
			||||||
			opts.Indent = "  "
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !tm.ExpandAny {
 | 
					 | 
				
			||||||
			opts.Resolver = (*protoregistry.Types)(nil)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return opts.Marshal(mr.Interface())
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		w := &textWriter{
 | 
					 | 
				
			||||||
			compact:   tm.Compact,
 | 
					 | 
				
			||||||
			expandAny: tm.ExpandAny,
 | 
					 | 
				
			||||||
			complete:  true,
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if m, ok := m.(encoding.TextMarshaler); ok {
 | 
					 | 
				
			||||||
			b, err := m.MarshalText()
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				return nil, err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			w.Write(b)
 | 
					 | 
				
			||||||
			return w.buf, nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		err := w.writeMessage(mr)
 | 
					 | 
				
			||||||
		return w.buf, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	defaultTextMarshaler = TextMarshaler{}
 | 
					 | 
				
			||||||
	compactTextMarshaler = TextMarshaler{Compact: true}
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// MarshalText writes the proto text format of m to w.
 | 
					 | 
				
			||||||
func MarshalText(w io.Writer, m Message) error { return defaultTextMarshaler.Marshal(w, m) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// MarshalTextString returns a proto text formatted string of m.
 | 
					 | 
				
			||||||
func MarshalTextString(m Message) string { return defaultTextMarshaler.Text(m) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// CompactText writes the compact proto text format of m to w.
 | 
					 | 
				
			||||||
func CompactText(w io.Writer, m Message) error { return compactTextMarshaler.Marshal(w, m) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// CompactTextString returns a compact proto text formatted string of m.
 | 
					 | 
				
			||||||
func CompactTextString(m Message) string { return compactTextMarshaler.Text(m) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	newline         = []byte("\n")
 | 
					 | 
				
			||||||
	endBraceNewline = []byte("}\n")
 | 
					 | 
				
			||||||
	posInf          = []byte("inf")
 | 
					 | 
				
			||||||
	negInf          = []byte("-inf")
 | 
					 | 
				
			||||||
	nan             = []byte("nan")
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// textWriter is an io.Writer that tracks its indentation level.
 | 
					 | 
				
			||||||
type textWriter struct {
 | 
					 | 
				
			||||||
	compact   bool // same as TextMarshaler.Compact
 | 
					 | 
				
			||||||
	expandAny bool // same as TextMarshaler.ExpandAny
 | 
					 | 
				
			||||||
	complete  bool // whether the current position is a complete line
 | 
					 | 
				
			||||||
	indent    int  // indentation level; never negative
 | 
					 | 
				
			||||||
	buf       []byte
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (w *textWriter) Write(p []byte) (n int, _ error) {
 | 
					 | 
				
			||||||
	newlines := bytes.Count(p, newline)
 | 
					 | 
				
			||||||
	if newlines == 0 {
 | 
					 | 
				
			||||||
		if !w.compact && w.complete {
 | 
					 | 
				
			||||||
			w.writeIndent()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		w.buf = append(w.buf, p...)
 | 
					 | 
				
			||||||
		w.complete = false
 | 
					 | 
				
			||||||
		return len(p), nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	frags := bytes.SplitN(p, newline, newlines+1)
 | 
					 | 
				
			||||||
	if w.compact {
 | 
					 | 
				
			||||||
		for i, frag := range frags {
 | 
					 | 
				
			||||||
			if i > 0 {
 | 
					 | 
				
			||||||
				w.buf = append(w.buf, ' ')
 | 
					 | 
				
			||||||
				n++
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			w.buf = append(w.buf, frag...)
 | 
					 | 
				
			||||||
			n += len(frag)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return n, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for i, frag := range frags {
 | 
					 | 
				
			||||||
		if w.complete {
 | 
					 | 
				
			||||||
			w.writeIndent()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		w.buf = append(w.buf, frag...)
 | 
					 | 
				
			||||||
		n += len(frag)
 | 
					 | 
				
			||||||
		if i+1 < len(frags) {
 | 
					 | 
				
			||||||
			w.buf = append(w.buf, '\n')
 | 
					 | 
				
			||||||
			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()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	w.buf = append(w.buf, c)
 | 
					 | 
				
			||||||
	w.complete = c == '\n'
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (w *textWriter) writeName(fd protoreflect.FieldDescriptor) {
 | 
					 | 
				
			||||||
	if !w.compact && w.complete {
 | 
					 | 
				
			||||||
		w.writeIndent()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	w.complete = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if fd.Kind() != protoreflect.GroupKind {
 | 
					 | 
				
			||||||
		w.buf = append(w.buf, fd.Name()...)
 | 
					 | 
				
			||||||
		w.WriteByte(':')
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		// Use message type name for group field name.
 | 
					 | 
				
			||||||
		w.buf = append(w.buf, fd.Message().Name()...)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if !w.compact {
 | 
					 | 
				
			||||||
		w.WriteByte(' ')
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// 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 (w *textWriter) writeProto3Any(m protoreflect.Message) (bool, error) {
 | 
					 | 
				
			||||||
	md := m.Descriptor()
 | 
					 | 
				
			||||||
	fdURL := md.Fields().ByName("type_url")
 | 
					 | 
				
			||||||
	fdVal := md.Fields().ByName("value")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	url := m.Get(fdURL).String()
 | 
					 | 
				
			||||||
	mt, err := protoregistry.GlobalTypes.FindMessageByURL(url)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return false, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	b := m.Get(fdVal).Bytes()
 | 
					 | 
				
			||||||
	m2 := mt.New()
 | 
					 | 
				
			||||||
	if err := proto.Unmarshal(b, m2.Interface()); err != nil {
 | 
					 | 
				
			||||||
		return false, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	w.Write([]byte("["))
 | 
					 | 
				
			||||||
	if requiresQuotes(url) {
 | 
					 | 
				
			||||||
		w.writeQuotedString(url)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		w.Write([]byte(url))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if w.compact {
 | 
					 | 
				
			||||||
		w.Write([]byte("]:<"))
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		w.Write([]byte("]: <\n"))
 | 
					 | 
				
			||||||
		w.indent++
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err := w.writeMessage(m2); err != nil {
 | 
					 | 
				
			||||||
		return true, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if w.compact {
 | 
					 | 
				
			||||||
		w.Write([]byte("> "))
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		w.indent--
 | 
					 | 
				
			||||||
		w.Write([]byte(">\n"))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return true, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (w *textWriter) writeMessage(m protoreflect.Message) error {
 | 
					 | 
				
			||||||
	md := m.Descriptor()
 | 
					 | 
				
			||||||
	if w.expandAny && md.FullName() == "google.protobuf.Any" {
 | 
					 | 
				
			||||||
		if canExpand, err := w.writeProto3Any(m); canExpand {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fds := md.Fields()
 | 
					 | 
				
			||||||
	for i := 0; i < fds.Len(); {
 | 
					 | 
				
			||||||
		fd := fds.Get(i)
 | 
					 | 
				
			||||||
		if od := fd.ContainingOneof(); od != nil {
 | 
					 | 
				
			||||||
			fd = m.WhichOneof(od)
 | 
					 | 
				
			||||||
			i += od.Fields().Len()
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			i++
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if fd == nil || !m.Has(fd) {
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		switch {
 | 
					 | 
				
			||||||
		case fd.IsList():
 | 
					 | 
				
			||||||
			lv := m.Get(fd).List()
 | 
					 | 
				
			||||||
			for j := 0; j < lv.Len(); j++ {
 | 
					 | 
				
			||||||
				w.writeName(fd)
 | 
					 | 
				
			||||||
				v := lv.Get(j)
 | 
					 | 
				
			||||||
				if err := w.writeSingularValue(v, fd); err != nil {
 | 
					 | 
				
			||||||
					return err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				w.WriteByte('\n')
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		case fd.IsMap():
 | 
					 | 
				
			||||||
			kfd := fd.MapKey()
 | 
					 | 
				
			||||||
			vfd := fd.MapValue()
 | 
					 | 
				
			||||||
			mv := m.Get(fd).Map()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			type entry struct{ key, val protoreflect.Value }
 | 
					 | 
				
			||||||
			var entries []entry
 | 
					 | 
				
			||||||
			mv.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool {
 | 
					 | 
				
			||||||
				entries = append(entries, entry{k.Value(), v})
 | 
					 | 
				
			||||||
				return true
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
			sort.Slice(entries, func(i, j int) bool {
 | 
					 | 
				
			||||||
				switch kfd.Kind() {
 | 
					 | 
				
			||||||
				case protoreflect.BoolKind:
 | 
					 | 
				
			||||||
					return !entries[i].key.Bool() && entries[j].key.Bool()
 | 
					 | 
				
			||||||
				case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind:
 | 
					 | 
				
			||||||
					return entries[i].key.Int() < entries[j].key.Int()
 | 
					 | 
				
			||||||
				case protoreflect.Uint32Kind, protoreflect.Fixed32Kind, protoreflect.Uint64Kind, protoreflect.Fixed64Kind:
 | 
					 | 
				
			||||||
					return entries[i].key.Uint() < entries[j].key.Uint()
 | 
					 | 
				
			||||||
				case protoreflect.StringKind:
 | 
					 | 
				
			||||||
					return entries[i].key.String() < entries[j].key.String()
 | 
					 | 
				
			||||||
				default:
 | 
					 | 
				
			||||||
					panic("invalid kind")
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
			for _, entry := range entries {
 | 
					 | 
				
			||||||
				w.writeName(fd)
 | 
					 | 
				
			||||||
				w.WriteByte('<')
 | 
					 | 
				
			||||||
				if !w.compact {
 | 
					 | 
				
			||||||
					w.WriteByte('\n')
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				w.indent++
 | 
					 | 
				
			||||||
				w.writeName(kfd)
 | 
					 | 
				
			||||||
				if err := w.writeSingularValue(entry.key, kfd); err != nil {
 | 
					 | 
				
			||||||
					return err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				w.WriteByte('\n')
 | 
					 | 
				
			||||||
				w.writeName(vfd)
 | 
					 | 
				
			||||||
				if err := w.writeSingularValue(entry.val, vfd); err != nil {
 | 
					 | 
				
			||||||
					return err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				w.WriteByte('\n')
 | 
					 | 
				
			||||||
				w.indent--
 | 
					 | 
				
			||||||
				w.WriteByte('>')
 | 
					 | 
				
			||||||
				w.WriteByte('\n')
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			w.writeName(fd)
 | 
					 | 
				
			||||||
			if err := w.writeSingularValue(m.Get(fd), fd); err != nil {
 | 
					 | 
				
			||||||
				return err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			w.WriteByte('\n')
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if b := m.GetUnknown(); len(b) > 0 {
 | 
					 | 
				
			||||||
		w.writeUnknownFields(b)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return w.writeExtensions(m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (w *textWriter) writeSingularValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) error {
 | 
					 | 
				
			||||||
	switch fd.Kind() {
 | 
					 | 
				
			||||||
	case protoreflect.FloatKind, protoreflect.DoubleKind:
 | 
					 | 
				
			||||||
		switch vf := v.Float(); {
 | 
					 | 
				
			||||||
		case math.IsInf(vf, +1):
 | 
					 | 
				
			||||||
			w.Write(posInf)
 | 
					 | 
				
			||||||
		case math.IsInf(vf, -1):
 | 
					 | 
				
			||||||
			w.Write(negInf)
 | 
					 | 
				
			||||||
		case math.IsNaN(vf):
 | 
					 | 
				
			||||||
			w.Write(nan)
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			fmt.Fprint(w, v.Interface())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	case protoreflect.StringKind:
 | 
					 | 
				
			||||||
		// NOTE: This does not validate UTF-8 for historical reasons.
 | 
					 | 
				
			||||||
		w.writeQuotedString(string(v.String()))
 | 
					 | 
				
			||||||
	case protoreflect.BytesKind:
 | 
					 | 
				
			||||||
		w.writeQuotedString(string(v.Bytes()))
 | 
					 | 
				
			||||||
	case protoreflect.MessageKind, protoreflect.GroupKind:
 | 
					 | 
				
			||||||
		var bra, ket byte = '<', '>'
 | 
					 | 
				
			||||||
		if fd.Kind() == protoreflect.GroupKind {
 | 
					 | 
				
			||||||
			bra, ket = '{', '}'
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		w.WriteByte(bra)
 | 
					 | 
				
			||||||
		if !w.compact {
 | 
					 | 
				
			||||||
			w.WriteByte('\n')
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		w.indent++
 | 
					 | 
				
			||||||
		m := v.Message()
 | 
					 | 
				
			||||||
		if m2, ok := m.Interface().(encoding.TextMarshaler); ok {
 | 
					 | 
				
			||||||
			b, err := m2.MarshalText()
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				return err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			w.Write(b)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			w.writeMessage(m)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		w.indent--
 | 
					 | 
				
			||||||
		w.WriteByte(ket)
 | 
					 | 
				
			||||||
	case protoreflect.EnumKind:
 | 
					 | 
				
			||||||
		if ev := fd.Enum().Values().ByNumber(v.Enum()); ev != nil {
 | 
					 | 
				
			||||||
			fmt.Fprint(w, ev.Name())
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			fmt.Fprint(w, v.Enum())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		fmt.Fprint(w, v.Interface())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// writeQuotedString writes a quoted string in the protocol buffer text format.
 | 
					 | 
				
			||||||
func (w *textWriter) writeQuotedString(s string) {
 | 
					 | 
				
			||||||
	w.WriteByte('"')
 | 
					 | 
				
			||||||
	for i := 0; i < len(s); i++ {
 | 
					 | 
				
			||||||
		switch c := s[i]; c {
 | 
					 | 
				
			||||||
		case '\n':
 | 
					 | 
				
			||||||
			w.buf = append(w.buf, `\n`...)
 | 
					 | 
				
			||||||
		case '\r':
 | 
					 | 
				
			||||||
			w.buf = append(w.buf, `\r`...)
 | 
					 | 
				
			||||||
		case '\t':
 | 
					 | 
				
			||||||
			w.buf = append(w.buf, `\t`...)
 | 
					 | 
				
			||||||
		case '"':
 | 
					 | 
				
			||||||
			w.buf = append(w.buf, `\"`...)
 | 
					 | 
				
			||||||
		case '\\':
 | 
					 | 
				
			||||||
			w.buf = append(w.buf, `\\`...)
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			if isPrint := c >= 0x20 && c < 0x7f; isPrint {
 | 
					 | 
				
			||||||
				w.buf = append(w.buf, c)
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				w.buf = append(w.buf, fmt.Sprintf(`\%03o`, c)...)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	w.WriteByte('"')
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (w *textWriter) writeUnknownFields(b []byte) {
 | 
					 | 
				
			||||||
	if !w.compact {
 | 
					 | 
				
			||||||
		fmt.Fprintf(w, "/* %d unknown bytes */\n", len(b))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for len(b) > 0 {
 | 
					 | 
				
			||||||
		num, wtyp, n := protowire.ConsumeTag(b)
 | 
					 | 
				
			||||||
		if n < 0 {
 | 
					 | 
				
			||||||
			return
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		b = b[n:]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if wtyp == protowire.EndGroupType {
 | 
					 | 
				
			||||||
			w.indent--
 | 
					 | 
				
			||||||
			w.Write(endBraceNewline)
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		fmt.Fprint(w, num)
 | 
					 | 
				
			||||||
		if wtyp != protowire.StartGroupType {
 | 
					 | 
				
			||||||
			w.WriteByte(':')
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !w.compact || wtyp == protowire.StartGroupType {
 | 
					 | 
				
			||||||
			w.WriteByte(' ')
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		switch wtyp {
 | 
					 | 
				
			||||||
		case protowire.VarintType:
 | 
					 | 
				
			||||||
			v, n := protowire.ConsumeVarint(b)
 | 
					 | 
				
			||||||
			if n < 0 {
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			b = b[n:]
 | 
					 | 
				
			||||||
			fmt.Fprint(w, v)
 | 
					 | 
				
			||||||
		case protowire.Fixed32Type:
 | 
					 | 
				
			||||||
			v, n := protowire.ConsumeFixed32(b)
 | 
					 | 
				
			||||||
			if n < 0 {
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			b = b[n:]
 | 
					 | 
				
			||||||
			fmt.Fprint(w, v)
 | 
					 | 
				
			||||||
		case protowire.Fixed64Type:
 | 
					 | 
				
			||||||
			v, n := protowire.ConsumeFixed64(b)
 | 
					 | 
				
			||||||
			if n < 0 {
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			b = b[n:]
 | 
					 | 
				
			||||||
			fmt.Fprint(w, v)
 | 
					 | 
				
			||||||
		case protowire.BytesType:
 | 
					 | 
				
			||||||
			v, n := protowire.ConsumeBytes(b)
 | 
					 | 
				
			||||||
			if n < 0 {
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			b = b[n:]
 | 
					 | 
				
			||||||
			fmt.Fprintf(w, "%q", v)
 | 
					 | 
				
			||||||
		case protowire.StartGroupType:
 | 
					 | 
				
			||||||
			w.WriteByte('{')
 | 
					 | 
				
			||||||
			w.indent++
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			fmt.Fprintf(w, "/* unknown wire type %d */", wtyp)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		w.WriteByte('\n')
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// writeExtensions writes all the extensions in m.
 | 
					 | 
				
			||||||
func (w *textWriter) writeExtensions(m protoreflect.Message) error {
 | 
					 | 
				
			||||||
	md := m.Descriptor()
 | 
					 | 
				
			||||||
	if md.ExtensionRanges().Len() == 0 {
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	type ext struct {
 | 
					 | 
				
			||||||
		desc protoreflect.FieldDescriptor
 | 
					 | 
				
			||||||
		val  protoreflect.Value
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	var exts []ext
 | 
					 | 
				
			||||||
	m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {
 | 
					 | 
				
			||||||
		if fd.IsExtension() {
 | 
					 | 
				
			||||||
			exts = append(exts, ext{fd, v})
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return true
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	sort.Slice(exts, func(i, j int) bool {
 | 
					 | 
				
			||||||
		return exts[i].desc.Number() < exts[j].desc.Number()
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for _, ext := range exts {
 | 
					 | 
				
			||||||
		// For message set, use the name of the message as the extension name.
 | 
					 | 
				
			||||||
		name := string(ext.desc.FullName())
 | 
					 | 
				
			||||||
		if isMessageSet(ext.desc.ContainingMessage()) {
 | 
					 | 
				
			||||||
			name = strings.TrimSuffix(name, ".message_set_extension")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if !ext.desc.IsList() {
 | 
					 | 
				
			||||||
			if err := w.writeSingularExtension(name, ext.val, ext.desc); err != nil {
 | 
					 | 
				
			||||||
				return err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			lv := ext.val.List()
 | 
					 | 
				
			||||||
			for i := 0; i < lv.Len(); i++ {
 | 
					 | 
				
			||||||
				if err := w.writeSingularExtension(name, lv.Get(i), ext.desc); err != nil {
 | 
					 | 
				
			||||||
					return err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (w *textWriter) writeSingularExtension(name string, v protoreflect.Value, fd protoreflect.FieldDescriptor) error {
 | 
					 | 
				
			||||||
	fmt.Fprintf(w, "[%s]:", name)
 | 
					 | 
				
			||||||
	if !w.compact {
 | 
					 | 
				
			||||||
		w.WriteByte(' ')
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err := w.writeSingularValue(v, fd); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	w.WriteByte('\n')
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (w *textWriter) writeIndent() {
 | 
					 | 
				
			||||||
	if !w.complete {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i := 0; i < w.indent*2; i++ {
 | 
					 | 
				
			||||||
		w.buf = append(w.buf, ' ')
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	w.complete = false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										78
									
								
								vendor/github.com/golang/protobuf/proto/wire.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										78
									
								
								vendor/github.com/golang/protobuf/proto/wire.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,78 +0,0 @@
 | 
				
			|||||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	protoV2 "google.golang.org/protobuf/proto"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/runtime/protoiface"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Size returns the size in bytes of the wire-format encoding of m.
 | 
					 | 
				
			||||||
func Size(m Message) int {
 | 
					 | 
				
			||||||
	if m == nil {
 | 
					 | 
				
			||||||
		return 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	mi := MessageV2(m)
 | 
					 | 
				
			||||||
	return protoV2.Size(mi)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Marshal returns the wire-format encoding of m.
 | 
					 | 
				
			||||||
func Marshal(m Message) ([]byte, error) {
 | 
					 | 
				
			||||||
	b, err := marshalAppend(nil, m, false)
 | 
					 | 
				
			||||||
	if b == nil {
 | 
					 | 
				
			||||||
		b = zeroBytes
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return b, err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var zeroBytes = make([]byte, 0, 0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func marshalAppend(buf []byte, m Message, deterministic bool) ([]byte, error) {
 | 
					 | 
				
			||||||
	if m == nil {
 | 
					 | 
				
			||||||
		return nil, ErrNil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	mi := MessageV2(m)
 | 
					 | 
				
			||||||
	nbuf, err := protoV2.MarshalOptions{
 | 
					 | 
				
			||||||
		Deterministic: deterministic,
 | 
					 | 
				
			||||||
		AllowPartial:  true,
 | 
					 | 
				
			||||||
	}.MarshalAppend(buf, mi)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return buf, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if len(buf) == len(nbuf) {
 | 
					 | 
				
			||||||
		if !mi.ProtoReflect().IsValid() {
 | 
					 | 
				
			||||||
			return buf, ErrNil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nbuf, checkRequiredNotSet(mi)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Unmarshal parses a wire-format message in b and places the decoded results in m.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Unmarshal resets m before starting to unmarshal, so any existing data in m is always
 | 
					 | 
				
			||||||
// removed. Use UnmarshalMerge to preserve and append to existing data.
 | 
					 | 
				
			||||||
func Unmarshal(b []byte, m Message) error {
 | 
					 | 
				
			||||||
	m.Reset()
 | 
					 | 
				
			||||||
	return UnmarshalMerge(b, m)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// UnmarshalMerge parses a wire-format message in b and places the decoded results in m.
 | 
					 | 
				
			||||||
func UnmarshalMerge(b []byte, m Message) error {
 | 
					 | 
				
			||||||
	mi := MessageV2(m)
 | 
					 | 
				
			||||||
	out, err := protoV2.UnmarshalOptions{
 | 
					 | 
				
			||||||
		AllowPartial: true,
 | 
					 | 
				
			||||||
		Merge:        true,
 | 
					 | 
				
			||||||
	}.UnmarshalState(protoiface.UnmarshalInput{
 | 
					 | 
				
			||||||
		Buf:     b,
 | 
					 | 
				
			||||||
		Message: mi.ProtoReflect(),
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if out.Flags&protoiface.UnmarshalInitialized > 0 {
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return checkRequiredNotSet(mi)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										34
									
								
								vendor/github.com/golang/protobuf/proto/wrappers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/golang/protobuf/proto/wrappers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,34 +0,0 @@
 | 
				
			|||||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package proto
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Bool stores v in a new bool value and returns a pointer to it.
 | 
					 | 
				
			||||||
func Bool(v bool) *bool { return &v }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Int stores v in a new int32 value and returns a pointer to it.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Deprecated: Use Int32 instead.
 | 
					 | 
				
			||||||
func Int(v int) *int32 { return Int32(int32(v)) }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Int32 stores v in a new int32 value and returns a pointer to it.
 | 
					 | 
				
			||||||
func Int32(v int32) *int32 { return &v }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Int64 stores v in a new int64 value and returns a pointer to it.
 | 
					 | 
				
			||||||
func Int64(v int64) *int64 { return &v }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Uint32 stores v in a new uint32 value and returns a pointer to it.
 | 
					 | 
				
			||||||
func Uint32(v uint32) *uint32 { return &v }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Uint64 stores v in a new uint64 value and returns a pointer to it.
 | 
					 | 
				
			||||||
func Uint64(v uint64) *uint64 { return &v }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Float32 stores v in a new float32 value and returns a pointer to it.
 | 
					 | 
				
			||||||
func Float32(v float32) *float32 { return &v }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Float64 stores v in a new float64 value and returns a pointer to it.
 | 
					 | 
				
			||||||
func Float64(v float64) *float64 { return &v }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// String stores v in a new string value and returns a pointer to it.
 | 
					 | 
				
			||||||
func String(v string) *string { return &v }
 | 
					 | 
				
			||||||
							
								
								
									
										276
									
								
								vendor/google.golang.org/protobuf/reflect/protodesc/desc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										276
									
								
								vendor/google.golang.org/protobuf/reflect/protodesc/desc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,276 +0,0 @@
 | 
				
			|||||||
// Copyright 2018 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Package protodesc provides functionality for converting
 | 
					 | 
				
			||||||
// FileDescriptorProto messages to/from protoreflect.FileDescriptor values.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// The google.protobuf.FileDescriptorProto is a protobuf message that describes
 | 
					 | 
				
			||||||
// the type information for a .proto file in a form that is easily serializable.
 | 
					 | 
				
			||||||
// The protoreflect.FileDescriptor is a more structured representation of
 | 
					 | 
				
			||||||
// the FileDescriptorProto message where references and remote dependencies
 | 
					 | 
				
			||||||
// can be directly followed.
 | 
					 | 
				
			||||||
package protodesc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/errors"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/filedesc"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/pragma"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/strs"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/proto"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoregistry"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/types/descriptorpb"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Resolver is the resolver used by NewFile to resolve dependencies.
 | 
					 | 
				
			||||||
// The enums and messages provided must belong to some parent file,
 | 
					 | 
				
			||||||
// which is also registered.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// It is implemented by protoregistry.Files.
 | 
					 | 
				
			||||||
type Resolver interface {
 | 
					 | 
				
			||||||
	FindFileByPath(string) (protoreflect.FileDescriptor, error)
 | 
					 | 
				
			||||||
	FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// FileOptions configures the construction of file descriptors.
 | 
					 | 
				
			||||||
type FileOptions struct {
 | 
					 | 
				
			||||||
	pragma.NoUnkeyedLiterals
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// AllowUnresolvable configures New to permissively allow unresolvable
 | 
					 | 
				
			||||||
	// file, enum, or message dependencies. Unresolved dependencies are replaced
 | 
					 | 
				
			||||||
	// by placeholder equivalents.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// The following dependencies may be left unresolved:
 | 
					 | 
				
			||||||
	//	• Resolving an imported file.
 | 
					 | 
				
			||||||
	//	• Resolving the type for a message field or extension field.
 | 
					 | 
				
			||||||
	//	If the kind of the field is unknown, then a placeholder is used for both
 | 
					 | 
				
			||||||
	//	the Enum and Message accessors on the protoreflect.FieldDescriptor.
 | 
					 | 
				
			||||||
	//	• Resolving an enum value set as the default for an optional enum field.
 | 
					 | 
				
			||||||
	//	If unresolvable, the protoreflect.FieldDescriptor.Default is set to the
 | 
					 | 
				
			||||||
	//	first value in the associated enum (or zero if the also enum dependency
 | 
					 | 
				
			||||||
	//	is also unresolvable). The protoreflect.FieldDescriptor.DefaultEnumValue
 | 
					 | 
				
			||||||
	//	is populated with a placeholder.
 | 
					 | 
				
			||||||
	//	• Resolving the extended message type for an extension field.
 | 
					 | 
				
			||||||
	//	• Resolving the input or output message type for a service method.
 | 
					 | 
				
			||||||
	//
 | 
					 | 
				
			||||||
	// If the unresolved dependency uses a relative name,
 | 
					 | 
				
			||||||
	// then the placeholder will contain an invalid FullName with a "*." prefix,
 | 
					 | 
				
			||||||
	// indicating that the starting prefix of the full name is unknown.
 | 
					 | 
				
			||||||
	AllowUnresolvable bool
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewFile creates a new protoreflect.FileDescriptor from the provided
 | 
					 | 
				
			||||||
// file descriptor message. See FileOptions.New for more information.
 | 
					 | 
				
			||||||
func NewFile(fd *descriptorpb.FileDescriptorProto, r Resolver) (protoreflect.FileDescriptor, error) {
 | 
					 | 
				
			||||||
	return FileOptions{}.New(fd, r)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewFiles creates a new protoregistry.Files from the provided
 | 
					 | 
				
			||||||
// FileDescriptorSet message. See FileOptions.NewFiles for more information.
 | 
					 | 
				
			||||||
func NewFiles(fd *descriptorpb.FileDescriptorSet) (*protoregistry.Files, error) {
 | 
					 | 
				
			||||||
	return FileOptions{}.NewFiles(fd)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// New creates a new protoreflect.FileDescriptor from the provided
 | 
					 | 
				
			||||||
// file descriptor message. The file must represent a valid proto file according
 | 
					 | 
				
			||||||
// to protobuf semantics. The returned descriptor is a deep copy of the input.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Any imported files, enum types, or message types referenced in the file are
 | 
					 | 
				
			||||||
// resolved using the provided registry. When looking up an import file path,
 | 
					 | 
				
			||||||
// the path must be unique. The newly created file descriptor is not registered
 | 
					 | 
				
			||||||
// back into the provided file registry.
 | 
					 | 
				
			||||||
func (o FileOptions) New(fd *descriptorpb.FileDescriptorProto, r Resolver) (protoreflect.FileDescriptor, error) {
 | 
					 | 
				
			||||||
	if r == nil {
 | 
					 | 
				
			||||||
		r = (*protoregistry.Files)(nil) // empty resolver
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Handle the file descriptor content.
 | 
					 | 
				
			||||||
	f := &filedesc.File{L2: &filedesc.FileL2{}}
 | 
					 | 
				
			||||||
	switch fd.GetSyntax() {
 | 
					 | 
				
			||||||
	case "proto2", "":
 | 
					 | 
				
			||||||
		f.L1.Syntax = protoreflect.Proto2
 | 
					 | 
				
			||||||
	case "proto3":
 | 
					 | 
				
			||||||
		f.L1.Syntax = protoreflect.Proto3
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return nil, errors.New("invalid syntax: %q", fd.GetSyntax())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	f.L1.Path = fd.GetName()
 | 
					 | 
				
			||||||
	if f.L1.Path == "" {
 | 
					 | 
				
			||||||
		return nil, errors.New("file path must be populated")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	f.L1.Package = protoreflect.FullName(fd.GetPackage())
 | 
					 | 
				
			||||||
	if !f.L1.Package.IsValid() && f.L1.Package != "" {
 | 
					 | 
				
			||||||
		return nil, errors.New("invalid package: %q", f.L1.Package)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if opts := fd.GetOptions(); opts != nil {
 | 
					 | 
				
			||||||
		opts = proto.Clone(opts).(*descriptorpb.FileOptions)
 | 
					 | 
				
			||||||
		f.L2.Options = func() protoreflect.ProtoMessage { return opts }
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	f.L2.Imports = make(filedesc.FileImports, len(fd.GetDependency()))
 | 
					 | 
				
			||||||
	for _, i := range fd.GetPublicDependency() {
 | 
					 | 
				
			||||||
		if !(0 <= i && int(i) < len(f.L2.Imports)) || f.L2.Imports[i].IsPublic {
 | 
					 | 
				
			||||||
			return nil, errors.New("invalid or duplicate public import index: %d", i)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		f.L2.Imports[i].IsPublic = true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for _, i := range fd.GetWeakDependency() {
 | 
					 | 
				
			||||||
		if !(0 <= i && int(i) < len(f.L2.Imports)) || f.L2.Imports[i].IsWeak {
 | 
					 | 
				
			||||||
			return nil, errors.New("invalid or duplicate weak import index: %d", i)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		f.L2.Imports[i].IsWeak = true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	imps := importSet{f.Path(): true}
 | 
					 | 
				
			||||||
	for i, path := range fd.GetDependency() {
 | 
					 | 
				
			||||||
		imp := &f.L2.Imports[i]
 | 
					 | 
				
			||||||
		f, err := r.FindFileByPath(path)
 | 
					 | 
				
			||||||
		if err == protoregistry.NotFound && (o.AllowUnresolvable || imp.IsWeak) {
 | 
					 | 
				
			||||||
			f = filedesc.PlaceholderFile(path)
 | 
					 | 
				
			||||||
		} else if err != nil {
 | 
					 | 
				
			||||||
			return nil, errors.New("could not resolve import %q: %v", path, err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		imp.FileDescriptor = f
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if imps[imp.Path()] {
 | 
					 | 
				
			||||||
			return nil, errors.New("already imported %q", path)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		imps[imp.Path()] = true
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i := range fd.GetDependency() {
 | 
					 | 
				
			||||||
		imp := &f.L2.Imports[i]
 | 
					 | 
				
			||||||
		imps.importPublic(imp.Imports())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Handle source locations.
 | 
					 | 
				
			||||||
	f.L2.Locations.File = f
 | 
					 | 
				
			||||||
	for _, loc := range fd.GetSourceCodeInfo().GetLocation() {
 | 
					 | 
				
			||||||
		var l protoreflect.SourceLocation
 | 
					 | 
				
			||||||
		// TODO: Validate that the path points to an actual declaration?
 | 
					 | 
				
			||||||
		l.Path = protoreflect.SourcePath(loc.GetPath())
 | 
					 | 
				
			||||||
		s := loc.GetSpan()
 | 
					 | 
				
			||||||
		switch len(s) {
 | 
					 | 
				
			||||||
		case 3:
 | 
					 | 
				
			||||||
			l.StartLine, l.StartColumn, l.EndLine, l.EndColumn = int(s[0]), int(s[1]), int(s[0]), int(s[2])
 | 
					 | 
				
			||||||
		case 4:
 | 
					 | 
				
			||||||
			l.StartLine, l.StartColumn, l.EndLine, l.EndColumn = int(s[0]), int(s[1]), int(s[2]), int(s[3])
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			return nil, errors.New("invalid span: %v", s)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		// TODO: Validate that the span information is sensible?
 | 
					 | 
				
			||||||
		// See https://github.com/protocolbuffers/protobuf/issues/6378.
 | 
					 | 
				
			||||||
		if false && (l.EndLine < l.StartLine || l.StartLine < 0 || l.StartColumn < 0 || l.EndColumn < 0 ||
 | 
					 | 
				
			||||||
			(l.StartLine == l.EndLine && l.EndColumn <= l.StartColumn)) {
 | 
					 | 
				
			||||||
			return nil, errors.New("invalid span: %v", s)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		l.LeadingDetachedComments = loc.GetLeadingDetachedComments()
 | 
					 | 
				
			||||||
		l.LeadingComments = loc.GetLeadingComments()
 | 
					 | 
				
			||||||
		l.TrailingComments = loc.GetTrailingComments()
 | 
					 | 
				
			||||||
		f.L2.Locations.List = append(f.L2.Locations.List, l)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Step 1: Allocate and derive the names for all declarations.
 | 
					 | 
				
			||||||
	// This copies all fields from the descriptor proto except:
 | 
					 | 
				
			||||||
	//	google.protobuf.FieldDescriptorProto.type_name
 | 
					 | 
				
			||||||
	//	google.protobuf.FieldDescriptorProto.default_value
 | 
					 | 
				
			||||||
	//	google.protobuf.FieldDescriptorProto.oneof_index
 | 
					 | 
				
			||||||
	//	google.protobuf.FieldDescriptorProto.extendee
 | 
					 | 
				
			||||||
	//	google.protobuf.MethodDescriptorProto.input
 | 
					 | 
				
			||||||
	//	google.protobuf.MethodDescriptorProto.output
 | 
					 | 
				
			||||||
	var err error
 | 
					 | 
				
			||||||
	sb := new(strs.Builder)
 | 
					 | 
				
			||||||
	r1 := make(descsByName)
 | 
					 | 
				
			||||||
	if f.L1.Enums.List, err = r1.initEnumDeclarations(fd.GetEnumType(), f, sb); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if f.L1.Messages.List, err = r1.initMessagesDeclarations(fd.GetMessageType(), f, sb); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if f.L1.Extensions.List, err = r1.initExtensionDeclarations(fd.GetExtension(), f, sb); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if f.L1.Services.List, err = r1.initServiceDeclarations(fd.GetService(), f, sb); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Step 2: Resolve every dependency reference not handled by step 1.
 | 
					 | 
				
			||||||
	r2 := &resolver{local: r1, remote: r, imports: imps, allowUnresolvable: o.AllowUnresolvable}
 | 
					 | 
				
			||||||
	if err := r2.resolveMessageDependencies(f.L1.Messages.List, fd.GetMessageType()); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err := r2.resolveExtensionDependencies(f.L1.Extensions.List, fd.GetExtension()); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err := r2.resolveServiceDependencies(f.L1.Services.List, fd.GetService()); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Step 3: Validate every enum, message, and extension declaration.
 | 
					 | 
				
			||||||
	if err := validateEnumDeclarations(f.L1.Enums.List, fd.GetEnumType()); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err := validateMessageDeclarations(f.L1.Messages.List, fd.GetMessageType()); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err := validateExtensionDeclarations(f.L1.Extensions.List, fd.GetExtension()); err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return f, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type importSet map[string]bool
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (is importSet) importPublic(imps protoreflect.FileImports) {
 | 
					 | 
				
			||||||
	for i := 0; i < imps.Len(); i++ {
 | 
					 | 
				
			||||||
		if imp := imps.Get(i); imp.IsPublic {
 | 
					 | 
				
			||||||
			is[imp.Path()] = true
 | 
					 | 
				
			||||||
			is.importPublic(imp.Imports())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewFiles creates a new protoregistry.Files from the provided
 | 
					 | 
				
			||||||
// FileDescriptorSet message. The descriptor set must include only
 | 
					 | 
				
			||||||
// valid files according to protobuf semantics. The returned descriptors
 | 
					 | 
				
			||||||
// are a deep copy of the input.
 | 
					 | 
				
			||||||
func (o FileOptions) NewFiles(fds *descriptorpb.FileDescriptorSet) (*protoregistry.Files, error) {
 | 
					 | 
				
			||||||
	files := make(map[string]*descriptorpb.FileDescriptorProto)
 | 
					 | 
				
			||||||
	for _, fd := range fds.File {
 | 
					 | 
				
			||||||
		if _, ok := files[fd.GetName()]; ok {
 | 
					 | 
				
			||||||
			return nil, errors.New("file appears multiple times: %q", fd.GetName())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		files[fd.GetName()] = fd
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	r := &protoregistry.Files{}
 | 
					 | 
				
			||||||
	for _, fd := range files {
 | 
					 | 
				
			||||||
		if err := o.addFileDeps(r, fd, files); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return r, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func (o FileOptions) addFileDeps(r *protoregistry.Files, fd *descriptorpb.FileDescriptorProto, files map[string]*descriptorpb.FileDescriptorProto) error {
 | 
					 | 
				
			||||||
	// Set the entry to nil while descending into a file's dependencies to detect cycles.
 | 
					 | 
				
			||||||
	files[fd.GetName()] = nil
 | 
					 | 
				
			||||||
	for _, dep := range fd.Dependency {
 | 
					 | 
				
			||||||
		depfd, ok := files[dep]
 | 
					 | 
				
			||||||
		if depfd == nil {
 | 
					 | 
				
			||||||
			if ok {
 | 
					 | 
				
			||||||
				return errors.New("import cycle in file: %q", dep)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := o.addFileDeps(r, depfd, files); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Delete the entry once dependencies are processed.
 | 
					 | 
				
			||||||
	delete(files, fd.GetName())
 | 
					 | 
				
			||||||
	f, err := o.New(fd, r)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return r.RegisterFile(f)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										248
									
								
								vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										248
									
								
								vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,248 +0,0 @@
 | 
				
			|||||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package protodesc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/errors"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/filedesc"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/strs"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/proto"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/types/descriptorpb"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type descsByName map[protoreflect.FullName]protoreflect.Descriptor
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r descsByName) initEnumDeclarations(eds []*descriptorpb.EnumDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (es []filedesc.Enum, err error) {
 | 
					 | 
				
			||||||
	es = make([]filedesc.Enum, len(eds)) // allocate up-front to ensure stable pointers
 | 
					 | 
				
			||||||
	for i, ed := range eds {
 | 
					 | 
				
			||||||
		e := &es[i]
 | 
					 | 
				
			||||||
		e.L2 = new(filedesc.EnumL2)
 | 
					 | 
				
			||||||
		if e.L0, err = r.makeBase(e, parent, ed.GetName(), i, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if opts := ed.GetOptions(); opts != nil {
 | 
					 | 
				
			||||||
			opts = proto.Clone(opts).(*descriptorpb.EnumOptions)
 | 
					 | 
				
			||||||
			e.L2.Options = func() protoreflect.ProtoMessage { return opts }
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		for _, s := range ed.GetReservedName() {
 | 
					 | 
				
			||||||
			e.L2.ReservedNames.List = append(e.L2.ReservedNames.List, protoreflect.Name(s))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		for _, rr := range ed.GetReservedRange() {
 | 
					 | 
				
			||||||
			e.L2.ReservedRanges.List = append(e.L2.ReservedRanges.List, [2]protoreflect.EnumNumber{
 | 
					 | 
				
			||||||
				protoreflect.EnumNumber(rr.GetStart()),
 | 
					 | 
				
			||||||
				protoreflect.EnumNumber(rr.GetEnd()),
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if e.L2.Values.List, err = r.initEnumValuesFromDescriptorProto(ed.GetValue(), e, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return es, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r descsByName) initEnumValuesFromDescriptorProto(vds []*descriptorpb.EnumValueDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (vs []filedesc.EnumValue, err error) {
 | 
					 | 
				
			||||||
	vs = make([]filedesc.EnumValue, len(vds)) // allocate up-front to ensure stable pointers
 | 
					 | 
				
			||||||
	for i, vd := range vds {
 | 
					 | 
				
			||||||
		v := &vs[i]
 | 
					 | 
				
			||||||
		if v.L0, err = r.makeBase(v, parent, vd.GetName(), i, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if opts := vd.GetOptions(); opts != nil {
 | 
					 | 
				
			||||||
			opts = proto.Clone(opts).(*descriptorpb.EnumValueOptions)
 | 
					 | 
				
			||||||
			v.L1.Options = func() protoreflect.ProtoMessage { return opts }
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		v.L1.Number = protoreflect.EnumNumber(vd.GetNumber())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return vs, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r descsByName) initMessagesDeclarations(mds []*descriptorpb.DescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (ms []filedesc.Message, err error) {
 | 
					 | 
				
			||||||
	ms = make([]filedesc.Message, len(mds)) // allocate up-front to ensure stable pointers
 | 
					 | 
				
			||||||
	for i, md := range mds {
 | 
					 | 
				
			||||||
		m := &ms[i]
 | 
					 | 
				
			||||||
		m.L2 = new(filedesc.MessageL2)
 | 
					 | 
				
			||||||
		if m.L0, err = r.makeBase(m, parent, md.GetName(), i, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if opts := md.GetOptions(); opts != nil {
 | 
					 | 
				
			||||||
			opts = proto.Clone(opts).(*descriptorpb.MessageOptions)
 | 
					 | 
				
			||||||
			m.L2.Options = func() protoreflect.ProtoMessage { return opts }
 | 
					 | 
				
			||||||
			m.L1.IsMapEntry = opts.GetMapEntry()
 | 
					 | 
				
			||||||
			m.L1.IsMessageSet = opts.GetMessageSetWireFormat()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		for _, s := range md.GetReservedName() {
 | 
					 | 
				
			||||||
			m.L2.ReservedNames.List = append(m.L2.ReservedNames.List, protoreflect.Name(s))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		for _, rr := range md.GetReservedRange() {
 | 
					 | 
				
			||||||
			m.L2.ReservedRanges.List = append(m.L2.ReservedRanges.List, [2]protoreflect.FieldNumber{
 | 
					 | 
				
			||||||
				protoreflect.FieldNumber(rr.GetStart()),
 | 
					 | 
				
			||||||
				protoreflect.FieldNumber(rr.GetEnd()),
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		for _, xr := range md.GetExtensionRange() {
 | 
					 | 
				
			||||||
			m.L2.ExtensionRanges.List = append(m.L2.ExtensionRanges.List, [2]protoreflect.FieldNumber{
 | 
					 | 
				
			||||||
				protoreflect.FieldNumber(xr.GetStart()),
 | 
					 | 
				
			||||||
				protoreflect.FieldNumber(xr.GetEnd()),
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
			var optsFunc func() protoreflect.ProtoMessage
 | 
					 | 
				
			||||||
			if opts := xr.GetOptions(); opts != nil {
 | 
					 | 
				
			||||||
				opts = proto.Clone(opts).(*descriptorpb.ExtensionRangeOptions)
 | 
					 | 
				
			||||||
				optsFunc = func() protoreflect.ProtoMessage { return opts }
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			m.L2.ExtensionRangeOptions = append(m.L2.ExtensionRangeOptions, optsFunc)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if m.L2.Fields.List, err = r.initFieldsFromDescriptorProto(md.GetField(), m, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if m.L2.Oneofs.List, err = r.initOneofsFromDescriptorProto(md.GetOneofDecl(), m, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if m.L1.Enums.List, err = r.initEnumDeclarations(md.GetEnumType(), m, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if m.L1.Messages.List, err = r.initMessagesDeclarations(md.GetNestedType(), m, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if m.L1.Extensions.List, err = r.initExtensionDeclarations(md.GetExtension(), m, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return ms, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r descsByName) initFieldsFromDescriptorProto(fds []*descriptorpb.FieldDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (fs []filedesc.Field, err error) {
 | 
					 | 
				
			||||||
	fs = make([]filedesc.Field, len(fds)) // allocate up-front to ensure stable pointers
 | 
					 | 
				
			||||||
	for i, fd := range fds {
 | 
					 | 
				
			||||||
		f := &fs[i]
 | 
					 | 
				
			||||||
		if f.L0, err = r.makeBase(f, parent, fd.GetName(), i, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		f.L1.IsProto3Optional = fd.GetProto3Optional()
 | 
					 | 
				
			||||||
		if opts := fd.GetOptions(); opts != nil {
 | 
					 | 
				
			||||||
			opts = proto.Clone(opts).(*descriptorpb.FieldOptions)
 | 
					 | 
				
			||||||
			f.L1.Options = func() protoreflect.ProtoMessage { return opts }
 | 
					 | 
				
			||||||
			f.L1.IsWeak = opts.GetWeak()
 | 
					 | 
				
			||||||
			f.L1.HasPacked = opts.Packed != nil
 | 
					 | 
				
			||||||
			f.L1.IsPacked = opts.GetPacked()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		f.L1.Number = protoreflect.FieldNumber(fd.GetNumber())
 | 
					 | 
				
			||||||
		f.L1.Cardinality = protoreflect.Cardinality(fd.GetLabel())
 | 
					 | 
				
			||||||
		if fd.Type != nil {
 | 
					 | 
				
			||||||
			f.L1.Kind = protoreflect.Kind(fd.GetType())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if fd.JsonName != nil {
 | 
					 | 
				
			||||||
			f.L1.StringName.InitJSON(fd.GetJsonName())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return fs, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r descsByName) initOneofsFromDescriptorProto(ods []*descriptorpb.OneofDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (os []filedesc.Oneof, err error) {
 | 
					 | 
				
			||||||
	os = make([]filedesc.Oneof, len(ods)) // allocate up-front to ensure stable pointers
 | 
					 | 
				
			||||||
	for i, od := range ods {
 | 
					 | 
				
			||||||
		o := &os[i]
 | 
					 | 
				
			||||||
		if o.L0, err = r.makeBase(o, parent, od.GetName(), i, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if opts := od.GetOptions(); opts != nil {
 | 
					 | 
				
			||||||
			opts = proto.Clone(opts).(*descriptorpb.OneofOptions)
 | 
					 | 
				
			||||||
			o.L1.Options = func() protoreflect.ProtoMessage { return opts }
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return os, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r descsByName) initExtensionDeclarations(xds []*descriptorpb.FieldDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (xs []filedesc.Extension, err error) {
 | 
					 | 
				
			||||||
	xs = make([]filedesc.Extension, len(xds)) // allocate up-front to ensure stable pointers
 | 
					 | 
				
			||||||
	for i, xd := range xds {
 | 
					 | 
				
			||||||
		x := &xs[i]
 | 
					 | 
				
			||||||
		x.L2 = new(filedesc.ExtensionL2)
 | 
					 | 
				
			||||||
		if x.L0, err = r.makeBase(x, parent, xd.GetName(), i, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if opts := xd.GetOptions(); opts != nil {
 | 
					 | 
				
			||||||
			opts = proto.Clone(opts).(*descriptorpb.FieldOptions)
 | 
					 | 
				
			||||||
			x.L2.Options = func() protoreflect.ProtoMessage { return opts }
 | 
					 | 
				
			||||||
			x.L2.IsPacked = opts.GetPacked()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		x.L1.Number = protoreflect.FieldNumber(xd.GetNumber())
 | 
					 | 
				
			||||||
		x.L1.Cardinality = protoreflect.Cardinality(xd.GetLabel())
 | 
					 | 
				
			||||||
		if xd.Type != nil {
 | 
					 | 
				
			||||||
			x.L1.Kind = protoreflect.Kind(xd.GetType())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if xd.JsonName != nil {
 | 
					 | 
				
			||||||
			x.L2.StringName.InitJSON(xd.GetJsonName())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return xs, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r descsByName) initServiceDeclarations(sds []*descriptorpb.ServiceDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (ss []filedesc.Service, err error) {
 | 
					 | 
				
			||||||
	ss = make([]filedesc.Service, len(sds)) // allocate up-front to ensure stable pointers
 | 
					 | 
				
			||||||
	for i, sd := range sds {
 | 
					 | 
				
			||||||
		s := &ss[i]
 | 
					 | 
				
			||||||
		s.L2 = new(filedesc.ServiceL2)
 | 
					 | 
				
			||||||
		if s.L0, err = r.makeBase(s, parent, sd.GetName(), i, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if opts := sd.GetOptions(); opts != nil {
 | 
					 | 
				
			||||||
			opts = proto.Clone(opts).(*descriptorpb.ServiceOptions)
 | 
					 | 
				
			||||||
			s.L2.Options = func() protoreflect.ProtoMessage { return opts }
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if s.L2.Methods.List, err = r.initMethodsFromDescriptorProto(sd.GetMethod(), s, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return ss, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r descsByName) initMethodsFromDescriptorProto(mds []*descriptorpb.MethodDescriptorProto, parent protoreflect.Descriptor, sb *strs.Builder) (ms []filedesc.Method, err error) {
 | 
					 | 
				
			||||||
	ms = make([]filedesc.Method, len(mds)) // allocate up-front to ensure stable pointers
 | 
					 | 
				
			||||||
	for i, md := range mds {
 | 
					 | 
				
			||||||
		m := &ms[i]
 | 
					 | 
				
			||||||
		if m.L0, err = r.makeBase(m, parent, md.GetName(), i, sb); err != nil {
 | 
					 | 
				
			||||||
			return nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if opts := md.GetOptions(); opts != nil {
 | 
					 | 
				
			||||||
			opts = proto.Clone(opts).(*descriptorpb.MethodOptions)
 | 
					 | 
				
			||||||
			m.L1.Options = func() protoreflect.ProtoMessage { return opts }
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		m.L1.IsStreamingClient = md.GetClientStreaming()
 | 
					 | 
				
			||||||
		m.L1.IsStreamingServer = md.GetServerStreaming()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return ms, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r descsByName) makeBase(child, parent protoreflect.Descriptor, name string, idx int, sb *strs.Builder) (filedesc.BaseL0, error) {
 | 
					 | 
				
			||||||
	if !protoreflect.Name(name).IsValid() {
 | 
					 | 
				
			||||||
		return filedesc.BaseL0{}, errors.New("descriptor %q has an invalid nested name: %q", parent.FullName(), name)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Derive the full name of the child.
 | 
					 | 
				
			||||||
	// Note that enum values are a sibling to the enum parent in the namespace.
 | 
					 | 
				
			||||||
	var fullName protoreflect.FullName
 | 
					 | 
				
			||||||
	if _, ok := parent.(protoreflect.EnumDescriptor); ok {
 | 
					 | 
				
			||||||
		fullName = sb.AppendFullName(parent.FullName().Parent(), protoreflect.Name(name))
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		fullName = sb.AppendFullName(parent.FullName(), protoreflect.Name(name))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if _, ok := r[fullName]; ok {
 | 
					 | 
				
			||||||
		return filedesc.BaseL0{}, errors.New("descriptor %q already declared", fullName)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	r[fullName] = child
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// TODO: Verify that the full name does not already exist in the resolver?
 | 
					 | 
				
			||||||
	// This is not as critical since most usages of NewFile will register
 | 
					 | 
				
			||||||
	// the created file back into the registry, which will perform this check.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return filedesc.BaseL0{
 | 
					 | 
				
			||||||
		FullName:   fullName,
 | 
					 | 
				
			||||||
		ParentFile: parent.ParentFile().(*filedesc.File),
 | 
					 | 
				
			||||||
		Parent:     parent,
 | 
					 | 
				
			||||||
		Index:      idx,
 | 
					 | 
				
			||||||
	}, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										286
									
								
								vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										286
									
								
								vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,286 +0,0 @@
 | 
				
			|||||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package protodesc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/encoding/defval"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/errors"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/filedesc"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoregistry"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/types/descriptorpb"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// resolver is a wrapper around a local registry of declarations within the file
 | 
					 | 
				
			||||||
// and the remote resolver. The remote resolver is restricted to only return
 | 
					 | 
				
			||||||
// descriptors that have been imported.
 | 
					 | 
				
			||||||
type resolver struct {
 | 
					 | 
				
			||||||
	local   descsByName
 | 
					 | 
				
			||||||
	remote  Resolver
 | 
					 | 
				
			||||||
	imports importSet
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	allowUnresolvable bool
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r *resolver) resolveMessageDependencies(ms []filedesc.Message, mds []*descriptorpb.DescriptorProto) (err error) {
 | 
					 | 
				
			||||||
	for i, md := range mds {
 | 
					 | 
				
			||||||
		m := &ms[i]
 | 
					 | 
				
			||||||
		for j, fd := range md.GetField() {
 | 
					 | 
				
			||||||
			f := &m.L2.Fields.List[j]
 | 
					 | 
				
			||||||
			if f.L1.Cardinality == protoreflect.Required {
 | 
					 | 
				
			||||||
				m.L2.RequiredNumbers.List = append(m.L2.RequiredNumbers.List, f.L1.Number)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if fd.OneofIndex != nil {
 | 
					 | 
				
			||||||
				k := int(fd.GetOneofIndex())
 | 
					 | 
				
			||||||
				if !(0 <= k && k < len(md.GetOneofDecl())) {
 | 
					 | 
				
			||||||
					return errors.New("message field %q has an invalid oneof index: %d", f.FullName(), k)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				o := &m.L2.Oneofs.List[k]
 | 
					 | 
				
			||||||
				f.L1.ContainingOneof = o
 | 
					 | 
				
			||||||
				o.L1.Fields.List = append(o.L1.Fields.List, f)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if f.L1.Kind, f.L1.Enum, f.L1.Message, err = r.findTarget(f.Kind(), f.Parent().FullName(), partialName(fd.GetTypeName()), f.IsWeak()); err != nil {
 | 
					 | 
				
			||||||
				return errors.New("message field %q cannot resolve type: %v", f.FullName(), err)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if fd.DefaultValue != nil {
 | 
					 | 
				
			||||||
				v, ev, err := unmarshalDefault(fd.GetDefaultValue(), f, r.allowUnresolvable)
 | 
					 | 
				
			||||||
				if err != nil {
 | 
					 | 
				
			||||||
					return errors.New("message field %q has invalid default: %v", f.FullName(), err)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				f.L1.Default = filedesc.DefaultValue(v, ev)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if err := r.resolveMessageDependencies(m.L1.Messages.List, md.GetNestedType()); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := r.resolveExtensionDependencies(m.L1.Extensions.List, md.GetExtension()); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r *resolver) resolveExtensionDependencies(xs []filedesc.Extension, xds []*descriptorpb.FieldDescriptorProto) (err error) {
 | 
					 | 
				
			||||||
	for i, xd := range xds {
 | 
					 | 
				
			||||||
		x := &xs[i]
 | 
					 | 
				
			||||||
		if x.L1.Extendee, err = r.findMessageDescriptor(x.Parent().FullName(), partialName(xd.GetExtendee()), false); err != nil {
 | 
					 | 
				
			||||||
			return errors.New("extension field %q cannot resolve extendee: %v", x.FullName(), err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if x.L1.Kind, x.L2.Enum, x.L2.Message, err = r.findTarget(x.Kind(), x.Parent().FullName(), partialName(xd.GetTypeName()), false); err != nil {
 | 
					 | 
				
			||||||
			return errors.New("extension field %q cannot resolve type: %v", x.FullName(), err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if xd.DefaultValue != nil {
 | 
					 | 
				
			||||||
			v, ev, err := unmarshalDefault(xd.GetDefaultValue(), x, r.allowUnresolvable)
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				return errors.New("extension field %q has invalid default: %v", x.FullName(), err)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			x.L2.Default = filedesc.DefaultValue(v, ev)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r *resolver) resolveServiceDependencies(ss []filedesc.Service, sds []*descriptorpb.ServiceDescriptorProto) (err error) {
 | 
					 | 
				
			||||||
	for i, sd := range sds {
 | 
					 | 
				
			||||||
		s := &ss[i]
 | 
					 | 
				
			||||||
		for j, md := range sd.GetMethod() {
 | 
					 | 
				
			||||||
			m := &s.L2.Methods.List[j]
 | 
					 | 
				
			||||||
			m.L1.Input, err = r.findMessageDescriptor(m.Parent().FullName(), partialName(md.GetInputType()), false)
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				return errors.New("service method %q cannot resolve input: %v", m.FullName(), err)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			m.L1.Output, err = r.findMessageDescriptor(s.FullName(), partialName(md.GetOutputType()), false)
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				return errors.New("service method %q cannot resolve output: %v", m.FullName(), err)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// findTarget finds an enum or message descriptor if k is an enum, message,
 | 
					 | 
				
			||||||
// group, or unknown. If unknown, and the name could be resolved, the kind
 | 
					 | 
				
			||||||
// returned kind is set based on the type of the resolved descriptor.
 | 
					 | 
				
			||||||
func (r *resolver) findTarget(k protoreflect.Kind, scope protoreflect.FullName, ref partialName, isWeak bool) (protoreflect.Kind, protoreflect.EnumDescriptor, protoreflect.MessageDescriptor, error) {
 | 
					 | 
				
			||||||
	switch k {
 | 
					 | 
				
			||||||
	case protoreflect.EnumKind:
 | 
					 | 
				
			||||||
		ed, err := r.findEnumDescriptor(scope, ref, isWeak)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return 0, nil, nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return k, ed, nil, nil
 | 
					 | 
				
			||||||
	case protoreflect.MessageKind, protoreflect.GroupKind:
 | 
					 | 
				
			||||||
		md, err := r.findMessageDescriptor(scope, ref, isWeak)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return 0, nil, nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return k, nil, md, nil
 | 
					 | 
				
			||||||
	case 0:
 | 
					 | 
				
			||||||
		// Handle unspecified kinds (possible with parsers that operate
 | 
					 | 
				
			||||||
		// on a per-file basis without knowledge of dependencies).
 | 
					 | 
				
			||||||
		d, err := r.findDescriptor(scope, ref)
 | 
					 | 
				
			||||||
		if err == protoregistry.NotFound && (r.allowUnresolvable || isWeak) {
 | 
					 | 
				
			||||||
			return k, filedesc.PlaceholderEnum(ref.FullName()), filedesc.PlaceholderMessage(ref.FullName()), nil
 | 
					 | 
				
			||||||
		} else if err == protoregistry.NotFound {
 | 
					 | 
				
			||||||
			return 0, nil, nil, errors.New("%q not found", ref.FullName())
 | 
					 | 
				
			||||||
		} else if err != nil {
 | 
					 | 
				
			||||||
			return 0, nil, nil, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		switch d := d.(type) {
 | 
					 | 
				
			||||||
		case protoreflect.EnumDescriptor:
 | 
					 | 
				
			||||||
			return protoreflect.EnumKind, d, nil, nil
 | 
					 | 
				
			||||||
		case protoreflect.MessageDescriptor:
 | 
					 | 
				
			||||||
			return protoreflect.MessageKind, nil, d, nil
 | 
					 | 
				
			||||||
		default:
 | 
					 | 
				
			||||||
			return 0, nil, nil, errors.New("unknown kind")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		if ref != "" {
 | 
					 | 
				
			||||||
			return 0, nil, nil, errors.New("target name cannot be specified for %v", k)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !k.IsValid() {
 | 
					 | 
				
			||||||
			return 0, nil, nil, errors.New("invalid kind: %d", k)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return k, nil, nil, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// findDescriptor finds the descriptor by name,
 | 
					 | 
				
			||||||
// which may be a relative name within some scope.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Suppose the scope was "fizz.buzz" and the reference was "Foo.Bar",
 | 
					 | 
				
			||||||
// then the following full names are searched:
 | 
					 | 
				
			||||||
//	* fizz.buzz.Foo.Bar
 | 
					 | 
				
			||||||
//	* fizz.Foo.Bar
 | 
					 | 
				
			||||||
//	* Foo.Bar
 | 
					 | 
				
			||||||
func (r *resolver) findDescriptor(scope protoreflect.FullName, ref partialName) (protoreflect.Descriptor, error) {
 | 
					 | 
				
			||||||
	if !ref.IsValid() {
 | 
					 | 
				
			||||||
		return nil, errors.New("invalid name reference: %q", ref)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if ref.IsFull() {
 | 
					 | 
				
			||||||
		scope, ref = "", ref[1:]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	var foundButNotImported protoreflect.Descriptor
 | 
					 | 
				
			||||||
	for {
 | 
					 | 
				
			||||||
		// Derive the full name to search.
 | 
					 | 
				
			||||||
		s := protoreflect.FullName(ref)
 | 
					 | 
				
			||||||
		if scope != "" {
 | 
					 | 
				
			||||||
			s = scope + "." + s
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Check the current file for the descriptor.
 | 
					 | 
				
			||||||
		if d, ok := r.local[s]; ok {
 | 
					 | 
				
			||||||
			return d, nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Check the remote registry for the descriptor.
 | 
					 | 
				
			||||||
		d, err := r.remote.FindDescriptorByName(s)
 | 
					 | 
				
			||||||
		if err == nil {
 | 
					 | 
				
			||||||
			// Only allow descriptors covered by one of the imports.
 | 
					 | 
				
			||||||
			if r.imports[d.ParentFile().Path()] {
 | 
					 | 
				
			||||||
				return d, nil
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			foundButNotImported = d
 | 
					 | 
				
			||||||
		} else if err != protoregistry.NotFound {
 | 
					 | 
				
			||||||
			return nil, errors.Wrap(err, "%q", s)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Continue on at a higher level of scoping.
 | 
					 | 
				
			||||||
		if scope == "" {
 | 
					 | 
				
			||||||
			if d := foundButNotImported; d != nil {
 | 
					 | 
				
			||||||
				return nil, errors.New("resolved %q, but %q is not imported", d.FullName(), d.ParentFile().Path())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return nil, protoregistry.NotFound
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		scope = scope.Parent()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r *resolver) findEnumDescriptor(scope protoreflect.FullName, ref partialName, isWeak bool) (protoreflect.EnumDescriptor, error) {
 | 
					 | 
				
			||||||
	d, err := r.findDescriptor(scope, ref)
 | 
					 | 
				
			||||||
	if err == protoregistry.NotFound && (r.allowUnresolvable || isWeak) {
 | 
					 | 
				
			||||||
		return filedesc.PlaceholderEnum(ref.FullName()), nil
 | 
					 | 
				
			||||||
	} else if err == protoregistry.NotFound {
 | 
					 | 
				
			||||||
		return nil, errors.New("%q not found", ref.FullName())
 | 
					 | 
				
			||||||
	} else if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ed, ok := d.(protoreflect.EnumDescriptor)
 | 
					 | 
				
			||||||
	if !ok {
 | 
					 | 
				
			||||||
		return nil, errors.New("resolved %q, but it is not an enum", d.FullName())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return ed, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (r *resolver) findMessageDescriptor(scope protoreflect.FullName, ref partialName, isWeak bool) (protoreflect.MessageDescriptor, error) {
 | 
					 | 
				
			||||||
	d, err := r.findDescriptor(scope, ref)
 | 
					 | 
				
			||||||
	if err == protoregistry.NotFound && (r.allowUnresolvable || isWeak) {
 | 
					 | 
				
			||||||
		return filedesc.PlaceholderMessage(ref.FullName()), nil
 | 
					 | 
				
			||||||
	} else if err == protoregistry.NotFound {
 | 
					 | 
				
			||||||
		return nil, errors.New("%q not found", ref.FullName())
 | 
					 | 
				
			||||||
	} else if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	md, ok := d.(protoreflect.MessageDescriptor)
 | 
					 | 
				
			||||||
	if !ok {
 | 
					 | 
				
			||||||
		return nil, errors.New("resolved %q, but it is not an message", d.FullName())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return md, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// partialName is the partial name. A leading dot means that the name is full,
 | 
					 | 
				
			||||||
// otherwise the name is relative to some current scope.
 | 
					 | 
				
			||||||
// See google.protobuf.FieldDescriptorProto.type_name.
 | 
					 | 
				
			||||||
type partialName string
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (s partialName) IsFull() bool {
 | 
					 | 
				
			||||||
	return len(s) > 0 && s[0] == '.'
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (s partialName) IsValid() bool {
 | 
					 | 
				
			||||||
	if s.IsFull() {
 | 
					 | 
				
			||||||
		return protoreflect.FullName(s[1:]).IsValid()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return protoreflect.FullName(s).IsValid()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const unknownPrefix = "*."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// FullName converts the partial name to a full name on a best-effort basis.
 | 
					 | 
				
			||||||
// If relative, it creates an invalid full name, using a "*." prefix
 | 
					 | 
				
			||||||
// to indicate that the start of the full name is unknown.
 | 
					 | 
				
			||||||
func (s partialName) FullName() protoreflect.FullName {
 | 
					 | 
				
			||||||
	if s.IsFull() {
 | 
					 | 
				
			||||||
		return protoreflect.FullName(s[1:])
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return protoreflect.FullName(unknownPrefix + s)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func unmarshalDefault(s string, fd protoreflect.FieldDescriptor, allowUnresolvable bool) (protoreflect.Value, protoreflect.EnumValueDescriptor, error) {
 | 
					 | 
				
			||||||
	var evs protoreflect.EnumValueDescriptors
 | 
					 | 
				
			||||||
	if fd.Enum() != nil {
 | 
					 | 
				
			||||||
		evs = fd.Enum().Values()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	v, ev, err := defval.Unmarshal(s, fd.Kind(), evs, defval.Descriptor)
 | 
					 | 
				
			||||||
	if err != nil && allowUnresolvable && evs != nil && protoreflect.Name(s).IsValid() {
 | 
					 | 
				
			||||||
		v = protoreflect.ValueOfEnum(0)
 | 
					 | 
				
			||||||
		if evs.Len() > 0 {
 | 
					 | 
				
			||||||
			v = protoreflect.ValueOfEnum(evs.Get(0).Number())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ev = filedesc.PlaceholderEnumValue(fd.Enum().FullName().Parent().Append(protoreflect.Name(s)))
 | 
					 | 
				
			||||||
	} else if err != nil {
 | 
					 | 
				
			||||||
		return v, ev, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if fd.Syntax() == protoreflect.Proto3 {
 | 
					 | 
				
			||||||
		return v, ev, errors.New("cannot be specified under proto3 semantics")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if fd.Kind() == protoreflect.MessageKind || fd.Kind() == protoreflect.GroupKind || fd.Cardinality() == protoreflect.Repeated {
 | 
					 | 
				
			||||||
		return v, ev, errors.New("cannot be specified on composite types")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return v, ev, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										374
									
								
								vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										374
									
								
								vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,374 +0,0 @@
 | 
				
			|||||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package protodesc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
	"unicode"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/encoding/protowire"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/errors"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/filedesc"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/flags"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/genid"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/strs"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/types/descriptorpb"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func validateEnumDeclarations(es []filedesc.Enum, eds []*descriptorpb.EnumDescriptorProto) error {
 | 
					 | 
				
			||||||
	for i, ed := range eds {
 | 
					 | 
				
			||||||
		e := &es[i]
 | 
					 | 
				
			||||||
		if err := e.L2.ReservedNames.CheckValid(); err != nil {
 | 
					 | 
				
			||||||
			return errors.New("enum %q reserved names has %v", e.FullName(), err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := e.L2.ReservedRanges.CheckValid(); err != nil {
 | 
					 | 
				
			||||||
			return errors.New("enum %q reserved ranges has %v", e.FullName(), err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if len(ed.GetValue()) == 0 {
 | 
					 | 
				
			||||||
			return errors.New("enum %q must contain at least one value declaration", e.FullName())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		allowAlias := ed.GetOptions().GetAllowAlias()
 | 
					 | 
				
			||||||
		foundAlias := false
 | 
					 | 
				
			||||||
		for i := 0; i < e.Values().Len(); i++ {
 | 
					 | 
				
			||||||
			v1 := e.Values().Get(i)
 | 
					 | 
				
			||||||
			if v2 := e.Values().ByNumber(v1.Number()); v1 != v2 {
 | 
					 | 
				
			||||||
				foundAlias = true
 | 
					 | 
				
			||||||
				if !allowAlias {
 | 
					 | 
				
			||||||
					return errors.New("enum %q has conflicting non-aliased values on number %d: %q with %q", e.FullName(), v1.Number(), v1.Name(), v2.Name())
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if allowAlias && !foundAlias {
 | 
					 | 
				
			||||||
			return errors.New("enum %q allows aliases, but none were found", e.FullName())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if e.Syntax() == protoreflect.Proto3 {
 | 
					 | 
				
			||||||
			if v := e.Values().Get(0); v.Number() != 0 {
 | 
					 | 
				
			||||||
				return errors.New("enum %q using proto3 semantics must have zero number for the first value", v.FullName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			// Verify that value names in proto3 do not conflict if the
 | 
					 | 
				
			||||||
			// case-insensitive prefix is removed.
 | 
					 | 
				
			||||||
			// See protoc v3.8.0: src/google/protobuf/descriptor.cc:4991-5055
 | 
					 | 
				
			||||||
			names := map[string]protoreflect.EnumValueDescriptor{}
 | 
					 | 
				
			||||||
			prefix := strings.Replace(strings.ToLower(string(e.Name())), "_", "", -1)
 | 
					 | 
				
			||||||
			for i := 0; i < e.Values().Len(); i++ {
 | 
					 | 
				
			||||||
				v1 := e.Values().Get(i)
 | 
					 | 
				
			||||||
				s := strs.EnumValueName(strs.TrimEnumPrefix(string(v1.Name()), prefix))
 | 
					 | 
				
			||||||
				if v2, ok := names[s]; ok && v1.Number() != v2.Number() {
 | 
					 | 
				
			||||||
					return errors.New("enum %q using proto3 semantics has conflict: %q with %q", e.FullName(), v1.Name(), v2.Name())
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				names[s] = v1
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for j, vd := range ed.GetValue() {
 | 
					 | 
				
			||||||
			v := &e.L2.Values.List[j]
 | 
					 | 
				
			||||||
			if vd.Number == nil {
 | 
					 | 
				
			||||||
				return errors.New("enum value %q must have a specified number", v.FullName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if e.L2.ReservedNames.Has(v.Name()) {
 | 
					 | 
				
			||||||
				return errors.New("enum value %q must not use reserved name", v.FullName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if e.L2.ReservedRanges.Has(v.Number()) {
 | 
					 | 
				
			||||||
				return errors.New("enum value %q must not use reserved number %d", v.FullName(), v.Number())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func validateMessageDeclarations(ms []filedesc.Message, mds []*descriptorpb.DescriptorProto) error {
 | 
					 | 
				
			||||||
	for i, md := range mds {
 | 
					 | 
				
			||||||
		m := &ms[i]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Handle the message descriptor itself.
 | 
					 | 
				
			||||||
		isMessageSet := md.GetOptions().GetMessageSetWireFormat()
 | 
					 | 
				
			||||||
		if err := m.L2.ReservedNames.CheckValid(); err != nil {
 | 
					 | 
				
			||||||
			return errors.New("message %q reserved names has %v", m.FullName(), err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := m.L2.ReservedRanges.CheckValid(isMessageSet); err != nil {
 | 
					 | 
				
			||||||
			return errors.New("message %q reserved ranges has %v", m.FullName(), err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := m.L2.ExtensionRanges.CheckValid(isMessageSet); err != nil {
 | 
					 | 
				
			||||||
			return errors.New("message %q extension ranges has %v", m.FullName(), err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := (*filedesc.FieldRanges).CheckOverlap(&m.L2.ReservedRanges, &m.L2.ExtensionRanges); err != nil {
 | 
					 | 
				
			||||||
			return errors.New("message %q reserved and extension ranges has %v", m.FullName(), err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		for i := 0; i < m.Fields().Len(); i++ {
 | 
					 | 
				
			||||||
			f1 := m.Fields().Get(i)
 | 
					 | 
				
			||||||
			if f2 := m.Fields().ByNumber(f1.Number()); f1 != f2 {
 | 
					 | 
				
			||||||
				return errors.New("message %q has conflicting fields: %q with %q", m.FullName(), f1.Name(), f2.Name())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if isMessageSet && !flags.ProtoLegacy {
 | 
					 | 
				
			||||||
			return errors.New("message %q is a MessageSet, which is a legacy proto1 feature that is no longer supported", m.FullName())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if isMessageSet && (m.Syntax() != protoreflect.Proto2 || m.Fields().Len() > 0 || m.ExtensionRanges().Len() == 0) {
 | 
					 | 
				
			||||||
			return errors.New("message %q is an invalid proto1 MessageSet", m.FullName())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if m.Syntax() == protoreflect.Proto3 {
 | 
					 | 
				
			||||||
			if m.ExtensionRanges().Len() > 0 {
 | 
					 | 
				
			||||||
				return errors.New("message %q using proto3 semantics cannot have extension ranges", m.FullName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			// Verify that field names in proto3 do not conflict if lowercased
 | 
					 | 
				
			||||||
			// with all underscores removed.
 | 
					 | 
				
			||||||
			// See protoc v3.8.0: src/google/protobuf/descriptor.cc:5830-5847
 | 
					 | 
				
			||||||
			names := map[string]protoreflect.FieldDescriptor{}
 | 
					 | 
				
			||||||
			for i := 0; i < m.Fields().Len(); i++ {
 | 
					 | 
				
			||||||
				f1 := m.Fields().Get(i)
 | 
					 | 
				
			||||||
				s := strings.Replace(strings.ToLower(string(f1.Name())), "_", "", -1)
 | 
					 | 
				
			||||||
				if f2, ok := names[s]; ok {
 | 
					 | 
				
			||||||
					return errors.New("message %q using proto3 semantics has conflict: %q with %q", m.FullName(), f1.Name(), f2.Name())
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				names[s] = f1
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for j, fd := range md.GetField() {
 | 
					 | 
				
			||||||
			f := &m.L2.Fields.List[j]
 | 
					 | 
				
			||||||
			if m.L2.ReservedNames.Has(f.Name()) {
 | 
					 | 
				
			||||||
				return errors.New("message field %q must not use reserved name", f.FullName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if !f.Number().IsValid() {
 | 
					 | 
				
			||||||
				return errors.New("message field %q has an invalid number: %d", f.FullName(), f.Number())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if !f.Cardinality().IsValid() {
 | 
					 | 
				
			||||||
				return errors.New("message field %q has an invalid cardinality: %d", f.FullName(), f.Cardinality())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if m.L2.ReservedRanges.Has(f.Number()) {
 | 
					 | 
				
			||||||
				return errors.New("message field %q must not use reserved number %d", f.FullName(), f.Number())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if m.L2.ExtensionRanges.Has(f.Number()) {
 | 
					 | 
				
			||||||
				return errors.New("message field %q with number %d in extension range", f.FullName(), f.Number())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if fd.Extendee != nil {
 | 
					 | 
				
			||||||
				return errors.New("message field %q may not have extendee: %q", f.FullName(), fd.GetExtendee())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if f.L1.IsProto3Optional {
 | 
					 | 
				
			||||||
				if f.Syntax() != protoreflect.Proto3 {
 | 
					 | 
				
			||||||
					return errors.New("message field %q under proto3 optional semantics must be specified in the proto3 syntax", f.FullName())
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if f.Cardinality() != protoreflect.Optional {
 | 
					 | 
				
			||||||
					return errors.New("message field %q under proto3 optional semantics must have optional cardinality", f.FullName())
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if f.ContainingOneof() != nil && f.ContainingOneof().Fields().Len() != 1 {
 | 
					 | 
				
			||||||
					return errors.New("message field %q under proto3 optional semantics must be within a single element oneof", f.FullName())
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if f.IsWeak() && !flags.ProtoLegacy {
 | 
					 | 
				
			||||||
				return errors.New("message field %q is a weak field, which is a legacy proto1 feature that is no longer supported", f.FullName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if f.IsWeak() && (f.Syntax() != protoreflect.Proto2 || !isOptionalMessage(f) || f.ContainingOneof() != nil) {
 | 
					 | 
				
			||||||
				return errors.New("message field %q may only be weak for an optional message", f.FullName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if f.IsPacked() && !isPackable(f) {
 | 
					 | 
				
			||||||
				return errors.New("message field %q is not packable", f.FullName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if err := checkValidGroup(f); err != nil {
 | 
					 | 
				
			||||||
				return errors.New("message field %q is an invalid group: %v", f.FullName(), err)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if err := checkValidMap(f); err != nil {
 | 
					 | 
				
			||||||
				return errors.New("message field %q is an invalid map: %v", f.FullName(), err)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if f.Syntax() == protoreflect.Proto3 {
 | 
					 | 
				
			||||||
				if f.Cardinality() == protoreflect.Required {
 | 
					 | 
				
			||||||
					return errors.New("message field %q using proto3 semantics cannot be required", f.FullName())
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if f.Enum() != nil && !f.Enum().IsPlaceholder() && f.Enum().Syntax() != protoreflect.Proto3 {
 | 
					 | 
				
			||||||
					return errors.New("message field %q using proto3 semantics may only depend on a proto3 enum", f.FullName())
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		seenSynthetic := false // synthetic oneofs for proto3 optional must come after real oneofs
 | 
					 | 
				
			||||||
		for j := range md.GetOneofDecl() {
 | 
					 | 
				
			||||||
			o := &m.L2.Oneofs.List[j]
 | 
					 | 
				
			||||||
			if o.Fields().Len() == 0 {
 | 
					 | 
				
			||||||
				return errors.New("message oneof %q must contain at least one field declaration", o.FullName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if n := o.Fields().Len(); n-1 != (o.Fields().Get(n-1).Index() - o.Fields().Get(0).Index()) {
 | 
					 | 
				
			||||||
				return errors.New("message oneof %q must have consecutively declared fields", o.FullName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if o.IsSynthetic() {
 | 
					 | 
				
			||||||
				seenSynthetic = true
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if !o.IsSynthetic() && seenSynthetic {
 | 
					 | 
				
			||||||
				return errors.New("message oneof %q must be declared before synthetic oneofs", o.FullName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			for i := 0; i < o.Fields().Len(); i++ {
 | 
					 | 
				
			||||||
				f := o.Fields().Get(i)
 | 
					 | 
				
			||||||
				if f.Cardinality() != protoreflect.Optional {
 | 
					 | 
				
			||||||
					return errors.New("message field %q belongs in a oneof and must be optional", f.FullName())
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if f.IsWeak() {
 | 
					 | 
				
			||||||
					return errors.New("message field %q belongs in a oneof and must not be a weak reference", f.FullName())
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if err := validateEnumDeclarations(m.L1.Enums.List, md.GetEnumType()); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := validateMessageDeclarations(m.L1.Messages.List, md.GetNestedType()); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := validateExtensionDeclarations(m.L1.Extensions.List, md.GetExtension()); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func validateExtensionDeclarations(xs []filedesc.Extension, xds []*descriptorpb.FieldDescriptorProto) error {
 | 
					 | 
				
			||||||
	for i, xd := range xds {
 | 
					 | 
				
			||||||
		x := &xs[i]
 | 
					 | 
				
			||||||
		// NOTE: Avoid using the IsValid method since extensions to MessageSet
 | 
					 | 
				
			||||||
		// may have a field number higher than normal. This check only verifies
 | 
					 | 
				
			||||||
		// that the number is not negative or reserved. We check again later
 | 
					 | 
				
			||||||
		// if we know that the extendee is definitely not a MessageSet.
 | 
					 | 
				
			||||||
		if n := x.Number(); n < 0 || (protowire.FirstReservedNumber <= n && n <= protowire.LastReservedNumber) {
 | 
					 | 
				
			||||||
			return errors.New("extension field %q has an invalid number: %d", x.FullName(), x.Number())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if !x.Cardinality().IsValid() || x.Cardinality() == protoreflect.Required {
 | 
					 | 
				
			||||||
			return errors.New("extension field %q has an invalid cardinality: %d", x.FullName(), x.Cardinality())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if xd.JsonName != nil {
 | 
					 | 
				
			||||||
			// A bug in older versions of protoc would always populate the
 | 
					 | 
				
			||||||
			// "json_name" option for extensions when it is meaningless.
 | 
					 | 
				
			||||||
			// When it did so, it would always use the camel-cased field name.
 | 
					 | 
				
			||||||
			if xd.GetJsonName() != strs.JSONCamelCase(string(x.Name())) {
 | 
					 | 
				
			||||||
				return errors.New("extension field %q may not have an explicitly set JSON name: %q", x.FullName(), xd.GetJsonName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if xd.OneofIndex != nil {
 | 
					 | 
				
			||||||
			return errors.New("extension field %q may not be part of a oneof", x.FullName())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if md := x.ContainingMessage(); !md.IsPlaceholder() {
 | 
					 | 
				
			||||||
			if !md.ExtensionRanges().Has(x.Number()) {
 | 
					 | 
				
			||||||
				return errors.New("extension field %q extends %q with non-extension field number: %d", x.FullName(), md.FullName(), x.Number())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			isMessageSet := md.Options().(*descriptorpb.MessageOptions).GetMessageSetWireFormat()
 | 
					 | 
				
			||||||
			if isMessageSet && !isOptionalMessage(x) {
 | 
					 | 
				
			||||||
				return errors.New("extension field %q extends MessageSet and must be an optional message", x.FullName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if !isMessageSet && !x.Number().IsValid() {
 | 
					 | 
				
			||||||
				return errors.New("extension field %q has an invalid number: %d", x.FullName(), x.Number())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if xd.GetOptions().GetWeak() {
 | 
					 | 
				
			||||||
			return errors.New("extension field %q cannot be a weak reference", x.FullName())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if x.IsPacked() && !isPackable(x) {
 | 
					 | 
				
			||||||
			return errors.New("extension field %q is not packable", x.FullName())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if err := checkValidGroup(x); err != nil {
 | 
					 | 
				
			||||||
			return errors.New("extension field %q is an invalid group: %v", x.FullName(), err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if md := x.Message(); md != nil && md.IsMapEntry() {
 | 
					 | 
				
			||||||
			return errors.New("extension field %q cannot be a map entry", x.FullName())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if x.Syntax() == protoreflect.Proto3 {
 | 
					 | 
				
			||||||
			switch x.ContainingMessage().FullName() {
 | 
					 | 
				
			||||||
			case (*descriptorpb.FileOptions)(nil).ProtoReflect().Descriptor().FullName():
 | 
					 | 
				
			||||||
			case (*descriptorpb.EnumOptions)(nil).ProtoReflect().Descriptor().FullName():
 | 
					 | 
				
			||||||
			case (*descriptorpb.EnumValueOptions)(nil).ProtoReflect().Descriptor().FullName():
 | 
					 | 
				
			||||||
			case (*descriptorpb.MessageOptions)(nil).ProtoReflect().Descriptor().FullName():
 | 
					 | 
				
			||||||
			case (*descriptorpb.FieldOptions)(nil).ProtoReflect().Descriptor().FullName():
 | 
					 | 
				
			||||||
			case (*descriptorpb.OneofOptions)(nil).ProtoReflect().Descriptor().FullName():
 | 
					 | 
				
			||||||
			case (*descriptorpb.ExtensionRangeOptions)(nil).ProtoReflect().Descriptor().FullName():
 | 
					 | 
				
			||||||
			case (*descriptorpb.ServiceOptions)(nil).ProtoReflect().Descriptor().FullName():
 | 
					 | 
				
			||||||
			case (*descriptorpb.MethodOptions)(nil).ProtoReflect().Descriptor().FullName():
 | 
					 | 
				
			||||||
			default:
 | 
					 | 
				
			||||||
				return errors.New("extension field %q cannot be declared in proto3 unless extended descriptor options", x.FullName())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// isOptionalMessage reports whether this is an optional message.
 | 
					 | 
				
			||||||
// If the kind is unknown, it is assumed to be a message.
 | 
					 | 
				
			||||||
func isOptionalMessage(fd protoreflect.FieldDescriptor) bool {
 | 
					 | 
				
			||||||
	return (fd.Kind() == 0 || fd.Kind() == protoreflect.MessageKind) && fd.Cardinality() == protoreflect.Optional
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// isPackable checks whether the pack option can be specified.
 | 
					 | 
				
			||||||
func isPackable(fd protoreflect.FieldDescriptor) bool {
 | 
					 | 
				
			||||||
	switch fd.Kind() {
 | 
					 | 
				
			||||||
	case protoreflect.StringKind, protoreflect.BytesKind, protoreflect.MessageKind, protoreflect.GroupKind:
 | 
					 | 
				
			||||||
		return false
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return fd.IsList()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// checkValidGroup reports whether fd is a valid group according to the same
 | 
					 | 
				
			||||||
// rules that protoc imposes.
 | 
					 | 
				
			||||||
func checkValidGroup(fd protoreflect.FieldDescriptor) error {
 | 
					 | 
				
			||||||
	md := fd.Message()
 | 
					 | 
				
			||||||
	switch {
 | 
					 | 
				
			||||||
	case fd.Kind() != protoreflect.GroupKind:
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	case fd.Syntax() != protoreflect.Proto2:
 | 
					 | 
				
			||||||
		return errors.New("invalid under proto2 semantics")
 | 
					 | 
				
			||||||
	case md == nil || md.IsPlaceholder():
 | 
					 | 
				
			||||||
		return errors.New("message must be resolvable")
 | 
					 | 
				
			||||||
	case fd.FullName().Parent() != md.FullName().Parent():
 | 
					 | 
				
			||||||
		return errors.New("message and field must be declared in the same scope")
 | 
					 | 
				
			||||||
	case !unicode.IsUpper(rune(md.Name()[0])):
 | 
					 | 
				
			||||||
		return errors.New("message name must start with an uppercase")
 | 
					 | 
				
			||||||
	case fd.Name() != protoreflect.Name(strings.ToLower(string(md.Name()))):
 | 
					 | 
				
			||||||
		return errors.New("field name must be lowercased form of the message name")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// checkValidMap checks whether the field is a valid map according to the same
 | 
					 | 
				
			||||||
// rules that protoc imposes.
 | 
					 | 
				
			||||||
// See protoc v3.8.0: src/google/protobuf/descriptor.cc:6045-6115
 | 
					 | 
				
			||||||
func checkValidMap(fd protoreflect.FieldDescriptor) error {
 | 
					 | 
				
			||||||
	md := fd.Message()
 | 
					 | 
				
			||||||
	switch {
 | 
					 | 
				
			||||||
	case md == nil || !md.IsMapEntry():
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	case fd.FullName().Parent() != md.FullName().Parent():
 | 
					 | 
				
			||||||
		return errors.New("message and field must be declared in the same scope")
 | 
					 | 
				
			||||||
	case md.Name() != protoreflect.Name(strs.MapEntryName(string(fd.Name()))):
 | 
					 | 
				
			||||||
		return errors.New("incorrect implicit map entry name")
 | 
					 | 
				
			||||||
	case fd.Cardinality() != protoreflect.Repeated:
 | 
					 | 
				
			||||||
		return errors.New("field must be repeated")
 | 
					 | 
				
			||||||
	case md.Fields().Len() != 2:
 | 
					 | 
				
			||||||
		return errors.New("message must have exactly two fields")
 | 
					 | 
				
			||||||
	case md.ExtensionRanges().Len() > 0:
 | 
					 | 
				
			||||||
		return errors.New("message must not have any extension ranges")
 | 
					 | 
				
			||||||
	case md.Enums().Len()+md.Messages().Len()+md.Extensions().Len() > 0:
 | 
					 | 
				
			||||||
		return errors.New("message must not have any nested declarations")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	kf := md.Fields().Get(0)
 | 
					 | 
				
			||||||
	vf := md.Fields().Get(1)
 | 
					 | 
				
			||||||
	switch {
 | 
					 | 
				
			||||||
	case kf.Name() != genid.MapEntry_Key_field_name || kf.Number() != genid.MapEntry_Key_field_number || kf.Cardinality() != protoreflect.Optional || kf.ContainingOneof() != nil || kf.HasDefault():
 | 
					 | 
				
			||||||
		return errors.New("invalid key field")
 | 
					 | 
				
			||||||
	case vf.Name() != genid.MapEntry_Value_field_name || vf.Number() != genid.MapEntry_Value_field_number || vf.Cardinality() != protoreflect.Optional || vf.ContainingOneof() != nil || vf.HasDefault():
 | 
					 | 
				
			||||||
		return errors.New("invalid value field")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	switch kf.Kind() {
 | 
					 | 
				
			||||||
	case protoreflect.BoolKind: // bool
 | 
					 | 
				
			||||||
	case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: // int32
 | 
					 | 
				
			||||||
	case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: // int64
 | 
					 | 
				
			||||||
	case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: // uint32
 | 
					 | 
				
			||||||
	case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: // uint64
 | 
					 | 
				
			||||||
	case protoreflect.StringKind: // string
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		return errors.New("invalid key kind: %v", kf.Kind())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if e := vf.Enum(); e != nil && e.Values().Len() > 0 && e.Values().Get(0).Number() != 0 {
 | 
					 | 
				
			||||||
		return errors.New("map enum value must have zero number for the first value")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										252
									
								
								vendor/google.golang.org/protobuf/reflect/protodesc/proto.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										252
									
								
								vendor/google.golang.org/protobuf/reflect/protodesc/proto.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,252 +0,0 @@
 | 
				
			|||||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
					 | 
				
			||||||
// Use of this source code is governed by a BSD-style
 | 
					 | 
				
			||||||
// license that can be found in the LICENSE file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package protodesc
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/encoding/defval"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/internal/strs"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/proto"
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/reflect/protoreflect"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"google.golang.org/protobuf/types/descriptorpb"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ToFileDescriptorProto copies a protoreflect.FileDescriptor into a
 | 
					 | 
				
			||||||
// google.protobuf.FileDescriptorProto message.
 | 
					 | 
				
			||||||
func ToFileDescriptorProto(file protoreflect.FileDescriptor) *descriptorpb.FileDescriptorProto {
 | 
					 | 
				
			||||||
	p := &descriptorpb.FileDescriptorProto{
 | 
					 | 
				
			||||||
		Name:    proto.String(file.Path()),
 | 
					 | 
				
			||||||
		Options: proto.Clone(file.Options()).(*descriptorpb.FileOptions),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if file.Package() != "" {
 | 
					 | 
				
			||||||
		p.Package = proto.String(string(file.Package()))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, imports := 0, file.Imports(); i < imports.Len(); i++ {
 | 
					 | 
				
			||||||
		imp := imports.Get(i)
 | 
					 | 
				
			||||||
		p.Dependency = append(p.Dependency, imp.Path())
 | 
					 | 
				
			||||||
		if imp.IsPublic {
 | 
					 | 
				
			||||||
			p.PublicDependency = append(p.PublicDependency, int32(i))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if imp.IsWeak {
 | 
					 | 
				
			||||||
			p.WeakDependency = append(p.WeakDependency, int32(i))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, locs := 0, file.SourceLocations(); i < locs.Len(); i++ {
 | 
					 | 
				
			||||||
		loc := locs.Get(i)
 | 
					 | 
				
			||||||
		l := &descriptorpb.SourceCodeInfo_Location{}
 | 
					 | 
				
			||||||
		l.Path = append(l.Path, loc.Path...)
 | 
					 | 
				
			||||||
		if loc.StartLine == loc.EndLine {
 | 
					 | 
				
			||||||
			l.Span = []int32{int32(loc.StartLine), int32(loc.StartColumn), int32(loc.EndColumn)}
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			l.Span = []int32{int32(loc.StartLine), int32(loc.StartColumn), int32(loc.EndLine), int32(loc.EndColumn)}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		l.LeadingDetachedComments = append([]string(nil), loc.LeadingDetachedComments...)
 | 
					 | 
				
			||||||
		if loc.LeadingComments != "" {
 | 
					 | 
				
			||||||
			l.LeadingComments = proto.String(loc.LeadingComments)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if loc.TrailingComments != "" {
 | 
					 | 
				
			||||||
			l.TrailingComments = proto.String(loc.TrailingComments)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if p.SourceCodeInfo == nil {
 | 
					 | 
				
			||||||
			p.SourceCodeInfo = &descriptorpb.SourceCodeInfo{}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		p.SourceCodeInfo.Location = append(p.SourceCodeInfo.Location, l)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, messages := 0, file.Messages(); i < messages.Len(); i++ {
 | 
					 | 
				
			||||||
		p.MessageType = append(p.MessageType, ToDescriptorProto(messages.Get(i)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, enums := 0, file.Enums(); i < enums.Len(); i++ {
 | 
					 | 
				
			||||||
		p.EnumType = append(p.EnumType, ToEnumDescriptorProto(enums.Get(i)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, services := 0, file.Services(); i < services.Len(); i++ {
 | 
					 | 
				
			||||||
		p.Service = append(p.Service, ToServiceDescriptorProto(services.Get(i)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, exts := 0, file.Extensions(); i < exts.Len(); i++ {
 | 
					 | 
				
			||||||
		p.Extension = append(p.Extension, ToFieldDescriptorProto(exts.Get(i)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if syntax := file.Syntax(); syntax != protoreflect.Proto2 {
 | 
					 | 
				
			||||||
		p.Syntax = proto.String(file.Syntax().String())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return p
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ToDescriptorProto copies a protoreflect.MessageDescriptor into a
 | 
					 | 
				
			||||||
// google.protobuf.DescriptorProto message.
 | 
					 | 
				
			||||||
func ToDescriptorProto(message protoreflect.MessageDescriptor) *descriptorpb.DescriptorProto {
 | 
					 | 
				
			||||||
	p := &descriptorpb.DescriptorProto{
 | 
					 | 
				
			||||||
		Name:    proto.String(string(message.Name())),
 | 
					 | 
				
			||||||
		Options: proto.Clone(message.Options()).(*descriptorpb.MessageOptions),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, fields := 0, message.Fields(); i < fields.Len(); i++ {
 | 
					 | 
				
			||||||
		p.Field = append(p.Field, ToFieldDescriptorProto(fields.Get(i)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, exts := 0, message.Extensions(); i < exts.Len(); i++ {
 | 
					 | 
				
			||||||
		p.Extension = append(p.Extension, ToFieldDescriptorProto(exts.Get(i)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, messages := 0, message.Messages(); i < messages.Len(); i++ {
 | 
					 | 
				
			||||||
		p.NestedType = append(p.NestedType, ToDescriptorProto(messages.Get(i)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, enums := 0, message.Enums(); i < enums.Len(); i++ {
 | 
					 | 
				
			||||||
		p.EnumType = append(p.EnumType, ToEnumDescriptorProto(enums.Get(i)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, xranges := 0, message.ExtensionRanges(); i < xranges.Len(); i++ {
 | 
					 | 
				
			||||||
		xrange := xranges.Get(i)
 | 
					 | 
				
			||||||
		p.ExtensionRange = append(p.ExtensionRange, &descriptorpb.DescriptorProto_ExtensionRange{
 | 
					 | 
				
			||||||
			Start:   proto.Int32(int32(xrange[0])),
 | 
					 | 
				
			||||||
			End:     proto.Int32(int32(xrange[1])),
 | 
					 | 
				
			||||||
			Options: proto.Clone(message.ExtensionRangeOptions(i)).(*descriptorpb.ExtensionRangeOptions),
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, oneofs := 0, message.Oneofs(); i < oneofs.Len(); i++ {
 | 
					 | 
				
			||||||
		p.OneofDecl = append(p.OneofDecl, ToOneofDescriptorProto(oneofs.Get(i)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, ranges := 0, message.ReservedRanges(); i < ranges.Len(); i++ {
 | 
					 | 
				
			||||||
		rrange := ranges.Get(i)
 | 
					 | 
				
			||||||
		p.ReservedRange = append(p.ReservedRange, &descriptorpb.DescriptorProto_ReservedRange{
 | 
					 | 
				
			||||||
			Start: proto.Int32(int32(rrange[0])),
 | 
					 | 
				
			||||||
			End:   proto.Int32(int32(rrange[1])),
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, names := 0, message.ReservedNames(); i < names.Len(); i++ {
 | 
					 | 
				
			||||||
		p.ReservedName = append(p.ReservedName, string(names.Get(i)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return p
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ToFieldDescriptorProto copies a protoreflect.FieldDescriptor into a
 | 
					 | 
				
			||||||
// google.protobuf.FieldDescriptorProto message.
 | 
					 | 
				
			||||||
func ToFieldDescriptorProto(field protoreflect.FieldDescriptor) *descriptorpb.FieldDescriptorProto {
 | 
					 | 
				
			||||||
	p := &descriptorpb.FieldDescriptorProto{
 | 
					 | 
				
			||||||
		Name:    proto.String(string(field.Name())),
 | 
					 | 
				
			||||||
		Number:  proto.Int32(int32(field.Number())),
 | 
					 | 
				
			||||||
		Label:   descriptorpb.FieldDescriptorProto_Label(field.Cardinality()).Enum(),
 | 
					 | 
				
			||||||
		Options: proto.Clone(field.Options()).(*descriptorpb.FieldOptions),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if field.IsExtension() {
 | 
					 | 
				
			||||||
		p.Extendee = fullNameOf(field.ContainingMessage())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if field.Kind().IsValid() {
 | 
					 | 
				
			||||||
		p.Type = descriptorpb.FieldDescriptorProto_Type(field.Kind()).Enum()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if field.Enum() != nil {
 | 
					 | 
				
			||||||
		p.TypeName = fullNameOf(field.Enum())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if field.Message() != nil {
 | 
					 | 
				
			||||||
		p.TypeName = fullNameOf(field.Message())
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if field.HasJSONName() {
 | 
					 | 
				
			||||||
		// A bug in older versions of protoc would always populate the
 | 
					 | 
				
			||||||
		// "json_name" option for extensions when it is meaningless.
 | 
					 | 
				
			||||||
		// When it did so, it would always use the camel-cased field name.
 | 
					 | 
				
			||||||
		if field.IsExtension() {
 | 
					 | 
				
			||||||
			p.JsonName = proto.String(strs.JSONCamelCase(string(field.Name())))
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			p.JsonName = proto.String(field.JSONName())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if field.Syntax() == protoreflect.Proto3 && field.HasOptionalKeyword() {
 | 
					 | 
				
			||||||
		p.Proto3Optional = proto.Bool(true)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if field.HasDefault() {
 | 
					 | 
				
			||||||
		def, err := defval.Marshal(field.Default(), field.DefaultEnumValue(), field.Kind(), defval.Descriptor)
 | 
					 | 
				
			||||||
		if err != nil && field.DefaultEnumValue() != nil {
 | 
					 | 
				
			||||||
			def = string(field.DefaultEnumValue().Name()) // occurs for unresolved enum values
 | 
					 | 
				
			||||||
		} else if err != nil {
 | 
					 | 
				
			||||||
			panic(fmt.Sprintf("%v: %v", field.FullName(), err))
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		p.DefaultValue = proto.String(def)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if oneof := field.ContainingOneof(); oneof != nil {
 | 
					 | 
				
			||||||
		p.OneofIndex = proto.Int32(int32(oneof.Index()))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return p
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ToOneofDescriptorProto copies a protoreflect.OneofDescriptor into a
 | 
					 | 
				
			||||||
// google.protobuf.OneofDescriptorProto message.
 | 
					 | 
				
			||||||
func ToOneofDescriptorProto(oneof protoreflect.OneofDescriptor) *descriptorpb.OneofDescriptorProto {
 | 
					 | 
				
			||||||
	return &descriptorpb.OneofDescriptorProto{
 | 
					 | 
				
			||||||
		Name:    proto.String(string(oneof.Name())),
 | 
					 | 
				
			||||||
		Options: proto.Clone(oneof.Options()).(*descriptorpb.OneofOptions),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ToEnumDescriptorProto copies a protoreflect.EnumDescriptor into a
 | 
					 | 
				
			||||||
// google.protobuf.EnumDescriptorProto message.
 | 
					 | 
				
			||||||
func ToEnumDescriptorProto(enum protoreflect.EnumDescriptor) *descriptorpb.EnumDescriptorProto {
 | 
					 | 
				
			||||||
	p := &descriptorpb.EnumDescriptorProto{
 | 
					 | 
				
			||||||
		Name:    proto.String(string(enum.Name())),
 | 
					 | 
				
			||||||
		Options: proto.Clone(enum.Options()).(*descriptorpb.EnumOptions),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, values := 0, enum.Values(); i < values.Len(); i++ {
 | 
					 | 
				
			||||||
		p.Value = append(p.Value, ToEnumValueDescriptorProto(values.Get(i)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, ranges := 0, enum.ReservedRanges(); i < ranges.Len(); i++ {
 | 
					 | 
				
			||||||
		rrange := ranges.Get(i)
 | 
					 | 
				
			||||||
		p.ReservedRange = append(p.ReservedRange, &descriptorpb.EnumDescriptorProto_EnumReservedRange{
 | 
					 | 
				
			||||||
			Start: proto.Int32(int32(rrange[0])),
 | 
					 | 
				
			||||||
			End:   proto.Int32(int32(rrange[1])),
 | 
					 | 
				
			||||||
		})
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, names := 0, enum.ReservedNames(); i < names.Len(); i++ {
 | 
					 | 
				
			||||||
		p.ReservedName = append(p.ReservedName, string(names.Get(i)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return p
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ToEnumValueDescriptorProto copies a protoreflect.EnumValueDescriptor into a
 | 
					 | 
				
			||||||
// google.protobuf.EnumValueDescriptorProto message.
 | 
					 | 
				
			||||||
func ToEnumValueDescriptorProto(value protoreflect.EnumValueDescriptor) *descriptorpb.EnumValueDescriptorProto {
 | 
					 | 
				
			||||||
	return &descriptorpb.EnumValueDescriptorProto{
 | 
					 | 
				
			||||||
		Name:    proto.String(string(value.Name())),
 | 
					 | 
				
			||||||
		Number:  proto.Int32(int32(value.Number())),
 | 
					 | 
				
			||||||
		Options: proto.Clone(value.Options()).(*descriptorpb.EnumValueOptions),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ToServiceDescriptorProto copies a protoreflect.ServiceDescriptor into a
 | 
					 | 
				
			||||||
// google.protobuf.ServiceDescriptorProto message.
 | 
					 | 
				
			||||||
func ToServiceDescriptorProto(service protoreflect.ServiceDescriptor) *descriptorpb.ServiceDescriptorProto {
 | 
					 | 
				
			||||||
	p := &descriptorpb.ServiceDescriptorProto{
 | 
					 | 
				
			||||||
		Name:    proto.String(string(service.Name())),
 | 
					 | 
				
			||||||
		Options: proto.Clone(service.Options()).(*descriptorpb.ServiceOptions),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for i, methods := 0, service.Methods(); i < methods.Len(); i++ {
 | 
					 | 
				
			||||||
		p.Method = append(p.Method, ToMethodDescriptorProto(methods.Get(i)))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return p
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ToMethodDescriptorProto copies a protoreflect.MethodDescriptor into a
 | 
					 | 
				
			||||||
// google.protobuf.MethodDescriptorProto message.
 | 
					 | 
				
			||||||
func ToMethodDescriptorProto(method protoreflect.MethodDescriptor) *descriptorpb.MethodDescriptorProto {
 | 
					 | 
				
			||||||
	p := &descriptorpb.MethodDescriptorProto{
 | 
					 | 
				
			||||||
		Name:       proto.String(string(method.Name())),
 | 
					 | 
				
			||||||
		InputType:  fullNameOf(method.Input()),
 | 
					 | 
				
			||||||
		OutputType: fullNameOf(method.Output()),
 | 
					 | 
				
			||||||
		Options:    proto.Clone(method.Options()).(*descriptorpb.MethodOptions),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if method.IsStreamingClient() {
 | 
					 | 
				
			||||||
		p.ClientStreaming = proto.Bool(true)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if method.IsStreamingServer() {
 | 
					 | 
				
			||||||
		p.ServerStreaming = proto.Bool(true)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return p
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func fullNameOf(d protoreflect.Descriptor) *string {
 | 
					 | 
				
			||||||
	if d == nil {
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if strings.HasPrefix(string(d.FullName()), unknownPrefix) {
 | 
					 | 
				
			||||||
		return proto.String(string(d.FullName()[len(unknownPrefix):]))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return proto.String("." + string(d.FullName()))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										3957
									
								
								vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3957
									
								
								vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										7
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							@@ -1,9 +1,9 @@
 | 
				
			|||||||
# github.com/cyrilix/robocar-base v0.1.5
 | 
					# github.com/cyrilix/robocar-base v0.1.6
 | 
				
			||||||
## explicit; go 1.17
 | 
					## explicit; go 1.17
 | 
				
			||||||
github.com/cyrilix/robocar-base/cli
 | 
					github.com/cyrilix/robocar-base/cli
 | 
				
			||||||
github.com/cyrilix/robocar-base/service
 | 
					github.com/cyrilix/robocar-base/service
 | 
				
			||||||
github.com/cyrilix/robocar-base/testtools
 | 
					github.com/cyrilix/robocar-base/testtools
 | 
				
			||||||
# github.com/cyrilix/robocar-protobuf/go v1.0.3
 | 
					# github.com/cyrilix/robocar-protobuf/go v1.0.4
 | 
				
			||||||
## explicit; go 1.17
 | 
					## explicit; go 1.17
 | 
				
			||||||
github.com/cyrilix/robocar-protobuf/go/events
 | 
					github.com/cyrilix/robocar-protobuf/go/events
 | 
				
			||||||
# github.com/eclipse/paho.mqtt.golang v1.3.5
 | 
					# github.com/eclipse/paho.mqtt.golang v1.3.5
 | 
				
			||||||
@@ -12,7 +12,6 @@ github.com/eclipse/paho.mqtt.golang
 | 
				
			|||||||
github.com/eclipse/paho.mqtt.golang/packets
 | 
					github.com/eclipse/paho.mqtt.golang/packets
 | 
				
			||||||
# github.com/golang/protobuf v1.5.2
 | 
					# github.com/golang/protobuf v1.5.2
 | 
				
			||||||
## explicit; go 1.9
 | 
					## explicit; go 1.9
 | 
				
			||||||
github.com/golang/protobuf/proto
 | 
					 | 
				
			||||||
github.com/golang/protobuf/ptypes/timestamp
 | 
					github.com/golang/protobuf/ptypes/timestamp
 | 
				
			||||||
# github.com/gorilla/websocket v1.4.2
 | 
					# github.com/gorilla/websocket v1.4.2
 | 
				
			||||||
## explicit; go 1.12
 | 
					## explicit; go 1.12
 | 
				
			||||||
@@ -58,12 +57,10 @@ google.golang.org/protobuf/internal/set
 | 
				
			|||||||
google.golang.org/protobuf/internal/strs
 | 
					google.golang.org/protobuf/internal/strs
 | 
				
			||||||
google.golang.org/protobuf/internal/version
 | 
					google.golang.org/protobuf/internal/version
 | 
				
			||||||
google.golang.org/protobuf/proto
 | 
					google.golang.org/protobuf/proto
 | 
				
			||||||
google.golang.org/protobuf/reflect/protodesc
 | 
					 | 
				
			||||||
google.golang.org/protobuf/reflect/protoreflect
 | 
					google.golang.org/protobuf/reflect/protoreflect
 | 
				
			||||||
google.golang.org/protobuf/reflect/protoregistry
 | 
					google.golang.org/protobuf/reflect/protoregistry
 | 
				
			||||||
google.golang.org/protobuf/runtime/protoiface
 | 
					google.golang.org/protobuf/runtime/protoiface
 | 
				
			||||||
google.golang.org/protobuf/runtime/protoimpl
 | 
					google.golang.org/protobuf/runtime/protoimpl
 | 
				
			||||||
google.golang.org/protobuf/types/descriptorpb
 | 
					 | 
				
			||||||
google.golang.org/protobuf/types/known/timestamppb
 | 
					google.golang.org/protobuf/types/known/timestamppb
 | 
				
			||||||
# periph.io/x/conn/v3 v3.6.10
 | 
					# periph.io/x/conn/v3 v3.6.10
 | 
				
			||||||
## explicit; go 1.13
 | 
					## explicit; go 1.13
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user