updated GHA
Update to v2 SDK updated dependencies
This commit is contained in:
		
							
								
								
									
										3
									
								
								vendor/google.golang.org/protobuf/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/google.golang.org/protobuf/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| # This source code refers to The Go Authors for copyright purposes. | ||||
| # The master list of authors is in the main Go distribution, | ||||
| # visible at https://tip.golang.org/AUTHORS. | ||||
							
								
								
									
										3
									
								
								vendor/google.golang.org/protobuf/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/google.golang.org/protobuf/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| # This source code was written by the Go contributors. | ||||
| # The master list of contributors is in the main Go distribution, | ||||
| # visible at https://tip.golang.org/CONTRIBUTORS. | ||||
							
								
								
									
										27
									
								
								vendor/google.golang.org/protobuf/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/google.golang.org/protobuf/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| Copyright (c) 2018 The Go Authors. All rights reserved. | ||||
|  | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are | ||||
| met: | ||||
|  | ||||
|    * Redistributions of source code must retain the above copyright | ||||
| notice, this list of conditions and the following disclaimer. | ||||
|    * Redistributions in binary form must reproduce the above | ||||
| copyright notice, this list of conditions and the following disclaimer | ||||
| in the documentation and/or other materials provided with the | ||||
| distribution. | ||||
|    * Neither the name of Google Inc. nor the names of its | ||||
| contributors may be used to endorse or promote products derived from | ||||
| this software without specific prior written permission. | ||||
|  | ||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
							
								
								
									
										22
									
								
								vendor/google.golang.org/protobuf/PATENTS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/google.golang.org/protobuf/PATENTS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| Additional IP Rights Grant (Patents) | ||||
|  | ||||
| "This implementation" means the copyrightable works distributed by | ||||
| Google as part of the Go project. | ||||
|  | ||||
| Google hereby grants to You a perpetual, worldwide, non-exclusive, | ||||
| no-charge, royalty-free, irrevocable (except as stated in this section) | ||||
| patent license to make, have made, use, offer to sell, sell, import, | ||||
| transfer and otherwise run, modify and propagate the contents of this | ||||
| implementation of Go, where such license applies only to those patent | ||||
| claims, both currently owned or controlled by Google and acquired in | ||||
| the future, licensable by Google that are necessarily infringed by this | ||||
| implementation of Go.  This grant does not include claims that would be | ||||
| infringed only as a consequence of further modification of this | ||||
| implementation.  If you or your agent or exclusive licensee institute or | ||||
| order or agree to the institution of patent litigation against any | ||||
| entity (including a cross-claim or counterclaim in a lawsuit) alleging | ||||
| that this implementation of Go or any code incorporated within this | ||||
| implementation of Go constitutes direct or contributory patent | ||||
| infringement, or inducement of patent infringement, then any patent | ||||
| rights granted to you under this License for this implementation of Go | ||||
| shall terminate as of the date such litigation is filed. | ||||
							
								
								
									
										665
									
								
								vendor/google.golang.org/protobuf/encoding/protojson/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										665
									
								
								vendor/google.golang.org/protobuf/encoding/protojson/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,665 @@ | ||||
| // 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 protojson | ||||
|  | ||||
| import ( | ||||
| 	"encoding/base64" | ||||
| 	"fmt" | ||||
| 	"math" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/encoding/json" | ||||
| 	"google.golang.org/protobuf/internal/encoding/messageset" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	"google.golang.org/protobuf/internal/flags" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	"google.golang.org/protobuf/internal/set" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	"google.golang.org/protobuf/reflect/protoregistry" | ||||
| ) | ||||
|  | ||||
| // Unmarshal reads the given []byte into the given proto.Message. | ||||
| // The provided message must be mutable (e.g., a non-nil pointer to a message). | ||||
| func Unmarshal(b []byte, m proto.Message) error { | ||||
| 	return UnmarshalOptions{}.Unmarshal(b, m) | ||||
| } | ||||
|  | ||||
| // UnmarshalOptions is a configurable JSON format parser. | ||||
| type UnmarshalOptions struct { | ||||
| 	pragma.NoUnkeyedLiterals | ||||
|  | ||||
| 	// If AllowPartial is set, input for messages that will result in missing | ||||
| 	// required fields will not return an error. | ||||
| 	AllowPartial bool | ||||
|  | ||||
| 	// If DiscardUnknown is set, unknown fields are ignored. | ||||
| 	DiscardUnknown bool | ||||
|  | ||||
| 	// Resolver is used for looking up types when unmarshaling | ||||
| 	// google.protobuf.Any messages or extension fields. | ||||
| 	// If nil, this defaults to using protoregistry.GlobalTypes. | ||||
| 	Resolver interface { | ||||
| 		protoregistry.MessageTypeResolver | ||||
| 		protoregistry.ExtensionTypeResolver | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Unmarshal reads the given []byte and populates the given proto.Message | ||||
| // using options in the UnmarshalOptions object. | ||||
| // It will clear the message first before setting the fields. | ||||
| // If it returns an error, the given message may be partially set. | ||||
| // The provided message must be mutable (e.g., a non-nil pointer to a message). | ||||
| func (o UnmarshalOptions) Unmarshal(b []byte, m proto.Message) error { | ||||
| 	return o.unmarshal(b, m) | ||||
| } | ||||
|  | ||||
| // unmarshal is a centralized function that all unmarshal operations go through. | ||||
| // For profiling purposes, avoid changing the name of this function or | ||||
| // introducing other code paths for unmarshal that do not go through this. | ||||
| func (o UnmarshalOptions) unmarshal(b []byte, m proto.Message) error { | ||||
| 	proto.Reset(m) | ||||
|  | ||||
| 	if o.Resolver == nil { | ||||
| 		o.Resolver = protoregistry.GlobalTypes | ||||
| 	} | ||||
|  | ||||
| 	dec := decoder{json.NewDecoder(b), o} | ||||
| 	if err := dec.unmarshalMessage(m.ProtoReflect(), false); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// Check for EOF. | ||||
| 	tok, err := dec.Read() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if tok.Kind() != json.EOF { | ||||
| 		return dec.unexpectedTokenError(tok) | ||||
| 	} | ||||
|  | ||||
| 	if o.AllowPartial { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return proto.CheckInitialized(m) | ||||
| } | ||||
|  | ||||
| type decoder struct { | ||||
| 	*json.Decoder | ||||
| 	opts UnmarshalOptions | ||||
| } | ||||
|  | ||||
| // newError returns an error object with position info. | ||||
| func (d decoder) newError(pos int, f string, x ...interface{}) error { | ||||
| 	line, column := d.Position(pos) | ||||
| 	head := fmt.Sprintf("(line %d:%d): ", line, column) | ||||
| 	return errors.New(head+f, x...) | ||||
| } | ||||
|  | ||||
| // unexpectedTokenError returns a syntax error for the given unexpected token. | ||||
| func (d decoder) unexpectedTokenError(tok json.Token) error { | ||||
| 	return d.syntaxError(tok.Pos(), "unexpected token %s", tok.RawString()) | ||||
| } | ||||
|  | ||||
| // syntaxError returns a syntax error for given position. | ||||
| func (d decoder) syntaxError(pos int, f string, x ...interface{}) error { | ||||
| 	line, column := d.Position(pos) | ||||
| 	head := fmt.Sprintf("syntax error (line %d:%d): ", line, column) | ||||
| 	return errors.New(head+f, x...) | ||||
| } | ||||
|  | ||||
| // unmarshalMessage unmarshals a message into the given protoreflect.Message. | ||||
| func (d decoder) unmarshalMessage(m pref.Message, skipTypeURL bool) error { | ||||
| 	if unmarshal := wellKnownTypeUnmarshaler(m.Descriptor().FullName()); unmarshal != nil { | ||||
| 		return unmarshal(d, m) | ||||
| 	} | ||||
|  | ||||
| 	tok, err := d.Read() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if tok.Kind() != json.ObjectOpen { | ||||
| 		return d.unexpectedTokenError(tok) | ||||
| 	} | ||||
|  | ||||
| 	messageDesc := m.Descriptor() | ||||
| 	if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) { | ||||
| 		return errors.New("no support for proto1 MessageSets") | ||||
| 	} | ||||
|  | ||||
| 	var seenNums set.Ints | ||||
| 	var seenOneofs set.Ints | ||||
| 	fieldDescs := messageDesc.Fields() | ||||
| 	for { | ||||
| 		// Read field name. | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		switch tok.Kind() { | ||||
| 		default: | ||||
| 			return d.unexpectedTokenError(tok) | ||||
| 		case json.ObjectClose: | ||||
| 			return nil | ||||
| 		case json.Name: | ||||
| 			// Continue below. | ||||
| 		} | ||||
|  | ||||
| 		name := tok.Name() | ||||
| 		// Unmarshaling a non-custom embedded message in Any will contain the | ||||
| 		// JSON field "@type" which should be skipped because it is not a field | ||||
| 		// of the embedded message, but simply an artifact of the Any format. | ||||
| 		if skipTypeURL && name == "@type" { | ||||
| 			d.Read() | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// Get the FieldDescriptor. | ||||
| 		var fd pref.FieldDescriptor | ||||
| 		if strings.HasPrefix(name, "[") && strings.HasSuffix(name, "]") { | ||||
| 			// Only extension names are in [name] format. | ||||
| 			extName := pref.FullName(name[1 : len(name)-1]) | ||||
| 			extType, err := d.opts.Resolver.FindExtensionByName(extName) | ||||
| 			if err != nil && err != protoregistry.NotFound { | ||||
| 				return d.newError(tok.Pos(), "unable to resolve %s: %v", tok.RawString(), err) | ||||
| 			} | ||||
| 			if extType != nil { | ||||
| 				fd = extType.TypeDescriptor() | ||||
| 				if !messageDesc.ExtensionRanges().Has(fd.Number()) || fd.ContainingMessage().FullName() != messageDesc.FullName() { | ||||
| 					return d.newError(tok.Pos(), "message %v cannot be extended by %v", messageDesc.FullName(), fd.FullName()) | ||||
| 				} | ||||
| 			} | ||||
| 		} else { | ||||
| 			// The name can either be the JSON name or the proto field name. | ||||
| 			fd = fieldDescs.ByJSONName(name) | ||||
| 			if fd == nil { | ||||
| 				fd = fieldDescs.ByTextName(name) | ||||
| 			} | ||||
| 		} | ||||
| 		if flags.ProtoLegacy { | ||||
| 			if fd != nil && fd.IsWeak() && fd.Message().IsPlaceholder() { | ||||
| 				fd = nil // reset since the weak reference is not linked in | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if fd == nil { | ||||
| 			// Field is unknown. | ||||
| 			if d.opts.DiscardUnknown { | ||||
| 				if err := d.skipJSONValue(); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				continue | ||||
| 			} | ||||
| 			return d.newError(tok.Pos(), "unknown field %v", tok.RawString()) | ||||
| 		} | ||||
|  | ||||
| 		// Do not allow duplicate fields. | ||||
| 		num := uint64(fd.Number()) | ||||
| 		if seenNums.Has(num) { | ||||
| 			return d.newError(tok.Pos(), "duplicate field %v", tok.RawString()) | ||||
| 		} | ||||
| 		seenNums.Set(num) | ||||
|  | ||||
| 		// No need to set values for JSON null unless the field type is | ||||
| 		// google.protobuf.Value or google.protobuf.NullValue. | ||||
| 		if tok, _ := d.Peek(); tok.Kind() == json.Null && !isKnownValue(fd) && !isNullValue(fd) { | ||||
| 			d.Read() | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		switch { | ||||
| 		case fd.IsList(): | ||||
| 			list := m.Mutable(fd).List() | ||||
| 			if err := d.unmarshalList(list, fd); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		case fd.IsMap(): | ||||
| 			mmap := m.Mutable(fd).Map() | ||||
| 			if err := d.unmarshalMap(mmap, fd); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		default: | ||||
| 			// If field is a oneof, check if it has already been set. | ||||
| 			if od := fd.ContainingOneof(); od != nil { | ||||
| 				idx := uint64(od.Index()) | ||||
| 				if seenOneofs.Has(idx) { | ||||
| 					return d.newError(tok.Pos(), "error parsing %s, oneof %v is already set", tok.RawString(), od.FullName()) | ||||
| 				} | ||||
| 				seenOneofs.Set(idx) | ||||
| 			} | ||||
|  | ||||
| 			// Required or optional fields. | ||||
| 			if err := d.unmarshalSingular(m, fd); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func isKnownValue(fd pref.FieldDescriptor) bool { | ||||
| 	md := fd.Message() | ||||
| 	return md != nil && md.FullName() == genid.Value_message_fullname | ||||
| } | ||||
|  | ||||
| func isNullValue(fd pref.FieldDescriptor) bool { | ||||
| 	ed := fd.Enum() | ||||
| 	return ed != nil && ed.FullName() == genid.NullValue_enum_fullname | ||||
| } | ||||
|  | ||||
| // unmarshalSingular unmarshals to the non-repeated field specified | ||||
| // by the given FieldDescriptor. | ||||
| func (d decoder) unmarshalSingular(m pref.Message, fd pref.FieldDescriptor) error { | ||||
| 	var val pref.Value | ||||
| 	var err error | ||||
| 	switch fd.Kind() { | ||||
| 	case pref.MessageKind, pref.GroupKind: | ||||
| 		val = m.NewField(fd) | ||||
| 		err = d.unmarshalMessage(val.Message(), false) | ||||
| 	default: | ||||
| 		val, err = d.unmarshalScalar(fd) | ||||
| 	} | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	m.Set(fd, val) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // unmarshalScalar unmarshals to a scalar/enum protoreflect.Value specified by | ||||
| // the given FieldDescriptor. | ||||
| func (d decoder) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) { | ||||
| 	const b32 int = 32 | ||||
| 	const b64 int = 64 | ||||
|  | ||||
| 	tok, err := d.Read() | ||||
| 	if err != nil { | ||||
| 		return pref.Value{}, err | ||||
| 	} | ||||
|  | ||||
| 	kind := fd.Kind() | ||||
| 	switch kind { | ||||
| 	case pref.BoolKind: | ||||
| 		if tok.Kind() == json.Bool { | ||||
| 			return pref.ValueOfBool(tok.Bool()), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: | ||||
| 		if v, ok := unmarshalInt(tok, b32); ok { | ||||
| 			return v, nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: | ||||
| 		if v, ok := unmarshalInt(tok, b64); ok { | ||||
| 			return v, nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.Uint32Kind, pref.Fixed32Kind: | ||||
| 		if v, ok := unmarshalUint(tok, b32); ok { | ||||
| 			return v, nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.Uint64Kind, pref.Fixed64Kind: | ||||
| 		if v, ok := unmarshalUint(tok, b64); ok { | ||||
| 			return v, nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.FloatKind: | ||||
| 		if v, ok := unmarshalFloat(tok, b32); ok { | ||||
| 			return v, nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.DoubleKind: | ||||
| 		if v, ok := unmarshalFloat(tok, b64); ok { | ||||
| 			return v, nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.StringKind: | ||||
| 		if tok.Kind() == json.String { | ||||
| 			return pref.ValueOfString(tok.ParsedString()), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.BytesKind: | ||||
| 		if v, ok := unmarshalBytes(tok); ok { | ||||
| 			return v, nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.EnumKind: | ||||
| 		if v, ok := unmarshalEnum(tok, fd); ok { | ||||
| 			return v, nil | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("unmarshalScalar: invalid scalar kind %v", kind)) | ||||
| 	} | ||||
|  | ||||
| 	return pref.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString()) | ||||
| } | ||||
|  | ||||
| func unmarshalInt(tok json.Token, bitSize int) (pref.Value, bool) { | ||||
| 	switch tok.Kind() { | ||||
| 	case json.Number: | ||||
| 		return getInt(tok, bitSize) | ||||
|  | ||||
| 	case json.String: | ||||
| 		// Decode number from string. | ||||
| 		s := strings.TrimSpace(tok.ParsedString()) | ||||
| 		if len(s) != len(tok.ParsedString()) { | ||||
| 			return pref.Value{}, false | ||||
| 		} | ||||
| 		dec := json.NewDecoder([]byte(s)) | ||||
| 		tok, err := dec.Read() | ||||
| 		if err != nil { | ||||
| 			return pref.Value{}, false | ||||
| 		} | ||||
| 		return getInt(tok, bitSize) | ||||
| 	} | ||||
| 	return pref.Value{}, false | ||||
| } | ||||
|  | ||||
| func getInt(tok json.Token, bitSize int) (pref.Value, bool) { | ||||
| 	n, ok := tok.Int(bitSize) | ||||
| 	if !ok { | ||||
| 		return pref.Value{}, false | ||||
| 	} | ||||
| 	if bitSize == 32 { | ||||
| 		return pref.ValueOfInt32(int32(n)), true | ||||
| 	} | ||||
| 	return pref.ValueOfInt64(n), true | ||||
| } | ||||
|  | ||||
| func unmarshalUint(tok json.Token, bitSize int) (pref.Value, bool) { | ||||
| 	switch tok.Kind() { | ||||
| 	case json.Number: | ||||
| 		return getUint(tok, bitSize) | ||||
|  | ||||
| 	case json.String: | ||||
| 		// Decode number from string. | ||||
| 		s := strings.TrimSpace(tok.ParsedString()) | ||||
| 		if len(s) != len(tok.ParsedString()) { | ||||
| 			return pref.Value{}, false | ||||
| 		} | ||||
| 		dec := json.NewDecoder([]byte(s)) | ||||
| 		tok, err := dec.Read() | ||||
| 		if err != nil { | ||||
| 			return pref.Value{}, false | ||||
| 		} | ||||
| 		return getUint(tok, bitSize) | ||||
| 	} | ||||
| 	return pref.Value{}, false | ||||
| } | ||||
|  | ||||
| func getUint(tok json.Token, bitSize int) (pref.Value, bool) { | ||||
| 	n, ok := tok.Uint(bitSize) | ||||
| 	if !ok { | ||||
| 		return pref.Value{}, false | ||||
| 	} | ||||
| 	if bitSize == 32 { | ||||
| 		return pref.ValueOfUint32(uint32(n)), true | ||||
| 	} | ||||
| 	return pref.ValueOfUint64(n), true | ||||
| } | ||||
|  | ||||
| func unmarshalFloat(tok json.Token, bitSize int) (pref.Value, bool) { | ||||
| 	switch tok.Kind() { | ||||
| 	case json.Number: | ||||
| 		return getFloat(tok, bitSize) | ||||
|  | ||||
| 	case json.String: | ||||
| 		s := tok.ParsedString() | ||||
| 		switch s { | ||||
| 		case "NaN": | ||||
| 			if bitSize == 32 { | ||||
| 				return pref.ValueOfFloat32(float32(math.NaN())), true | ||||
| 			} | ||||
| 			return pref.ValueOfFloat64(math.NaN()), true | ||||
| 		case "Infinity": | ||||
| 			if bitSize == 32 { | ||||
| 				return pref.ValueOfFloat32(float32(math.Inf(+1))), true | ||||
| 			} | ||||
| 			return pref.ValueOfFloat64(math.Inf(+1)), true | ||||
| 		case "-Infinity": | ||||
| 			if bitSize == 32 { | ||||
| 				return pref.ValueOfFloat32(float32(math.Inf(-1))), true | ||||
| 			} | ||||
| 			return pref.ValueOfFloat64(math.Inf(-1)), true | ||||
| 		} | ||||
|  | ||||
| 		// Decode number from string. | ||||
| 		if len(s) != len(strings.TrimSpace(s)) { | ||||
| 			return pref.Value{}, false | ||||
| 		} | ||||
| 		dec := json.NewDecoder([]byte(s)) | ||||
| 		tok, err := dec.Read() | ||||
| 		if err != nil { | ||||
| 			return pref.Value{}, false | ||||
| 		} | ||||
| 		return getFloat(tok, bitSize) | ||||
| 	} | ||||
| 	return pref.Value{}, false | ||||
| } | ||||
|  | ||||
| func getFloat(tok json.Token, bitSize int) (pref.Value, bool) { | ||||
| 	n, ok := tok.Float(bitSize) | ||||
| 	if !ok { | ||||
| 		return pref.Value{}, false | ||||
| 	} | ||||
| 	if bitSize == 32 { | ||||
| 		return pref.ValueOfFloat32(float32(n)), true | ||||
| 	} | ||||
| 	return pref.ValueOfFloat64(n), true | ||||
| } | ||||
|  | ||||
| func unmarshalBytes(tok json.Token) (pref.Value, bool) { | ||||
| 	if tok.Kind() != json.String { | ||||
| 		return pref.Value{}, false | ||||
| 	} | ||||
|  | ||||
| 	s := tok.ParsedString() | ||||
| 	enc := base64.StdEncoding | ||||
| 	if strings.ContainsAny(s, "-_") { | ||||
| 		enc = base64.URLEncoding | ||||
| 	} | ||||
| 	if len(s)%4 != 0 { | ||||
| 		enc = enc.WithPadding(base64.NoPadding) | ||||
| 	} | ||||
| 	b, err := enc.DecodeString(s) | ||||
| 	if err != nil { | ||||
| 		return pref.Value{}, false | ||||
| 	} | ||||
| 	return pref.ValueOfBytes(b), true | ||||
| } | ||||
|  | ||||
| func unmarshalEnum(tok json.Token, fd pref.FieldDescriptor) (pref.Value, bool) { | ||||
| 	switch tok.Kind() { | ||||
| 	case json.String: | ||||
| 		// Lookup EnumNumber based on name. | ||||
| 		s := tok.ParsedString() | ||||
| 		if enumVal := fd.Enum().Values().ByName(pref.Name(s)); enumVal != nil { | ||||
| 			return pref.ValueOfEnum(enumVal.Number()), true | ||||
| 		} | ||||
|  | ||||
| 	case json.Number: | ||||
| 		if n, ok := tok.Int(32); ok { | ||||
| 			return pref.ValueOfEnum(pref.EnumNumber(n)), true | ||||
| 		} | ||||
|  | ||||
| 	case json.Null: | ||||
| 		// This is only valid for google.protobuf.NullValue. | ||||
| 		if isNullValue(fd) { | ||||
| 			return pref.ValueOfEnum(0), true | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return pref.Value{}, false | ||||
| } | ||||
|  | ||||
| func (d decoder) unmarshalList(list pref.List, fd pref.FieldDescriptor) error { | ||||
| 	tok, err := d.Read() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if tok.Kind() != json.ArrayOpen { | ||||
| 		return d.unexpectedTokenError(tok) | ||||
| 	} | ||||
|  | ||||
| 	switch fd.Kind() { | ||||
| 	case pref.MessageKind, pref.GroupKind: | ||||
| 		for { | ||||
| 			tok, err := d.Peek() | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 			if tok.Kind() == json.ArrayClose { | ||||
| 				d.Read() | ||||
| 				return nil | ||||
| 			} | ||||
|  | ||||
| 			val := list.NewElement() | ||||
| 			if err := d.unmarshalMessage(val.Message(), false); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			list.Append(val) | ||||
| 		} | ||||
| 	default: | ||||
| 		for { | ||||
| 			tok, err := d.Peek() | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 			if tok.Kind() == json.ArrayClose { | ||||
| 				d.Read() | ||||
| 				return nil | ||||
| 			} | ||||
|  | ||||
| 			val, err := d.unmarshalScalar(fd) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			list.Append(val) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (d decoder) unmarshalMap(mmap pref.Map, fd pref.FieldDescriptor) error { | ||||
| 	tok, err := d.Read() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if tok.Kind() != json.ObjectOpen { | ||||
| 		return d.unexpectedTokenError(tok) | ||||
| 	} | ||||
|  | ||||
| 	// Determine ahead whether map entry is a scalar type or a message type in | ||||
| 	// order to call the appropriate unmarshalMapValue func inside the for loop | ||||
| 	// below. | ||||
| 	var unmarshalMapValue func() (pref.Value, error) | ||||
| 	switch fd.MapValue().Kind() { | ||||
| 	case pref.MessageKind, pref.GroupKind: | ||||
| 		unmarshalMapValue = func() (pref.Value, error) { | ||||
| 			val := mmap.NewValue() | ||||
| 			if err := d.unmarshalMessage(val.Message(), false); err != nil { | ||||
| 				return pref.Value{}, err | ||||
| 			} | ||||
| 			return val, nil | ||||
| 		} | ||||
| 	default: | ||||
| 		unmarshalMapValue = func() (pref.Value, error) { | ||||
| 			return d.unmarshalScalar(fd.MapValue()) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| Loop: | ||||
| 	for { | ||||
| 		// Read field name. | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		switch tok.Kind() { | ||||
| 		default: | ||||
| 			return d.unexpectedTokenError(tok) | ||||
| 		case json.ObjectClose: | ||||
| 			break Loop | ||||
| 		case json.Name: | ||||
| 			// Continue. | ||||
| 		} | ||||
|  | ||||
| 		// Unmarshal field name. | ||||
| 		pkey, err := d.unmarshalMapKey(tok, fd.MapKey()) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		// Check for duplicate field name. | ||||
| 		if mmap.Has(pkey) { | ||||
| 			return d.newError(tok.Pos(), "duplicate map key %v", tok.RawString()) | ||||
| 		} | ||||
|  | ||||
| 		// Read and unmarshal field value. | ||||
| 		pval, err := unmarshalMapValue() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		mmap.Set(pkey, pval) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // unmarshalMapKey converts given token of Name kind into a protoreflect.MapKey. | ||||
| // A map key type is any integral or string type. | ||||
| func (d decoder) unmarshalMapKey(tok json.Token, fd pref.FieldDescriptor) (pref.MapKey, error) { | ||||
| 	const b32 = 32 | ||||
| 	const b64 = 64 | ||||
| 	const base10 = 10 | ||||
|  | ||||
| 	name := tok.Name() | ||||
| 	kind := fd.Kind() | ||||
| 	switch kind { | ||||
| 	case pref.StringKind: | ||||
| 		return pref.ValueOfString(name).MapKey(), nil | ||||
|  | ||||
| 	case pref.BoolKind: | ||||
| 		switch name { | ||||
| 		case "true": | ||||
| 			return pref.ValueOfBool(true).MapKey(), nil | ||||
| 		case "false": | ||||
| 			return pref.ValueOfBool(false).MapKey(), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: | ||||
| 		if n, err := strconv.ParseInt(name, base10, b32); err == nil { | ||||
| 			return pref.ValueOfInt32(int32(n)).MapKey(), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: | ||||
| 		if n, err := strconv.ParseInt(name, base10, b64); err == nil { | ||||
| 			return pref.ValueOfInt64(int64(n)).MapKey(), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.Uint32Kind, pref.Fixed32Kind: | ||||
| 		if n, err := strconv.ParseUint(name, base10, b32); err == nil { | ||||
| 			return pref.ValueOfUint32(uint32(n)).MapKey(), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.Uint64Kind, pref.Fixed64Kind: | ||||
| 		if n, err := strconv.ParseUint(name, base10, b64); err == nil { | ||||
| 			return pref.ValueOfUint64(uint64(n)).MapKey(), nil | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("invalid kind for map key: %v", kind)) | ||||
| 	} | ||||
|  | ||||
| 	return pref.MapKey{}, d.newError(tok.Pos(), "invalid value for %v key: %s", kind, tok.RawString()) | ||||
| } | ||||
							
								
								
									
										11
									
								
								vendor/google.golang.org/protobuf/encoding/protojson/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								vendor/google.golang.org/protobuf/encoding/protojson/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| // 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 protojson marshals and unmarshals protocol buffer messages as JSON | ||||
| // format. It follows the guide at | ||||
| // https://developers.google.com/protocol-buffers/docs/proto3#json. | ||||
| // | ||||
| // This package produces a different output than the standard "encoding/json" | ||||
| // package, which does not operate correctly on protocol buffer messages. | ||||
| package protojson | ||||
							
								
								
									
										344
									
								
								vendor/google.golang.org/protobuf/encoding/protojson/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										344
									
								
								vendor/google.golang.org/protobuf/encoding/protojson/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,344 @@ | ||||
| // 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 protojson | ||||
|  | ||||
| import ( | ||||
| 	"encoding/base64" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/encoding/json" | ||||
| 	"google.golang.org/protobuf/internal/encoding/messageset" | ||||
| 	"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/order" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	"google.golang.org/protobuf/reflect/protoregistry" | ||||
| ) | ||||
|  | ||||
| const defaultIndent = "  " | ||||
|  | ||||
| // Format formats the message as a multiline string. | ||||
| // This function is only intended for human consumption and ignores errors. | ||||
| // Do not depend on the output being stable. It may change over time across | ||||
| // different versions of the program. | ||||
| func Format(m proto.Message) string { | ||||
| 	return MarshalOptions{Multiline: true}.Format(m) | ||||
| } | ||||
|  | ||||
| // Marshal writes the given proto.Message in JSON format using default options. | ||||
| // Do not depend on the output being stable. It may change over time across | ||||
| // different versions of the program. | ||||
| func Marshal(m proto.Message) ([]byte, error) { | ||||
| 	return MarshalOptions{}.Marshal(m) | ||||
| } | ||||
|  | ||||
| // MarshalOptions is a configurable JSON format marshaler. | ||||
| type MarshalOptions struct { | ||||
| 	pragma.NoUnkeyedLiterals | ||||
|  | ||||
| 	// Multiline specifies whether the marshaler should format the output in | ||||
| 	// indented-form with every textual element on a new line. | ||||
| 	// If Indent is an empty string, then an arbitrary indent is chosen. | ||||
| 	Multiline bool | ||||
|  | ||||
| 	// Indent specifies the set of indentation characters to use in a multiline | ||||
| 	// formatted output such that every entry is preceded by Indent and | ||||
| 	// terminated by a newline. If non-empty, then Multiline is treated as true. | ||||
| 	// Indent can only be composed of space or tab characters. | ||||
| 	Indent string | ||||
|  | ||||
| 	// AllowPartial allows messages that have missing required fields to marshal | ||||
| 	// without returning an error. If AllowPartial is false (the default), | ||||
| 	// Marshal will return error if there are any missing required fields. | ||||
| 	AllowPartial bool | ||||
|  | ||||
| 	// UseProtoNames uses proto field name instead of lowerCamelCase name in JSON | ||||
| 	// field names. | ||||
| 	UseProtoNames bool | ||||
|  | ||||
| 	// UseEnumNumbers emits enum values as numbers. | ||||
| 	UseEnumNumbers bool | ||||
|  | ||||
| 	// EmitUnpopulated specifies whether to emit unpopulated fields. It does not | ||||
| 	// emit unpopulated oneof fields or unpopulated extension fields. | ||||
| 	// The JSON value emitted for unpopulated fields are as follows: | ||||
| 	//  ╔═══════╤════════════════════════════╗ | ||||
| 	//  ║ JSON  │ Protobuf field             ║ | ||||
| 	//  ╠═══════╪════════════════════════════╣ | ||||
| 	//  ║ false │ proto3 boolean fields      ║ | ||||
| 	//  ║ 0     │ proto3 numeric fields      ║ | ||||
| 	//  ║ ""    │ proto3 string/bytes fields ║ | ||||
| 	//  ║ null  │ proto2 scalar fields       ║ | ||||
| 	//  ║ null  │ message fields             ║ | ||||
| 	//  ║ []    │ list fields                ║ | ||||
| 	//  ║ {}    │ map fields                 ║ | ||||
| 	//  ╚═══════╧════════════════════════════╝ | ||||
| 	EmitUnpopulated bool | ||||
|  | ||||
| 	// Resolver is used for looking up types when expanding google.protobuf.Any | ||||
| 	// messages. If nil, this defaults to using protoregistry.GlobalTypes. | ||||
| 	Resolver interface { | ||||
| 		protoregistry.ExtensionTypeResolver | ||||
| 		protoregistry.MessageTypeResolver | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Format formats the message as a string. | ||||
| // This method is only intended for human consumption and ignores errors. | ||||
| // Do not depend on the output being stable. It may change over time across | ||||
| // different versions of the program. | ||||
| func (o MarshalOptions) Format(m proto.Message) string { | ||||
| 	if m == nil || !m.ProtoReflect().IsValid() { | ||||
| 		return "<nil>" // invalid syntax, but okay since this is for debugging | ||||
| 	} | ||||
| 	o.AllowPartial = true | ||||
| 	b, _ := o.Marshal(m) | ||||
| 	return string(b) | ||||
| } | ||||
|  | ||||
| // Marshal marshals the given proto.Message in the JSON format using options in | ||||
| // MarshalOptions. Do not depend on the output being stable. It may change over | ||||
| // time across different versions of the program. | ||||
| func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) { | ||||
| 	return o.marshal(m) | ||||
| } | ||||
|  | ||||
| // marshal is a centralized function that all marshal operations go through. | ||||
| // For profiling purposes, avoid changing the name of this function or | ||||
| // introducing other code paths for marshal that do not go through this. | ||||
| func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) { | ||||
| 	if o.Multiline && o.Indent == "" { | ||||
| 		o.Indent = defaultIndent | ||||
| 	} | ||||
| 	if o.Resolver == nil { | ||||
| 		o.Resolver = protoregistry.GlobalTypes | ||||
| 	} | ||||
|  | ||||
| 	internalEnc, err := json.NewEncoder(o.Indent) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// Treat nil message interface as an empty message, | ||||
| 	// in which case the output in an empty JSON object. | ||||
| 	if m == nil { | ||||
| 		return []byte("{}"), nil | ||||
| 	} | ||||
|  | ||||
| 	enc := encoder{internalEnc, o} | ||||
| 	if err := enc.marshalMessage(m.ProtoReflect(), ""); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if o.AllowPartial { | ||||
| 		return enc.Bytes(), nil | ||||
| 	} | ||||
| 	return enc.Bytes(), proto.CheckInitialized(m) | ||||
| } | ||||
|  | ||||
| type encoder struct { | ||||
| 	*json.Encoder | ||||
| 	opts MarshalOptions | ||||
| } | ||||
|  | ||||
| // typeFieldDesc is a synthetic field descriptor used for the "@type" field. | ||||
| var typeFieldDesc = func() protoreflect.FieldDescriptor { | ||||
| 	var fd filedesc.Field | ||||
| 	fd.L0.FullName = "@type" | ||||
| 	fd.L0.Index = -1 | ||||
| 	fd.L1.Cardinality = protoreflect.Optional | ||||
| 	fd.L1.Kind = protoreflect.StringKind | ||||
| 	return &fd | ||||
| }() | ||||
|  | ||||
| // typeURLFieldRanger wraps a protoreflect.Message and modifies its Range method | ||||
| // to additionally iterate over a synthetic field for the type URL. | ||||
| type typeURLFieldRanger struct { | ||||
| 	order.FieldRanger | ||||
| 	typeURL string | ||||
| } | ||||
|  | ||||
| func (m typeURLFieldRanger) Range(f func(pref.FieldDescriptor, pref.Value) bool) { | ||||
| 	if !f(typeFieldDesc, pref.ValueOfString(m.typeURL)) { | ||||
| 		return | ||||
| 	} | ||||
| 	m.FieldRanger.Range(f) | ||||
| } | ||||
|  | ||||
| // unpopulatedFieldRanger wraps a protoreflect.Message and modifies its Range | ||||
| // method to additionally iterate over unpopulated fields. | ||||
| type unpopulatedFieldRanger struct{ pref.Message } | ||||
|  | ||||
| func (m unpopulatedFieldRanger) Range(f func(pref.FieldDescriptor, pref.Value) bool) { | ||||
| 	fds := m.Descriptor().Fields() | ||||
| 	for i := 0; i < fds.Len(); i++ { | ||||
| 		fd := fds.Get(i) | ||||
| 		if m.Has(fd) || fd.ContainingOneof() != nil { | ||||
| 			continue // ignore populated fields and fields within a oneofs | ||||
| 		} | ||||
|  | ||||
| 		v := m.Get(fd) | ||||
| 		isProto2Scalar := fd.Syntax() == pref.Proto2 && fd.Default().IsValid() | ||||
| 		isSingularMessage := fd.Cardinality() != pref.Repeated && fd.Message() != nil | ||||
| 		if isProto2Scalar || isSingularMessage { | ||||
| 			v = pref.Value{} // use invalid value to emit null | ||||
| 		} | ||||
| 		if !f(fd, v) { | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 	m.Message.Range(f) | ||||
| } | ||||
|  | ||||
| // marshalMessage marshals the fields in the given protoreflect.Message. | ||||
| // If the typeURL is non-empty, then a synthetic "@type" field is injected | ||||
| // containing the URL as the value. | ||||
| func (e encoder) marshalMessage(m pref.Message, typeURL string) error { | ||||
| 	if !flags.ProtoLegacy && messageset.IsMessageSet(m.Descriptor()) { | ||||
| 		return errors.New("no support for proto1 MessageSets") | ||||
| 	} | ||||
|  | ||||
| 	if marshal := wellKnownTypeMarshaler(m.Descriptor().FullName()); marshal != nil { | ||||
| 		return marshal(e, m) | ||||
| 	} | ||||
|  | ||||
| 	e.StartObject() | ||||
| 	defer e.EndObject() | ||||
|  | ||||
| 	var fields order.FieldRanger = m | ||||
| 	if e.opts.EmitUnpopulated { | ||||
| 		fields = unpopulatedFieldRanger{m} | ||||
| 	} | ||||
| 	if typeURL != "" { | ||||
| 		fields = typeURLFieldRanger{fields, typeURL} | ||||
| 	} | ||||
|  | ||||
| 	var err error | ||||
| 	order.RangeFields(fields, order.IndexNameFieldOrder, func(fd pref.FieldDescriptor, v pref.Value) bool { | ||||
| 		name := fd.JSONName() | ||||
| 		if e.opts.UseProtoNames { | ||||
| 			name = fd.TextName() | ||||
| 		} | ||||
|  | ||||
| 		if err = e.WriteName(name); err != nil { | ||||
| 			return false | ||||
| 		} | ||||
| 		if err = e.marshalValue(v, fd); err != nil { | ||||
| 			return false | ||||
| 		} | ||||
| 		return true | ||||
| 	}) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // marshalValue marshals the given protoreflect.Value. | ||||
| func (e encoder) marshalValue(val pref.Value, fd pref.FieldDescriptor) error { | ||||
| 	switch { | ||||
| 	case fd.IsList(): | ||||
| 		return e.marshalList(val.List(), fd) | ||||
| 	case fd.IsMap(): | ||||
| 		return e.marshalMap(val.Map(), fd) | ||||
| 	default: | ||||
| 		return e.marshalSingular(val, fd) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // marshalSingular marshals the given non-repeated field value. This includes | ||||
| // all scalar types, enums, messages, and groups. | ||||
| func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error { | ||||
| 	if !val.IsValid() { | ||||
| 		e.WriteNull() | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	switch kind := fd.Kind(); kind { | ||||
| 	case pref.BoolKind: | ||||
| 		e.WriteBool(val.Bool()) | ||||
|  | ||||
| 	case pref.StringKind: | ||||
| 		if e.WriteString(val.String()) != nil { | ||||
| 			return errors.InvalidUTF8(string(fd.FullName())) | ||||
| 		} | ||||
|  | ||||
| 	case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: | ||||
| 		e.WriteInt(val.Int()) | ||||
|  | ||||
| 	case pref.Uint32Kind, pref.Fixed32Kind: | ||||
| 		e.WriteUint(val.Uint()) | ||||
|  | ||||
| 	case pref.Int64Kind, pref.Sint64Kind, pref.Uint64Kind, | ||||
| 		pref.Sfixed64Kind, pref.Fixed64Kind: | ||||
| 		// 64-bit integers are written out as JSON string. | ||||
| 		e.WriteString(val.String()) | ||||
|  | ||||
| 	case pref.FloatKind: | ||||
| 		// Encoder.WriteFloat handles the special numbers NaN and infinites. | ||||
| 		e.WriteFloat(val.Float(), 32) | ||||
|  | ||||
| 	case pref.DoubleKind: | ||||
| 		// Encoder.WriteFloat handles the special numbers NaN and infinites. | ||||
| 		e.WriteFloat(val.Float(), 64) | ||||
|  | ||||
| 	case pref.BytesKind: | ||||
| 		e.WriteString(base64.StdEncoding.EncodeToString(val.Bytes())) | ||||
|  | ||||
| 	case pref.EnumKind: | ||||
| 		if fd.Enum().FullName() == genid.NullValue_enum_fullname { | ||||
| 			e.WriteNull() | ||||
| 		} else { | ||||
| 			desc := fd.Enum().Values().ByNumber(val.Enum()) | ||||
| 			if e.opts.UseEnumNumbers || desc == nil { | ||||
| 				e.WriteInt(int64(val.Enum())) | ||||
| 			} else { | ||||
| 				e.WriteString(string(desc.Name())) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	case pref.MessageKind, pref.GroupKind: | ||||
| 		if err := e.marshalMessage(val.Message(), ""); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("%v has unknown kind: %v", fd.FullName(), kind)) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // marshalList marshals the given protoreflect.List. | ||||
| func (e encoder) marshalList(list pref.List, fd pref.FieldDescriptor) error { | ||||
| 	e.StartArray() | ||||
| 	defer e.EndArray() | ||||
|  | ||||
| 	for i := 0; i < list.Len(); i++ { | ||||
| 		item := list.Get(i) | ||||
| 		if err := e.marshalSingular(item, fd); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // marshalMap marshals given protoreflect.Map. | ||||
| func (e encoder) marshalMap(mmap pref.Map, fd pref.FieldDescriptor) error { | ||||
| 	e.StartObject() | ||||
| 	defer e.EndObject() | ||||
|  | ||||
| 	var err error | ||||
| 	order.RangeEntries(mmap, order.GenericKeyOrder, func(k pref.MapKey, v pref.Value) bool { | ||||
| 		if err = e.WriteName(k.String()); err != nil { | ||||
| 			return false | ||||
| 		} | ||||
| 		if err = e.marshalSingular(v, fd.MapValue()); err != nil { | ||||
| 			return false | ||||
| 		} | ||||
| 		return true | ||||
| 	}) | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										889
									
								
								vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										889
									
								
								vendor/google.golang.org/protobuf/encoding/protojson/well_known_types.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,889 @@ | ||||
| // 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 protojson | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"math" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/encoding/json" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| type marshalFunc func(encoder, pref.Message) error | ||||
|  | ||||
| // wellKnownTypeMarshaler returns a marshal function if the message type | ||||
| // has specialized serialization behavior. It returns nil otherwise. | ||||
| func wellKnownTypeMarshaler(name pref.FullName) marshalFunc { | ||||
| 	if name.Parent() == genid.GoogleProtobuf_package { | ||||
| 		switch name.Name() { | ||||
| 		case genid.Any_message_name: | ||||
| 			return encoder.marshalAny | ||||
| 		case genid.Timestamp_message_name: | ||||
| 			return encoder.marshalTimestamp | ||||
| 		case genid.Duration_message_name: | ||||
| 			return encoder.marshalDuration | ||||
| 		case genid.BoolValue_message_name, | ||||
| 			genid.Int32Value_message_name, | ||||
| 			genid.Int64Value_message_name, | ||||
| 			genid.UInt32Value_message_name, | ||||
| 			genid.UInt64Value_message_name, | ||||
| 			genid.FloatValue_message_name, | ||||
| 			genid.DoubleValue_message_name, | ||||
| 			genid.StringValue_message_name, | ||||
| 			genid.BytesValue_message_name: | ||||
| 			return encoder.marshalWrapperType | ||||
| 		case genid.Struct_message_name: | ||||
| 			return encoder.marshalStruct | ||||
| 		case genid.ListValue_message_name: | ||||
| 			return encoder.marshalListValue | ||||
| 		case genid.Value_message_name: | ||||
| 			return encoder.marshalKnownValue | ||||
| 		case genid.FieldMask_message_name: | ||||
| 			return encoder.marshalFieldMask | ||||
| 		case genid.Empty_message_name: | ||||
| 			return encoder.marshalEmpty | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type unmarshalFunc func(decoder, pref.Message) error | ||||
|  | ||||
| // wellKnownTypeUnmarshaler returns a unmarshal function if the message type | ||||
| // has specialized serialization behavior. It returns nil otherwise. | ||||
| func wellKnownTypeUnmarshaler(name pref.FullName) unmarshalFunc { | ||||
| 	if name.Parent() == genid.GoogleProtobuf_package { | ||||
| 		switch name.Name() { | ||||
| 		case genid.Any_message_name: | ||||
| 			return decoder.unmarshalAny | ||||
| 		case genid.Timestamp_message_name: | ||||
| 			return decoder.unmarshalTimestamp | ||||
| 		case genid.Duration_message_name: | ||||
| 			return decoder.unmarshalDuration | ||||
| 		case genid.BoolValue_message_name, | ||||
| 			genid.Int32Value_message_name, | ||||
| 			genid.Int64Value_message_name, | ||||
| 			genid.UInt32Value_message_name, | ||||
| 			genid.UInt64Value_message_name, | ||||
| 			genid.FloatValue_message_name, | ||||
| 			genid.DoubleValue_message_name, | ||||
| 			genid.StringValue_message_name, | ||||
| 			genid.BytesValue_message_name: | ||||
| 			return decoder.unmarshalWrapperType | ||||
| 		case genid.Struct_message_name: | ||||
| 			return decoder.unmarshalStruct | ||||
| 		case genid.ListValue_message_name: | ||||
| 			return decoder.unmarshalListValue | ||||
| 		case genid.Value_message_name: | ||||
| 			return decoder.unmarshalKnownValue | ||||
| 		case genid.FieldMask_message_name: | ||||
| 			return decoder.unmarshalFieldMask | ||||
| 		case genid.Empty_message_name: | ||||
| 			return decoder.unmarshalEmpty | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // The JSON representation of an Any message uses the regular representation of | ||||
| // the deserialized, embedded message, with an additional field `@type` which | ||||
| // contains the type URL. If the embedded message type is well-known and has a | ||||
| // custom JSON representation, that representation will be embedded adding a | ||||
| // field `value` which holds the custom JSON in addition to the `@type` field. | ||||
|  | ||||
| func (e encoder) marshalAny(m pref.Message) error { | ||||
| 	fds := m.Descriptor().Fields() | ||||
| 	fdType := fds.ByNumber(genid.Any_TypeUrl_field_number) | ||||
| 	fdValue := fds.ByNumber(genid.Any_Value_field_number) | ||||
|  | ||||
| 	if !m.Has(fdType) { | ||||
| 		if !m.Has(fdValue) { | ||||
| 			// If message is empty, marshal out empty JSON object. | ||||
| 			e.StartObject() | ||||
| 			e.EndObject() | ||||
| 			return nil | ||||
| 		} else { | ||||
| 			// Return error if type_url field is not set, but value is set. | ||||
| 			return errors.New("%s: %v is not set", genid.Any_message_fullname, genid.Any_TypeUrl_field_name) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	typeVal := m.Get(fdType) | ||||
| 	valueVal := m.Get(fdValue) | ||||
|  | ||||
| 	// Resolve the type in order to unmarshal value field. | ||||
| 	typeURL := typeVal.String() | ||||
| 	emt, err := e.opts.Resolver.FindMessageByURL(typeURL) | ||||
| 	if err != nil { | ||||
| 		return errors.New("%s: unable to resolve %q: %v", genid.Any_message_fullname, typeURL, err) | ||||
| 	} | ||||
|  | ||||
| 	em := emt.New() | ||||
| 	err = proto.UnmarshalOptions{ | ||||
| 		AllowPartial: true, // never check required fields inside an Any | ||||
| 		Resolver:     e.opts.Resolver, | ||||
| 	}.Unmarshal(valueVal.Bytes(), em.Interface()) | ||||
| 	if err != nil { | ||||
| 		return errors.New("%s: unable to unmarshal %q: %v", genid.Any_message_fullname, typeURL, err) | ||||
| 	} | ||||
|  | ||||
| 	// If type of value has custom JSON encoding, marshal out a field "value" | ||||
| 	// with corresponding custom JSON encoding of the embedded message as a | ||||
| 	// field. | ||||
| 	if marshal := wellKnownTypeMarshaler(emt.Descriptor().FullName()); marshal != nil { | ||||
| 		e.StartObject() | ||||
| 		defer e.EndObject() | ||||
|  | ||||
| 		// Marshal out @type field. | ||||
| 		e.WriteName("@type") | ||||
| 		if err := e.WriteString(typeURL); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		e.WriteName("value") | ||||
| 		return marshal(e, em) | ||||
| 	} | ||||
|  | ||||
| 	// Else, marshal out the embedded message's fields in this Any object. | ||||
| 	if err := e.marshalMessage(em, typeURL); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (d decoder) unmarshalAny(m pref.Message) error { | ||||
| 	// Peek to check for json.ObjectOpen to avoid advancing a read. | ||||
| 	start, err := d.Peek() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if start.Kind() != json.ObjectOpen { | ||||
| 		return d.unexpectedTokenError(start) | ||||
| 	} | ||||
|  | ||||
| 	// Use another decoder to parse the unread bytes for @type field. This | ||||
| 	// avoids advancing a read from current decoder because the current JSON | ||||
| 	// object may contain the fields of the embedded type. | ||||
| 	dec := decoder{d.Clone(), UnmarshalOptions{}} | ||||
| 	tok, err := findTypeURL(dec) | ||||
| 	switch err { | ||||
| 	case errEmptyObject: | ||||
| 		// An empty JSON object translates to an empty Any message. | ||||
| 		d.Read() // Read json.ObjectOpen. | ||||
| 		d.Read() // Read json.ObjectClose. | ||||
| 		return nil | ||||
|  | ||||
| 	case errMissingType: | ||||
| 		if d.opts.DiscardUnknown { | ||||
| 			// Treat all fields as unknowns, similar to an empty object. | ||||
| 			return d.skipJSONValue() | ||||
| 		} | ||||
| 		// Use start.Pos() for line position. | ||||
| 		return d.newError(start.Pos(), err.Error()) | ||||
|  | ||||
| 	default: | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	typeURL := tok.ParsedString() | ||||
| 	emt, err := d.opts.Resolver.FindMessageByURL(typeURL) | ||||
| 	if err != nil { | ||||
| 		return d.newError(tok.Pos(), "unable to resolve %v: %q", tok.RawString(), err) | ||||
| 	} | ||||
|  | ||||
| 	// Create new message for the embedded message type and unmarshal into it. | ||||
| 	em := emt.New() | ||||
| 	if unmarshal := wellKnownTypeUnmarshaler(emt.Descriptor().FullName()); unmarshal != nil { | ||||
| 		// If embedded message is a custom type, | ||||
| 		// unmarshal the JSON "value" field into it. | ||||
| 		if err := d.unmarshalAnyValue(unmarshal, em); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} else { | ||||
| 		// Else unmarshal the current JSON object into it. | ||||
| 		if err := d.unmarshalMessage(em, true); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	// Serialize the embedded message and assign the resulting bytes to the | ||||
| 	// proto value field. | ||||
| 	b, err := proto.MarshalOptions{ | ||||
| 		AllowPartial:  true, // No need to check required fields inside an Any. | ||||
| 		Deterministic: true, | ||||
| 	}.Marshal(em.Interface()) | ||||
| 	if err != nil { | ||||
| 		return d.newError(start.Pos(), "error in marshaling Any.value field: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	fds := m.Descriptor().Fields() | ||||
| 	fdType := fds.ByNumber(genid.Any_TypeUrl_field_number) | ||||
| 	fdValue := fds.ByNumber(genid.Any_Value_field_number) | ||||
|  | ||||
| 	m.Set(fdType, pref.ValueOfString(typeURL)) | ||||
| 	m.Set(fdValue, pref.ValueOfBytes(b)) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| var errEmptyObject = fmt.Errorf(`empty object`) | ||||
| var errMissingType = fmt.Errorf(`missing "@type" field`) | ||||
|  | ||||
| // findTypeURL returns the token for the "@type" field value from the given | ||||
| // JSON bytes. It is expected that the given bytes start with json.ObjectOpen. | ||||
| // It returns errEmptyObject if the JSON object is empty or errMissingType if | ||||
| // @type field does not exist. It returns other error if the @type field is not | ||||
| // valid or other decoding issues. | ||||
| func findTypeURL(d decoder) (json.Token, error) { | ||||
| 	var typeURL string | ||||
| 	var typeTok json.Token | ||||
| 	numFields := 0 | ||||
| 	// Skip start object. | ||||
| 	d.Read() | ||||
|  | ||||
| Loop: | ||||
| 	for { | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return json.Token{}, err | ||||
| 		} | ||||
|  | ||||
| 		switch tok.Kind() { | ||||
| 		case json.ObjectClose: | ||||
| 			if typeURL == "" { | ||||
| 				// Did not find @type field. | ||||
| 				if numFields > 0 { | ||||
| 					return json.Token{}, errMissingType | ||||
| 				} | ||||
| 				return json.Token{}, errEmptyObject | ||||
| 			} | ||||
| 			break Loop | ||||
|  | ||||
| 		case json.Name: | ||||
| 			numFields++ | ||||
| 			if tok.Name() != "@type" { | ||||
| 				// Skip value. | ||||
| 				if err := d.skipJSONValue(); err != nil { | ||||
| 					return json.Token{}, err | ||||
| 				} | ||||
| 				continue | ||||
| 			} | ||||
|  | ||||
| 			// Return error if this was previously set already. | ||||
| 			if typeURL != "" { | ||||
| 				return json.Token{}, d.newError(tok.Pos(), `duplicate "@type" field`) | ||||
| 			} | ||||
| 			// Read field value. | ||||
| 			tok, err := d.Read() | ||||
| 			if err != nil { | ||||
| 				return json.Token{}, err | ||||
| 			} | ||||
| 			if tok.Kind() != json.String { | ||||
| 				return json.Token{}, d.newError(tok.Pos(), `@type field value is not a string: %v`, tok.RawString()) | ||||
| 			} | ||||
| 			typeURL = tok.ParsedString() | ||||
| 			if typeURL == "" { | ||||
| 				return json.Token{}, d.newError(tok.Pos(), `@type field contains empty value`) | ||||
| 			} | ||||
| 			typeTok = tok | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return typeTok, nil | ||||
| } | ||||
|  | ||||
| // skipJSONValue parses a JSON value (null, boolean, string, number, object and | ||||
| // array) in order to advance the read to the next JSON value. It relies on | ||||
| // the decoder returning an error if the types are not in valid sequence. | ||||
| func (d decoder) skipJSONValue() error { | ||||
| 	tok, err := d.Read() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	// Only need to continue reading for objects and arrays. | ||||
| 	switch tok.Kind() { | ||||
| 	case json.ObjectOpen: | ||||
| 		for { | ||||
| 			tok, err := d.Read() | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			switch tok.Kind() { | ||||
| 			case json.ObjectClose: | ||||
| 				return nil | ||||
| 			case json.Name: | ||||
| 				// Skip object field value. | ||||
| 				if err := d.skipJSONValue(); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	case json.ArrayOpen: | ||||
| 		for { | ||||
| 			tok, err := d.Peek() | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			switch tok.Kind() { | ||||
| 			case json.ArrayClose: | ||||
| 				d.Read() | ||||
| 				return nil | ||||
| 			default: | ||||
| 				// Skip array item. | ||||
| 				if err := d.skipJSONValue(); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // unmarshalAnyValue unmarshals the given custom-type message from the JSON | ||||
| // object's "value" field. | ||||
| func (d decoder) unmarshalAnyValue(unmarshal unmarshalFunc, m pref.Message) error { | ||||
| 	// Skip ObjectOpen, and start reading the fields. | ||||
| 	d.Read() | ||||
|  | ||||
| 	var found bool // Used for detecting duplicate "value". | ||||
| 	for { | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		switch tok.Kind() { | ||||
| 		case json.ObjectClose: | ||||
| 			if !found { | ||||
| 				return d.newError(tok.Pos(), `missing "value" field`) | ||||
| 			} | ||||
| 			return nil | ||||
|  | ||||
| 		case json.Name: | ||||
| 			switch tok.Name() { | ||||
| 			case "@type": | ||||
| 				// Skip the value as this was previously parsed already. | ||||
| 				d.Read() | ||||
|  | ||||
| 			case "value": | ||||
| 				if found { | ||||
| 					return d.newError(tok.Pos(), `duplicate "value" field`) | ||||
| 				} | ||||
| 				// Unmarshal the field value into the given message. | ||||
| 				if err := unmarshal(d, m); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				found = true | ||||
|  | ||||
| 			default: | ||||
| 				if d.opts.DiscardUnknown { | ||||
| 					if err := d.skipJSONValue(); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					continue | ||||
| 				} | ||||
| 				return d.newError(tok.Pos(), "unknown field %v", tok.RawString()) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Wrapper types are encoded as JSON primitives like string, number or boolean. | ||||
|  | ||||
| func (e encoder) marshalWrapperType(m pref.Message) error { | ||||
| 	fd := m.Descriptor().Fields().ByNumber(genid.WrapperValue_Value_field_number) | ||||
| 	val := m.Get(fd) | ||||
| 	return e.marshalSingular(val, fd) | ||||
| } | ||||
|  | ||||
| func (d decoder) unmarshalWrapperType(m pref.Message) error { | ||||
| 	fd := m.Descriptor().Fields().ByNumber(genid.WrapperValue_Value_field_number) | ||||
| 	val, err := d.unmarshalScalar(fd) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	m.Set(fd, val) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // The JSON representation for Empty is an empty JSON object. | ||||
|  | ||||
| func (e encoder) marshalEmpty(pref.Message) error { | ||||
| 	e.StartObject() | ||||
| 	e.EndObject() | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (d decoder) unmarshalEmpty(pref.Message) error { | ||||
| 	tok, err := d.Read() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if tok.Kind() != json.ObjectOpen { | ||||
| 		return d.unexpectedTokenError(tok) | ||||
| 	} | ||||
|  | ||||
| 	for { | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		switch tok.Kind() { | ||||
| 		case json.ObjectClose: | ||||
| 			return nil | ||||
|  | ||||
| 		case json.Name: | ||||
| 			if d.opts.DiscardUnknown { | ||||
| 				if err := d.skipJSONValue(); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				continue | ||||
| 			} | ||||
| 			return d.newError(tok.Pos(), "unknown field %v", tok.RawString()) | ||||
|  | ||||
| 		default: | ||||
| 			return d.unexpectedTokenError(tok) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // The JSON representation for Struct is a JSON object that contains the encoded | ||||
| // Struct.fields map and follows the serialization rules for a map. | ||||
|  | ||||
| func (e encoder) marshalStruct(m pref.Message) error { | ||||
| 	fd := m.Descriptor().Fields().ByNumber(genid.Struct_Fields_field_number) | ||||
| 	return e.marshalMap(m.Get(fd).Map(), fd) | ||||
| } | ||||
|  | ||||
| func (d decoder) unmarshalStruct(m pref.Message) error { | ||||
| 	fd := m.Descriptor().Fields().ByNumber(genid.Struct_Fields_field_number) | ||||
| 	return d.unmarshalMap(m.Mutable(fd).Map(), fd) | ||||
| } | ||||
|  | ||||
| // The JSON representation for ListValue is JSON array that contains the encoded | ||||
| // ListValue.values repeated field and follows the serialization rules for a | ||||
| // repeated field. | ||||
|  | ||||
| func (e encoder) marshalListValue(m pref.Message) error { | ||||
| 	fd := m.Descriptor().Fields().ByNumber(genid.ListValue_Values_field_number) | ||||
| 	return e.marshalList(m.Get(fd).List(), fd) | ||||
| } | ||||
|  | ||||
| func (d decoder) unmarshalListValue(m pref.Message) error { | ||||
| 	fd := m.Descriptor().Fields().ByNumber(genid.ListValue_Values_field_number) | ||||
| 	return d.unmarshalList(m.Mutable(fd).List(), fd) | ||||
| } | ||||
|  | ||||
| // The JSON representation for a Value is dependent on the oneof field that is | ||||
| // set. Each of the field in the oneof has its own custom serialization rule. A | ||||
| // Value message needs to be a oneof field set, else it is an error. | ||||
|  | ||||
| func (e encoder) marshalKnownValue(m pref.Message) error { | ||||
| 	od := m.Descriptor().Oneofs().ByName(genid.Value_Kind_oneof_name) | ||||
| 	fd := m.WhichOneof(od) | ||||
| 	if fd == nil { | ||||
| 		return errors.New("%s: none of the oneof fields is set", genid.Value_message_fullname) | ||||
| 	} | ||||
| 	if fd.Number() == genid.Value_NumberValue_field_number { | ||||
| 		if v := m.Get(fd).Float(); math.IsNaN(v) || math.IsInf(v, 0) { | ||||
| 			return errors.New("%s: invalid %v value", genid.Value_NumberValue_field_fullname, v) | ||||
| 		} | ||||
| 	} | ||||
| 	return e.marshalSingular(m.Get(fd), fd) | ||||
| } | ||||
|  | ||||
| func (d decoder) unmarshalKnownValue(m pref.Message) error { | ||||
| 	tok, err := d.Peek() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	var fd pref.FieldDescriptor | ||||
| 	var val pref.Value | ||||
| 	switch tok.Kind() { | ||||
| 	case json.Null: | ||||
| 		d.Read() | ||||
| 		fd = m.Descriptor().Fields().ByNumber(genid.Value_NullValue_field_number) | ||||
| 		val = pref.ValueOfEnum(0) | ||||
|  | ||||
| 	case json.Bool: | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		fd = m.Descriptor().Fields().ByNumber(genid.Value_BoolValue_field_number) | ||||
| 		val = pref.ValueOfBool(tok.Bool()) | ||||
|  | ||||
| 	case json.Number: | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		fd = m.Descriptor().Fields().ByNumber(genid.Value_NumberValue_field_number) | ||||
| 		var ok bool | ||||
| 		val, ok = unmarshalFloat(tok, 64) | ||||
| 		if !ok { | ||||
| 			return d.newError(tok.Pos(), "invalid %v: %v", genid.Value_message_fullname, tok.RawString()) | ||||
| 		} | ||||
|  | ||||
| 	case json.String: | ||||
| 		// A JSON string may have been encoded from the number_value field, | ||||
| 		// e.g. "NaN", "Infinity", etc. Parsing a proto double type also allows | ||||
| 		// for it to be in JSON string form. Given this custom encoding spec, | ||||
| 		// however, there is no way to identify that and hence a JSON string is | ||||
| 		// always assigned to the string_value field, which means that certain | ||||
| 		// encoding cannot be parsed back to the same field. | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		fd = m.Descriptor().Fields().ByNumber(genid.Value_StringValue_field_number) | ||||
| 		val = pref.ValueOfString(tok.ParsedString()) | ||||
|  | ||||
| 	case json.ObjectOpen: | ||||
| 		fd = m.Descriptor().Fields().ByNumber(genid.Value_StructValue_field_number) | ||||
| 		val = m.NewField(fd) | ||||
| 		if err := d.unmarshalStruct(val.Message()); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 	case json.ArrayOpen: | ||||
| 		fd = m.Descriptor().Fields().ByNumber(genid.Value_ListValue_field_number) | ||||
| 		val = m.NewField(fd) | ||||
| 		if err := d.unmarshalListValue(val.Message()); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		return d.newError(tok.Pos(), "invalid %v: %v", genid.Value_message_fullname, tok.RawString()) | ||||
| 	} | ||||
|  | ||||
| 	m.Set(fd, val) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // The JSON representation for a Duration is a JSON string that ends in the | ||||
| // suffix "s" (indicating seconds) and is preceded by the number of seconds, | ||||
| // with nanoseconds expressed as fractional seconds. | ||||
| // | ||||
| // Durations less than one second are represented with a 0 seconds field and a | ||||
| // positive or negative nanos field. For durations of one second or more, a | ||||
| // non-zero value for the nanos field must be of the same sign as the seconds | ||||
| // field. | ||||
| // | ||||
| // Duration.seconds must be from -315,576,000,000 to +315,576,000,000 inclusive. | ||||
| // Duration.nanos must be from -999,999,999 to +999,999,999 inclusive. | ||||
|  | ||||
| const ( | ||||
| 	secondsInNanos       = 999999999 | ||||
| 	maxSecondsInDuration = 315576000000 | ||||
| ) | ||||
|  | ||||
| func (e encoder) marshalDuration(m pref.Message) error { | ||||
| 	fds := m.Descriptor().Fields() | ||||
| 	fdSeconds := fds.ByNumber(genid.Duration_Seconds_field_number) | ||||
| 	fdNanos := fds.ByNumber(genid.Duration_Nanos_field_number) | ||||
|  | ||||
| 	secsVal := m.Get(fdSeconds) | ||||
| 	nanosVal := m.Get(fdNanos) | ||||
| 	secs := secsVal.Int() | ||||
| 	nanos := nanosVal.Int() | ||||
| 	if secs < -maxSecondsInDuration || secs > maxSecondsInDuration { | ||||
| 		return errors.New("%s: seconds out of range %v", genid.Duration_message_fullname, secs) | ||||
| 	} | ||||
| 	if nanos < -secondsInNanos || nanos > secondsInNanos { | ||||
| 		return errors.New("%s: nanos out of range %v", genid.Duration_message_fullname, nanos) | ||||
| 	} | ||||
| 	if (secs > 0 && nanos < 0) || (secs < 0 && nanos > 0) { | ||||
| 		return errors.New("%s: signs of seconds and nanos do not match", genid.Duration_message_fullname) | ||||
| 	} | ||||
| 	// Generated output always contains 0, 3, 6, or 9 fractional digits, | ||||
| 	// depending on required precision, followed by the suffix "s". | ||||
| 	var sign string | ||||
| 	if secs < 0 || nanos < 0 { | ||||
| 		sign, secs, nanos = "-", -1*secs, -1*nanos | ||||
| 	} | ||||
| 	x := fmt.Sprintf("%s%d.%09d", sign, secs, nanos) | ||||
| 	x = strings.TrimSuffix(x, "000") | ||||
| 	x = strings.TrimSuffix(x, "000") | ||||
| 	x = strings.TrimSuffix(x, ".000") | ||||
| 	e.WriteString(x + "s") | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (d decoder) unmarshalDuration(m pref.Message) error { | ||||
| 	tok, err := d.Read() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if tok.Kind() != json.String { | ||||
| 		return d.unexpectedTokenError(tok) | ||||
| 	} | ||||
|  | ||||
| 	secs, nanos, ok := parseDuration(tok.ParsedString()) | ||||
| 	if !ok { | ||||
| 		return d.newError(tok.Pos(), "invalid %v value %v", genid.Duration_message_fullname, tok.RawString()) | ||||
| 	} | ||||
| 	// Validate seconds. No need to validate nanos because parseDuration would | ||||
| 	// have covered that already. | ||||
| 	if secs < -maxSecondsInDuration || secs > maxSecondsInDuration { | ||||
| 		return d.newError(tok.Pos(), "%v value out of range: %v", genid.Duration_message_fullname, tok.RawString()) | ||||
| 	} | ||||
|  | ||||
| 	fds := m.Descriptor().Fields() | ||||
| 	fdSeconds := fds.ByNumber(genid.Duration_Seconds_field_number) | ||||
| 	fdNanos := fds.ByNumber(genid.Duration_Nanos_field_number) | ||||
|  | ||||
| 	m.Set(fdSeconds, pref.ValueOfInt64(secs)) | ||||
| 	m.Set(fdNanos, pref.ValueOfInt32(nanos)) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // parseDuration parses the given input string for seconds and nanoseconds value | ||||
| // for the Duration JSON format. The format is a decimal number with a suffix | ||||
| // 's'. It can have optional plus/minus sign. There needs to be at least an | ||||
| // integer or fractional part. Fractional part is limited to 9 digits only for | ||||
| // nanoseconds precision, regardless of whether there are trailing zero digits. | ||||
| // Example values are 1s, 0.1s, 1.s, .1s, +1s, -1s, -.1s. | ||||
| func parseDuration(input string) (int64, int32, bool) { | ||||
| 	b := []byte(input) | ||||
| 	size := len(b) | ||||
| 	if size < 2 { | ||||
| 		return 0, 0, false | ||||
| 	} | ||||
| 	if b[size-1] != 's' { | ||||
| 		return 0, 0, false | ||||
| 	} | ||||
| 	b = b[:size-1] | ||||
|  | ||||
| 	// Read optional plus/minus symbol. | ||||
| 	var neg bool | ||||
| 	switch b[0] { | ||||
| 	case '-': | ||||
| 		neg = true | ||||
| 		b = b[1:] | ||||
| 	case '+': | ||||
| 		b = b[1:] | ||||
| 	} | ||||
| 	if len(b) == 0 { | ||||
| 		return 0, 0, false | ||||
| 	} | ||||
|  | ||||
| 	// Read the integer part. | ||||
| 	var intp []byte | ||||
| 	switch { | ||||
| 	case b[0] == '0': | ||||
| 		b = b[1:] | ||||
|  | ||||
| 	case '1' <= b[0] && b[0] <= '9': | ||||
| 		intp = b[0:] | ||||
| 		b = b[1:] | ||||
| 		n := 1 | ||||
| 		for len(b) > 0 && '0' <= b[0] && b[0] <= '9' { | ||||
| 			n++ | ||||
| 			b = b[1:] | ||||
| 		} | ||||
| 		intp = intp[:n] | ||||
|  | ||||
| 	case b[0] == '.': | ||||
| 		// Continue below. | ||||
|  | ||||
| 	default: | ||||
| 		return 0, 0, false | ||||
| 	} | ||||
|  | ||||
| 	hasFrac := false | ||||
| 	var frac [9]byte | ||||
| 	if len(b) > 0 { | ||||
| 		if b[0] != '.' { | ||||
| 			return 0, 0, false | ||||
| 		} | ||||
| 		// Read the fractional part. | ||||
| 		b = b[1:] | ||||
| 		n := 0 | ||||
| 		for len(b) > 0 && n < 9 && '0' <= b[0] && b[0] <= '9' { | ||||
| 			frac[n] = b[0] | ||||
| 			n++ | ||||
| 			b = b[1:] | ||||
| 		} | ||||
| 		// It is not valid if there are more bytes left. | ||||
| 		if len(b) > 0 { | ||||
| 			return 0, 0, false | ||||
| 		} | ||||
| 		// Pad fractional part with 0s. | ||||
| 		for i := n; i < 9; i++ { | ||||
| 			frac[i] = '0' | ||||
| 		} | ||||
| 		hasFrac = true | ||||
| 	} | ||||
|  | ||||
| 	var secs int64 | ||||
| 	if len(intp) > 0 { | ||||
| 		var err error | ||||
| 		secs, err = strconv.ParseInt(string(intp), 10, 64) | ||||
| 		if err != nil { | ||||
| 			return 0, 0, false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	var nanos int64 | ||||
| 	if hasFrac { | ||||
| 		nanob := bytes.TrimLeft(frac[:], "0") | ||||
| 		if len(nanob) > 0 { | ||||
| 			var err error | ||||
| 			nanos, err = strconv.ParseInt(string(nanob), 10, 32) | ||||
| 			if err != nil { | ||||
| 				return 0, 0, false | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if neg { | ||||
| 		if secs > 0 { | ||||
| 			secs = -secs | ||||
| 		} | ||||
| 		if nanos > 0 { | ||||
| 			nanos = -nanos | ||||
| 		} | ||||
| 	} | ||||
| 	return secs, int32(nanos), true | ||||
| } | ||||
|  | ||||
| // The JSON representation for a Timestamp is a JSON string in the RFC 3339 | ||||
| // format, i.e. "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" where | ||||
| // {year} is always expressed using four digits while {month}, {day}, {hour}, | ||||
| // {min}, and {sec} are zero-padded to two digits each. The fractional seconds, | ||||
| // which can go up to 9 digits, up to 1 nanosecond resolution, is optional. The | ||||
| // "Z" suffix indicates the timezone ("UTC"); the timezone is required. Encoding | ||||
| // should always use UTC (as indicated by "Z") and a decoder should be able to | ||||
| // accept both UTC and other timezones (as indicated by an offset). | ||||
| // | ||||
| // Timestamp.seconds must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z | ||||
| // inclusive. | ||||
| // Timestamp.nanos must be from 0 to 999,999,999 inclusive. | ||||
|  | ||||
| const ( | ||||
| 	maxTimestampSeconds = 253402300799 | ||||
| 	minTimestampSeconds = -62135596800 | ||||
| ) | ||||
|  | ||||
| func (e encoder) marshalTimestamp(m pref.Message) error { | ||||
| 	fds := m.Descriptor().Fields() | ||||
| 	fdSeconds := fds.ByNumber(genid.Timestamp_Seconds_field_number) | ||||
| 	fdNanos := fds.ByNumber(genid.Timestamp_Nanos_field_number) | ||||
|  | ||||
| 	secsVal := m.Get(fdSeconds) | ||||
| 	nanosVal := m.Get(fdNanos) | ||||
| 	secs := secsVal.Int() | ||||
| 	nanos := nanosVal.Int() | ||||
| 	if secs < minTimestampSeconds || secs > maxTimestampSeconds { | ||||
| 		return errors.New("%s: seconds out of range %v", genid.Timestamp_message_fullname, secs) | ||||
| 	} | ||||
| 	if nanos < 0 || nanos > secondsInNanos { | ||||
| 		return errors.New("%s: nanos out of range %v", genid.Timestamp_message_fullname, nanos) | ||||
| 	} | ||||
| 	// Uses RFC 3339, where generated output will be Z-normalized and uses 0, 3, | ||||
| 	// 6 or 9 fractional digits. | ||||
| 	t := time.Unix(secs, nanos).UTC() | ||||
| 	x := t.Format("2006-01-02T15:04:05.000000000") | ||||
| 	x = strings.TrimSuffix(x, "000") | ||||
| 	x = strings.TrimSuffix(x, "000") | ||||
| 	x = strings.TrimSuffix(x, ".000") | ||||
| 	e.WriteString(x + "Z") | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (d decoder) unmarshalTimestamp(m pref.Message) error { | ||||
| 	tok, err := d.Read() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if tok.Kind() != json.String { | ||||
| 		return d.unexpectedTokenError(tok) | ||||
| 	} | ||||
|  | ||||
| 	t, err := time.Parse(time.RFC3339Nano, tok.ParsedString()) | ||||
| 	if err != nil { | ||||
| 		return d.newError(tok.Pos(), "invalid %v value %v", genid.Timestamp_message_fullname, tok.RawString()) | ||||
| 	} | ||||
| 	// Validate seconds. No need to validate nanos because time.Parse would have | ||||
| 	// covered that already. | ||||
| 	secs := t.Unix() | ||||
| 	if secs < minTimestampSeconds || secs > maxTimestampSeconds { | ||||
| 		return d.newError(tok.Pos(), "%v value out of range: %v", genid.Timestamp_message_fullname, tok.RawString()) | ||||
| 	} | ||||
|  | ||||
| 	fds := m.Descriptor().Fields() | ||||
| 	fdSeconds := fds.ByNumber(genid.Timestamp_Seconds_field_number) | ||||
| 	fdNanos := fds.ByNumber(genid.Timestamp_Nanos_field_number) | ||||
|  | ||||
| 	m.Set(fdSeconds, pref.ValueOfInt64(secs)) | ||||
| 	m.Set(fdNanos, pref.ValueOfInt32(int32(t.Nanosecond()))) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // The JSON representation for a FieldMask is a JSON string where paths are | ||||
| // separated by a comma. Fields name in each path are converted to/from | ||||
| // lower-camel naming conventions. Encoding should fail if the path name would | ||||
| // end up differently after a round-trip. | ||||
|  | ||||
| func (e encoder) marshalFieldMask(m pref.Message) error { | ||||
| 	fd := m.Descriptor().Fields().ByNumber(genid.FieldMask_Paths_field_number) | ||||
| 	list := m.Get(fd).List() | ||||
| 	paths := make([]string, 0, list.Len()) | ||||
|  | ||||
| 	for i := 0; i < list.Len(); i++ { | ||||
| 		s := list.Get(i).String() | ||||
| 		if !pref.FullName(s).IsValid() { | ||||
| 			return errors.New("%s contains invalid path: %q", genid.FieldMask_Paths_field_fullname, s) | ||||
| 		} | ||||
| 		// Return error if conversion to camelCase is not reversible. | ||||
| 		cc := strs.JSONCamelCase(s) | ||||
| 		if s != strs.JSONSnakeCase(cc) { | ||||
| 			return errors.New("%s contains irreversible value %q", genid.FieldMask_Paths_field_fullname, s) | ||||
| 		} | ||||
| 		paths = append(paths, cc) | ||||
| 	} | ||||
|  | ||||
| 	e.WriteString(strings.Join(paths, ",")) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (d decoder) unmarshalFieldMask(m pref.Message) error { | ||||
| 	tok, err := d.Read() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if tok.Kind() != json.String { | ||||
| 		return d.unexpectedTokenError(tok) | ||||
| 	} | ||||
| 	str := strings.TrimSpace(tok.ParsedString()) | ||||
| 	if str == "" { | ||||
| 		return nil | ||||
| 	} | ||||
| 	paths := strings.Split(str, ",") | ||||
|  | ||||
| 	fd := m.Descriptor().Fields().ByNumber(genid.FieldMask_Paths_field_number) | ||||
| 	list := m.Mutable(fd).List() | ||||
|  | ||||
| 	for _, s0 := range paths { | ||||
| 		s := strs.JSONSnakeCase(s0) | ||||
| 		if strings.Contains(s0, "_") || !pref.FullName(s).IsValid() { | ||||
| 			return d.newError(tok.Pos(), "%v contains invalid path: %q", genid.FieldMask_Paths_field_fullname, s0) | ||||
| 		} | ||||
| 		list.Append(pref.ValueOfString(s)) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										770
									
								
								vendor/google.golang.org/protobuf/encoding/prototext/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										770
									
								
								vendor/google.golang.org/protobuf/encoding/prototext/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,770 @@ | ||||
| // 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 prototext | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/encoding/messageset" | ||||
| 	"google.golang.org/protobuf/internal/encoding/text" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	"google.golang.org/protobuf/internal/flags" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	"google.golang.org/protobuf/internal/set" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	"google.golang.org/protobuf/reflect/protoregistry" | ||||
| ) | ||||
|  | ||||
| // Unmarshal reads the given []byte into the given proto.Message. | ||||
| // The provided message must be mutable (e.g., a non-nil pointer to a message). | ||||
| func Unmarshal(b []byte, m proto.Message) error { | ||||
| 	return UnmarshalOptions{}.Unmarshal(b, m) | ||||
| } | ||||
|  | ||||
| // UnmarshalOptions is a configurable textproto format unmarshaler. | ||||
| type UnmarshalOptions struct { | ||||
| 	pragma.NoUnkeyedLiterals | ||||
|  | ||||
| 	// AllowPartial accepts input for messages that will result in missing | ||||
| 	// required fields. If AllowPartial is false (the default), Unmarshal will | ||||
| 	// return error if there are any missing required fields. | ||||
| 	AllowPartial bool | ||||
|  | ||||
| 	// DiscardUnknown specifies whether to ignore unknown fields when parsing. | ||||
| 	// An unknown field is any field whose field name or field number does not | ||||
| 	// resolve to any known or extension field in the message. | ||||
| 	// By default, unmarshal rejects unknown fields as an error. | ||||
| 	DiscardUnknown bool | ||||
|  | ||||
| 	// Resolver is used for looking up types when unmarshaling | ||||
| 	// google.protobuf.Any messages or extension fields. | ||||
| 	// If nil, this defaults to using protoregistry.GlobalTypes. | ||||
| 	Resolver interface { | ||||
| 		protoregistry.MessageTypeResolver | ||||
| 		protoregistry.ExtensionTypeResolver | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Unmarshal reads the given []byte and populates the given proto.Message | ||||
| // using options in the UnmarshalOptions object. | ||||
| // The provided message must be mutable (e.g., a non-nil pointer to a message). | ||||
| func (o UnmarshalOptions) Unmarshal(b []byte, m proto.Message) error { | ||||
| 	return o.unmarshal(b, m) | ||||
| } | ||||
|  | ||||
| // unmarshal is a centralized function that all unmarshal operations go through. | ||||
| // For profiling purposes, avoid changing the name of this function or | ||||
| // introducing other code paths for unmarshal that do not go through this. | ||||
| func (o UnmarshalOptions) unmarshal(b []byte, m proto.Message) error { | ||||
| 	proto.Reset(m) | ||||
|  | ||||
| 	if o.Resolver == nil { | ||||
| 		o.Resolver = protoregistry.GlobalTypes | ||||
| 	} | ||||
|  | ||||
| 	dec := decoder{text.NewDecoder(b), o} | ||||
| 	if err := dec.unmarshalMessage(m.ProtoReflect(), false); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if o.AllowPartial { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return proto.CheckInitialized(m) | ||||
| } | ||||
|  | ||||
| type decoder struct { | ||||
| 	*text.Decoder | ||||
| 	opts UnmarshalOptions | ||||
| } | ||||
|  | ||||
| // newError returns an error object with position info. | ||||
| func (d decoder) newError(pos int, f string, x ...interface{}) error { | ||||
| 	line, column := d.Position(pos) | ||||
| 	head := fmt.Sprintf("(line %d:%d): ", line, column) | ||||
| 	return errors.New(head+f, x...) | ||||
| } | ||||
|  | ||||
| // unexpectedTokenError returns a syntax error for the given unexpected token. | ||||
| func (d decoder) unexpectedTokenError(tok text.Token) error { | ||||
| 	return d.syntaxError(tok.Pos(), "unexpected token: %s", tok.RawString()) | ||||
| } | ||||
|  | ||||
| // syntaxError returns a syntax error for given position. | ||||
| func (d decoder) syntaxError(pos int, f string, x ...interface{}) error { | ||||
| 	line, column := d.Position(pos) | ||||
| 	head := fmt.Sprintf("syntax error (line %d:%d): ", line, column) | ||||
| 	return errors.New(head+f, x...) | ||||
| } | ||||
|  | ||||
| // unmarshalMessage unmarshals into the given protoreflect.Message. | ||||
| func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { | ||||
| 	messageDesc := m.Descriptor() | ||||
| 	if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) { | ||||
| 		return errors.New("no support for proto1 MessageSets") | ||||
| 	} | ||||
|  | ||||
| 	if messageDesc.FullName() == genid.Any_message_fullname { | ||||
| 		return d.unmarshalAny(m, checkDelims) | ||||
| 	} | ||||
|  | ||||
| 	if checkDelims { | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		if tok.Kind() != text.MessageOpen { | ||||
| 			return d.unexpectedTokenError(tok) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	var seenNums set.Ints | ||||
| 	var seenOneofs set.Ints | ||||
| 	fieldDescs := messageDesc.Fields() | ||||
|  | ||||
| 	for { | ||||
| 		// Read field name. | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		switch typ := tok.Kind(); typ { | ||||
| 		case text.Name: | ||||
| 			// Continue below. | ||||
| 		case text.EOF: | ||||
| 			if checkDelims { | ||||
| 				return text.ErrUnexpectedEOF | ||||
| 			} | ||||
| 			return nil | ||||
| 		default: | ||||
| 			if checkDelims && typ == text.MessageClose { | ||||
| 				return nil | ||||
| 			} | ||||
| 			return d.unexpectedTokenError(tok) | ||||
| 		} | ||||
|  | ||||
| 		// Resolve the field descriptor. | ||||
| 		var name pref.Name | ||||
| 		var fd pref.FieldDescriptor | ||||
| 		var xt pref.ExtensionType | ||||
| 		var xtErr error | ||||
| 		var isFieldNumberName bool | ||||
|  | ||||
| 		switch tok.NameKind() { | ||||
| 		case text.IdentName: | ||||
| 			name = pref.Name(tok.IdentName()) | ||||
| 			fd = fieldDescs.ByTextName(string(name)) | ||||
|  | ||||
| 		case text.TypeName: | ||||
| 			// Handle extensions only. This code path is not for Any. | ||||
| 			xt, xtErr = d.opts.Resolver.FindExtensionByName(pref.FullName(tok.TypeName())) | ||||
|  | ||||
| 		case text.FieldNumber: | ||||
| 			isFieldNumberName = true | ||||
| 			num := pref.FieldNumber(tok.FieldNumber()) | ||||
| 			if !num.IsValid() { | ||||
| 				return d.newError(tok.Pos(), "invalid field number: %d", num) | ||||
| 			} | ||||
| 			fd = fieldDescs.ByNumber(num) | ||||
| 			if fd == nil { | ||||
| 				xt, xtErr = d.opts.Resolver.FindExtensionByNumber(messageDesc.FullName(), num) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if xt != nil { | ||||
| 			fd = xt.TypeDescriptor() | ||||
| 			if !messageDesc.ExtensionRanges().Has(fd.Number()) || fd.ContainingMessage().FullName() != messageDesc.FullName() { | ||||
| 				return d.newError(tok.Pos(), "message %v cannot be extended by %v", messageDesc.FullName(), fd.FullName()) | ||||
| 			} | ||||
| 		} else if xtErr != nil && xtErr != protoregistry.NotFound { | ||||
| 			return d.newError(tok.Pos(), "unable to resolve [%s]: %v", tok.RawString(), xtErr) | ||||
| 		} | ||||
| 		if flags.ProtoLegacy { | ||||
| 			if fd != nil && fd.IsWeak() && fd.Message().IsPlaceholder() { | ||||
| 				fd = nil // reset since the weak reference is not linked in | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Handle unknown fields. | ||||
| 		if fd == nil { | ||||
| 			if d.opts.DiscardUnknown || messageDesc.ReservedNames().Has(name) { | ||||
| 				d.skipValue() | ||||
| 				continue | ||||
| 			} | ||||
| 			return d.newError(tok.Pos(), "unknown field: %v", tok.RawString()) | ||||
| 		} | ||||
|  | ||||
| 		// Handle fields identified by field number. | ||||
| 		if isFieldNumberName { | ||||
| 			// TODO: Add an option to permit parsing field numbers. | ||||
| 			// | ||||
| 			// This requires careful thought as the MarshalOptions.EmitUnknown | ||||
| 			// option allows formatting unknown fields as the field number and the | ||||
| 			// best-effort textual representation of the field value.  In that case, | ||||
| 			// it may not be possible to unmarshal the value from a parser that does | ||||
| 			// have information about the unknown field. | ||||
| 			return d.newError(tok.Pos(), "cannot specify field by number: %v", tok.RawString()) | ||||
| 		} | ||||
|  | ||||
| 		switch { | ||||
| 		case fd.IsList(): | ||||
| 			kind := fd.Kind() | ||||
| 			if kind != pref.MessageKind && kind != pref.GroupKind && !tok.HasSeparator() { | ||||
| 				return d.syntaxError(tok.Pos(), "missing field separator :") | ||||
| 			} | ||||
|  | ||||
| 			list := m.Mutable(fd).List() | ||||
| 			if err := d.unmarshalList(fd, list); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 		case fd.IsMap(): | ||||
| 			mmap := m.Mutable(fd).Map() | ||||
| 			if err := d.unmarshalMap(fd, mmap); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 		default: | ||||
| 			kind := fd.Kind() | ||||
| 			if kind != pref.MessageKind && kind != pref.GroupKind && !tok.HasSeparator() { | ||||
| 				return d.syntaxError(tok.Pos(), "missing field separator :") | ||||
| 			} | ||||
|  | ||||
| 			// If field is a oneof, check if it has already been set. | ||||
| 			if od := fd.ContainingOneof(); od != nil { | ||||
| 				idx := uint64(od.Index()) | ||||
| 				if seenOneofs.Has(idx) { | ||||
| 					return d.newError(tok.Pos(), "error parsing %q, oneof %v is already set", tok.RawString(), od.FullName()) | ||||
| 				} | ||||
| 				seenOneofs.Set(idx) | ||||
| 			} | ||||
|  | ||||
| 			num := uint64(fd.Number()) | ||||
| 			if seenNums.Has(num) { | ||||
| 				return d.newError(tok.Pos(), "non-repeated field %q is repeated", tok.RawString()) | ||||
| 			} | ||||
|  | ||||
| 			if err := d.unmarshalSingular(fd, m); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			seenNums.Set(num) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // unmarshalSingular unmarshals a non-repeated field value specified by the | ||||
| // given FieldDescriptor. | ||||
| func (d decoder) unmarshalSingular(fd pref.FieldDescriptor, m pref.Message) error { | ||||
| 	var val pref.Value | ||||
| 	var err error | ||||
| 	switch fd.Kind() { | ||||
| 	case pref.MessageKind, pref.GroupKind: | ||||
| 		val = m.NewField(fd) | ||||
| 		err = d.unmarshalMessage(val.Message(), true) | ||||
| 	default: | ||||
| 		val, err = d.unmarshalScalar(fd) | ||||
| 	} | ||||
| 	if err == nil { | ||||
| 		m.Set(fd, val) | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // unmarshalScalar unmarshals a scalar/enum protoreflect.Value specified by the | ||||
| // given FieldDescriptor. | ||||
| func (d decoder) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) { | ||||
| 	tok, err := d.Read() | ||||
| 	if err != nil { | ||||
| 		return pref.Value{}, err | ||||
| 	} | ||||
|  | ||||
| 	if tok.Kind() != text.Scalar { | ||||
| 		return pref.Value{}, d.unexpectedTokenError(tok) | ||||
| 	} | ||||
|  | ||||
| 	kind := fd.Kind() | ||||
| 	switch kind { | ||||
| 	case pref.BoolKind: | ||||
| 		if b, ok := tok.Bool(); ok { | ||||
| 			return pref.ValueOfBool(b), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: | ||||
| 		if n, ok := tok.Int32(); ok { | ||||
| 			return pref.ValueOfInt32(n), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: | ||||
| 		if n, ok := tok.Int64(); ok { | ||||
| 			return pref.ValueOfInt64(n), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.Uint32Kind, pref.Fixed32Kind: | ||||
| 		if n, ok := tok.Uint32(); ok { | ||||
| 			return pref.ValueOfUint32(n), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.Uint64Kind, pref.Fixed64Kind: | ||||
| 		if n, ok := tok.Uint64(); ok { | ||||
| 			return pref.ValueOfUint64(n), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.FloatKind: | ||||
| 		if n, ok := tok.Float32(); ok { | ||||
| 			return pref.ValueOfFloat32(n), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.DoubleKind: | ||||
| 		if n, ok := tok.Float64(); ok { | ||||
| 			return pref.ValueOfFloat64(n), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.StringKind: | ||||
| 		if s, ok := tok.String(); ok { | ||||
| 			if strs.EnforceUTF8(fd) && !utf8.ValidString(s) { | ||||
| 				return pref.Value{}, d.newError(tok.Pos(), "contains invalid UTF-8") | ||||
| 			} | ||||
| 			return pref.ValueOfString(s), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.BytesKind: | ||||
| 		if b, ok := tok.String(); ok { | ||||
| 			return pref.ValueOfBytes([]byte(b)), nil | ||||
| 		} | ||||
|  | ||||
| 	case pref.EnumKind: | ||||
| 		if lit, ok := tok.Enum(); ok { | ||||
| 			// Lookup EnumNumber based on name. | ||||
| 			if enumVal := fd.Enum().Values().ByName(pref.Name(lit)); enumVal != nil { | ||||
| 				return pref.ValueOfEnum(enumVal.Number()), nil | ||||
| 			} | ||||
| 		} | ||||
| 		if num, ok := tok.Int32(); ok { | ||||
| 			return pref.ValueOfEnum(pref.EnumNumber(num)), nil | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("invalid scalar kind %v", kind)) | ||||
| 	} | ||||
|  | ||||
| 	return pref.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString()) | ||||
| } | ||||
|  | ||||
| // unmarshalList unmarshals into given protoreflect.List. A list value can | ||||
| // either be in [] syntax or simply just a single scalar/message value. | ||||
| func (d decoder) unmarshalList(fd pref.FieldDescriptor, list pref.List) error { | ||||
| 	tok, err := d.Peek() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	switch fd.Kind() { | ||||
| 	case pref.MessageKind, pref.GroupKind: | ||||
| 		switch tok.Kind() { | ||||
| 		case text.ListOpen: | ||||
| 			d.Read() | ||||
| 			for { | ||||
| 				tok, err := d.Peek() | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
|  | ||||
| 				switch tok.Kind() { | ||||
| 				case text.ListClose: | ||||
| 					d.Read() | ||||
| 					return nil | ||||
| 				case text.MessageOpen: | ||||
| 					pval := list.NewElement() | ||||
| 					if err := d.unmarshalMessage(pval.Message(), true); err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					list.Append(pval) | ||||
| 				default: | ||||
| 					return d.unexpectedTokenError(tok) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 		case text.MessageOpen: | ||||
| 			pval := list.NewElement() | ||||
| 			if err := d.unmarshalMessage(pval.Message(), true); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			list.Append(pval) | ||||
| 			return nil | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		switch tok.Kind() { | ||||
| 		case text.ListOpen: | ||||
| 			d.Read() | ||||
| 			for { | ||||
| 				tok, err := d.Peek() | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
|  | ||||
| 				switch tok.Kind() { | ||||
| 				case text.ListClose: | ||||
| 					d.Read() | ||||
| 					return nil | ||||
| 				case text.Scalar: | ||||
| 					pval, err := d.unmarshalScalar(fd) | ||||
| 					if err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					list.Append(pval) | ||||
| 				default: | ||||
| 					return d.unexpectedTokenError(tok) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 		case text.Scalar: | ||||
| 			pval, err := d.unmarshalScalar(fd) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			list.Append(pval) | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return d.unexpectedTokenError(tok) | ||||
| } | ||||
|  | ||||
| // unmarshalMap unmarshals into given protoreflect.Map. A map value is a | ||||
| // textproto message containing {key: <kvalue>, value: <mvalue>}. | ||||
| func (d decoder) unmarshalMap(fd pref.FieldDescriptor, mmap pref.Map) error { | ||||
| 	// Determine ahead whether map entry is a scalar type or a message type in | ||||
| 	// order to call the appropriate unmarshalMapValue func inside | ||||
| 	// unmarshalMapEntry. | ||||
| 	var unmarshalMapValue func() (pref.Value, error) | ||||
| 	switch fd.MapValue().Kind() { | ||||
| 	case pref.MessageKind, pref.GroupKind: | ||||
| 		unmarshalMapValue = func() (pref.Value, error) { | ||||
| 			pval := mmap.NewValue() | ||||
| 			if err := d.unmarshalMessage(pval.Message(), true); err != nil { | ||||
| 				return pref.Value{}, err | ||||
| 			} | ||||
| 			return pval, nil | ||||
| 		} | ||||
| 	default: | ||||
| 		unmarshalMapValue = func() (pref.Value, error) { | ||||
| 			return d.unmarshalScalar(fd.MapValue()) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	tok, err := d.Read() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	switch tok.Kind() { | ||||
| 	case text.MessageOpen: | ||||
| 		return d.unmarshalMapEntry(fd, mmap, unmarshalMapValue) | ||||
|  | ||||
| 	case text.ListOpen: | ||||
| 		for { | ||||
| 			tok, err := d.Read() | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			switch tok.Kind() { | ||||
| 			case text.ListClose: | ||||
| 				return nil | ||||
| 			case text.MessageOpen: | ||||
| 				if err := d.unmarshalMapEntry(fd, mmap, unmarshalMapValue); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			default: | ||||
| 				return d.unexpectedTokenError(tok) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		return d.unexpectedTokenError(tok) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // unmarshalMap unmarshals into given protoreflect.Map. A map value is a | ||||
| // textproto message containing {key: <kvalue>, value: <mvalue>}. | ||||
| func (d decoder) unmarshalMapEntry(fd pref.FieldDescriptor, mmap pref.Map, unmarshalMapValue func() (pref.Value, error)) error { | ||||
| 	var key pref.MapKey | ||||
| 	var pval pref.Value | ||||
| Loop: | ||||
| 	for { | ||||
| 		// Read field name. | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		switch tok.Kind() { | ||||
| 		case text.Name: | ||||
| 			if tok.NameKind() != text.IdentName { | ||||
| 				if !d.opts.DiscardUnknown { | ||||
| 					return d.newError(tok.Pos(), "unknown map entry field %q", tok.RawString()) | ||||
| 				} | ||||
| 				d.skipValue() | ||||
| 				continue Loop | ||||
| 			} | ||||
| 			// Continue below. | ||||
| 		case text.MessageClose: | ||||
| 			break Loop | ||||
| 		default: | ||||
| 			return d.unexpectedTokenError(tok) | ||||
| 		} | ||||
|  | ||||
| 		switch name := pref.Name(tok.IdentName()); name { | ||||
| 		case genid.MapEntry_Key_field_name: | ||||
| 			if !tok.HasSeparator() { | ||||
| 				return d.syntaxError(tok.Pos(), "missing field separator :") | ||||
| 			} | ||||
| 			if key.IsValid() { | ||||
| 				return d.newError(tok.Pos(), "map entry %q cannot be repeated", name) | ||||
| 			} | ||||
| 			val, err := d.unmarshalScalar(fd.MapKey()) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			key = val.MapKey() | ||||
|  | ||||
| 		case genid.MapEntry_Value_field_name: | ||||
| 			if kind := fd.MapValue().Kind(); (kind != pref.MessageKind) && (kind != pref.GroupKind) { | ||||
| 				if !tok.HasSeparator() { | ||||
| 					return d.syntaxError(tok.Pos(), "missing field separator :") | ||||
| 				} | ||||
| 			} | ||||
| 			if pval.IsValid() { | ||||
| 				return d.newError(tok.Pos(), "map entry %q cannot be repeated", name) | ||||
| 			} | ||||
| 			pval, err = unmarshalMapValue() | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 		default: | ||||
| 			if !d.opts.DiscardUnknown { | ||||
| 				return d.newError(tok.Pos(), "unknown map entry field %q", name) | ||||
| 			} | ||||
| 			d.skipValue() | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if !key.IsValid() { | ||||
| 		key = fd.MapKey().Default().MapKey() | ||||
| 	} | ||||
| 	if !pval.IsValid() { | ||||
| 		switch fd.MapValue().Kind() { | ||||
| 		case pref.MessageKind, pref.GroupKind: | ||||
| 			// If value field is not set for message/group types, construct an | ||||
| 			// empty one as default. | ||||
| 			pval = mmap.NewValue() | ||||
| 		default: | ||||
| 			pval = fd.MapValue().Default() | ||||
| 		} | ||||
| 	} | ||||
| 	mmap.Set(key, pval) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // unmarshalAny unmarshals an Any textproto. It can either be in expanded form | ||||
| // or non-expanded form. | ||||
| func (d decoder) unmarshalAny(m pref.Message, checkDelims bool) error { | ||||
| 	var typeURL string | ||||
| 	var bValue []byte | ||||
| 	var seenTypeUrl bool | ||||
| 	var seenValue bool | ||||
| 	var isExpanded bool | ||||
|  | ||||
| 	if checkDelims { | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		if tok.Kind() != text.MessageOpen { | ||||
| 			return d.unexpectedTokenError(tok) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| Loop: | ||||
| 	for { | ||||
| 		// Read field name. Can only have 3 possible field names, i.e. type_url, | ||||
| 		// value and type URL name inside []. | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if typ := tok.Kind(); typ != text.Name { | ||||
| 			if checkDelims { | ||||
| 				if typ == text.MessageClose { | ||||
| 					break Loop | ||||
| 				} | ||||
| 			} else if typ == text.EOF { | ||||
| 				break Loop | ||||
| 			} | ||||
| 			return d.unexpectedTokenError(tok) | ||||
| 		} | ||||
|  | ||||
| 		switch tok.NameKind() { | ||||
| 		case text.IdentName: | ||||
| 			// Both type_url and value fields require field separator :. | ||||
| 			if !tok.HasSeparator() { | ||||
| 				return d.syntaxError(tok.Pos(), "missing field separator :") | ||||
| 			} | ||||
|  | ||||
| 			switch name := pref.Name(tok.IdentName()); name { | ||||
| 			case genid.Any_TypeUrl_field_name: | ||||
| 				if seenTypeUrl { | ||||
| 					return d.newError(tok.Pos(), "duplicate %v field", genid.Any_TypeUrl_field_fullname) | ||||
| 				} | ||||
| 				if isExpanded { | ||||
| 					return d.newError(tok.Pos(), "conflict with [%s] field", typeURL) | ||||
| 				} | ||||
| 				tok, err := d.Read() | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				var ok bool | ||||
| 				typeURL, ok = tok.String() | ||||
| 				if !ok { | ||||
| 					return d.newError(tok.Pos(), "invalid %v field value: %v", genid.Any_TypeUrl_field_fullname, tok.RawString()) | ||||
| 				} | ||||
| 				seenTypeUrl = true | ||||
|  | ||||
| 			case genid.Any_Value_field_name: | ||||
| 				if seenValue { | ||||
| 					return d.newError(tok.Pos(), "duplicate %v field", genid.Any_Value_field_fullname) | ||||
| 				} | ||||
| 				if isExpanded { | ||||
| 					return d.newError(tok.Pos(), "conflict with [%s] field", typeURL) | ||||
| 				} | ||||
| 				tok, err := d.Read() | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				s, ok := tok.String() | ||||
| 				if !ok { | ||||
| 					return d.newError(tok.Pos(), "invalid %v field value: %v", genid.Any_Value_field_fullname, tok.RawString()) | ||||
| 				} | ||||
| 				bValue = []byte(s) | ||||
| 				seenValue = true | ||||
|  | ||||
| 			default: | ||||
| 				if !d.opts.DiscardUnknown { | ||||
| 					return d.newError(tok.Pos(), "invalid field name %q in %v message", tok.RawString(), genid.Any_message_fullname) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 		case text.TypeName: | ||||
| 			if isExpanded { | ||||
| 				return d.newError(tok.Pos(), "cannot have more than one type") | ||||
| 			} | ||||
| 			if seenTypeUrl { | ||||
| 				return d.newError(tok.Pos(), "conflict with type_url field") | ||||
| 			} | ||||
| 			typeURL = tok.TypeName() | ||||
| 			var err error | ||||
| 			bValue, err = d.unmarshalExpandedAny(typeURL, tok.Pos()) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			isExpanded = true | ||||
|  | ||||
| 		default: | ||||
| 			if !d.opts.DiscardUnknown { | ||||
| 				return d.newError(tok.Pos(), "invalid field name %q in %v message", tok.RawString(), genid.Any_message_fullname) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	fds := m.Descriptor().Fields() | ||||
| 	if len(typeURL) > 0 { | ||||
| 		m.Set(fds.ByNumber(genid.Any_TypeUrl_field_number), pref.ValueOfString(typeURL)) | ||||
| 	} | ||||
| 	if len(bValue) > 0 { | ||||
| 		m.Set(fds.ByNumber(genid.Any_Value_field_number), pref.ValueOfBytes(bValue)) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (d decoder) unmarshalExpandedAny(typeURL string, pos int) ([]byte, error) { | ||||
| 	mt, err := d.opts.Resolver.FindMessageByURL(typeURL) | ||||
| 	if err != nil { | ||||
| 		return nil, d.newError(pos, "unable to resolve message [%v]: %v", typeURL, err) | ||||
| 	} | ||||
| 	// Create new message for the embedded message type and unmarshal the value | ||||
| 	// field into it. | ||||
| 	m := mt.New() | ||||
| 	if err := d.unmarshalMessage(m, true); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	// Serialize the embedded message and return the resulting bytes. | ||||
| 	b, err := proto.MarshalOptions{ | ||||
| 		AllowPartial:  true, // Never check required fields inside an Any. | ||||
| 		Deterministic: true, | ||||
| 	}.Marshal(m.Interface()) | ||||
| 	if err != nil { | ||||
| 		return nil, d.newError(pos, "error in marshaling message into Any.value: %v", err) | ||||
| 	} | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| // skipValue makes the decoder parse a field value in order to advance the read | ||||
| // to the next field. It relies on Read returning an error if the types are not | ||||
| // in valid sequence. | ||||
| func (d decoder) skipValue() error { | ||||
| 	tok, err := d.Read() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	// Only need to continue reading for messages and lists. | ||||
| 	switch tok.Kind() { | ||||
| 	case text.MessageOpen: | ||||
| 		return d.skipMessageValue() | ||||
|  | ||||
| 	case text.ListOpen: | ||||
| 		for { | ||||
| 			tok, err := d.Read() | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			switch tok.Kind() { | ||||
| 			case text.ListClose: | ||||
| 				return nil | ||||
| 			case text.MessageOpen: | ||||
| 				return d.skipMessageValue() | ||||
| 			default: | ||||
| 				// Skip items. This will not validate whether skipped values are | ||||
| 				// of the same type or not, same behavior as C++ | ||||
| 				// TextFormat::Parser::AllowUnknownField(true) version 3.8.0. | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // skipMessageValue makes the decoder parse and skip over all fields in a | ||||
| // message. It assumes that the previous read type is MessageOpen. | ||||
| func (d decoder) skipMessageValue() error { | ||||
| 	for { | ||||
| 		tok, err := d.Read() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		switch tok.Kind() { | ||||
| 		case text.MessageClose: | ||||
| 			return nil | ||||
| 		case text.Name: | ||||
| 			if err := d.skipValue(); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										7
									
								
								vendor/google.golang.org/protobuf/encoding/prototext/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								vendor/google.golang.org/protobuf/encoding/prototext/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| // 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 prototext marshals and unmarshals protocol buffer messages as the | ||||
| // textproto format. | ||||
| package prototext | ||||
							
								
								
									
										371
									
								
								vendor/google.golang.org/protobuf/encoding/prototext/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										371
									
								
								vendor/google.golang.org/protobuf/encoding/prototext/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,371 @@ | ||||
| // 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 prototext | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/encoding/messageset" | ||||
| 	"google.golang.org/protobuf/internal/encoding/text" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	"google.golang.org/protobuf/internal/flags" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/internal/order" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	"google.golang.org/protobuf/reflect/protoregistry" | ||||
| ) | ||||
|  | ||||
| const defaultIndent = "  " | ||||
|  | ||||
| // Format formats the message as a multiline string. | ||||
| // This function is only intended for human consumption and ignores errors. | ||||
| // Do not depend on the output being stable. It may change over time across | ||||
| // different versions of the program. | ||||
| func Format(m proto.Message) string { | ||||
| 	return MarshalOptions{Multiline: true}.Format(m) | ||||
| } | ||||
|  | ||||
| // Marshal writes the given proto.Message in textproto format using default | ||||
| // options. Do not depend on the output being stable. It may change over time | ||||
| // across different versions of the program. | ||||
| func Marshal(m proto.Message) ([]byte, error) { | ||||
| 	return MarshalOptions{}.Marshal(m) | ||||
| } | ||||
|  | ||||
| // MarshalOptions is a configurable text format marshaler. | ||||
| type MarshalOptions struct { | ||||
| 	pragma.NoUnkeyedLiterals | ||||
|  | ||||
| 	// Multiline specifies whether the marshaler should format the output in | ||||
| 	// indented-form with every textual element on a new line. | ||||
| 	// If Indent is an empty string, then an arbitrary indent is chosen. | ||||
| 	Multiline bool | ||||
|  | ||||
| 	// Indent specifies the set of indentation characters to use in a multiline | ||||
| 	// formatted output such that every entry is preceded by Indent and | ||||
| 	// terminated by a newline. If non-empty, then Multiline is treated as true. | ||||
| 	// Indent can only be composed of space or tab characters. | ||||
| 	Indent string | ||||
|  | ||||
| 	// EmitASCII specifies whether to format strings and bytes as ASCII only | ||||
| 	// as opposed to using UTF-8 encoding when possible. | ||||
| 	EmitASCII bool | ||||
|  | ||||
| 	// allowInvalidUTF8 specifies whether to permit the encoding of strings | ||||
| 	// with invalid UTF-8. This is unexported as it is intended to only | ||||
| 	// be specified by the Format method. | ||||
| 	allowInvalidUTF8 bool | ||||
|  | ||||
| 	// AllowPartial allows messages that have missing required fields to marshal | ||||
| 	// without returning an error. If AllowPartial is false (the default), | ||||
| 	// Marshal will return error if there are any missing required fields. | ||||
| 	AllowPartial bool | ||||
|  | ||||
| 	// EmitUnknown specifies whether to emit unknown fields in the output. | ||||
| 	// If specified, the unmarshaler may be unable to parse the output. | ||||
| 	// The default is to exclude unknown fields. | ||||
| 	EmitUnknown bool | ||||
|  | ||||
| 	// Resolver is used for looking up types when expanding google.protobuf.Any | ||||
| 	// messages. If nil, this defaults to using protoregistry.GlobalTypes. | ||||
| 	Resolver interface { | ||||
| 		protoregistry.ExtensionTypeResolver | ||||
| 		protoregistry.MessageTypeResolver | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Format formats the message as a string. | ||||
| // This method is only intended for human consumption and ignores errors. | ||||
| // Do not depend on the output being stable. It may change over time across | ||||
| // different versions of the program. | ||||
| func (o MarshalOptions) Format(m proto.Message) string { | ||||
| 	if m == nil || !m.ProtoReflect().IsValid() { | ||||
| 		return "<nil>" // invalid syntax, but okay since this is for debugging | ||||
| 	} | ||||
| 	o.allowInvalidUTF8 = true | ||||
| 	o.AllowPartial = true | ||||
| 	o.EmitUnknown = true | ||||
| 	b, _ := o.Marshal(m) | ||||
| 	return string(b) | ||||
| } | ||||
|  | ||||
| // Marshal writes the given proto.Message in textproto format using options in | ||||
| // MarshalOptions object. Do not depend on the output being stable. It may | ||||
| // change over time across different versions of the program. | ||||
| func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) { | ||||
| 	return o.marshal(m) | ||||
| } | ||||
|  | ||||
| // marshal is a centralized function that all marshal operations go through. | ||||
| // For profiling purposes, avoid changing the name of this function or | ||||
| // introducing other code paths for marshal that do not go through this. | ||||
| func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) { | ||||
| 	var delims = [2]byte{'{', '}'} | ||||
|  | ||||
| 	if o.Multiline && o.Indent == "" { | ||||
| 		o.Indent = defaultIndent | ||||
| 	} | ||||
| 	if o.Resolver == nil { | ||||
| 		o.Resolver = protoregistry.GlobalTypes | ||||
| 	} | ||||
|  | ||||
| 	internalEnc, err := text.NewEncoder(o.Indent, delims, o.EmitASCII) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// Treat nil message interface as an empty message, | ||||
| 	// in which case there is nothing to output. | ||||
| 	if m == nil { | ||||
| 		return []byte{}, nil | ||||
| 	} | ||||
|  | ||||
| 	enc := encoder{internalEnc, o} | ||||
| 	err = enc.marshalMessage(m.ProtoReflect(), false) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	out := enc.Bytes() | ||||
| 	if len(o.Indent) > 0 && len(out) > 0 { | ||||
| 		out = append(out, '\n') | ||||
| 	} | ||||
| 	if o.AllowPartial { | ||||
| 		return out, nil | ||||
| 	} | ||||
| 	return out, proto.CheckInitialized(m) | ||||
| } | ||||
|  | ||||
| type encoder struct { | ||||
| 	*text.Encoder | ||||
| 	opts MarshalOptions | ||||
| } | ||||
|  | ||||
| // marshalMessage marshals the given protoreflect.Message. | ||||
| func (e encoder) marshalMessage(m pref.Message, inclDelims bool) error { | ||||
| 	messageDesc := m.Descriptor() | ||||
| 	if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) { | ||||
| 		return errors.New("no support for proto1 MessageSets") | ||||
| 	} | ||||
|  | ||||
| 	if inclDelims { | ||||
| 		e.StartMessage() | ||||
| 		defer e.EndMessage() | ||||
| 	} | ||||
|  | ||||
| 	// Handle Any expansion. | ||||
| 	if messageDesc.FullName() == genid.Any_message_fullname { | ||||
| 		if e.marshalAny(m) { | ||||
| 			return nil | ||||
| 		} | ||||
| 		// If unable to expand, continue on to marshal Any as a regular message. | ||||
| 	} | ||||
|  | ||||
| 	// Marshal fields. | ||||
| 	var err error | ||||
| 	order.RangeFields(m, order.IndexNameFieldOrder, func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { | ||||
| 		if err = e.marshalField(fd.TextName(), v, fd); err != nil { | ||||
| 			return false | ||||
| 		} | ||||
| 		return true | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// Marshal unknown fields. | ||||
| 	if e.opts.EmitUnknown { | ||||
| 		e.marshalUnknown(m.GetUnknown()) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // marshalField marshals the given field with protoreflect.Value. | ||||
| func (e encoder) marshalField(name string, val pref.Value, fd pref.FieldDescriptor) error { | ||||
| 	switch { | ||||
| 	case fd.IsList(): | ||||
| 		return e.marshalList(name, val.List(), fd) | ||||
| 	case fd.IsMap(): | ||||
| 		return e.marshalMap(name, val.Map(), fd) | ||||
| 	default: | ||||
| 		e.WriteName(name) | ||||
| 		return e.marshalSingular(val, fd) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // marshalSingular marshals the given non-repeated field value. This includes | ||||
| // all scalar types, enums, messages, and groups. | ||||
| func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error { | ||||
| 	kind := fd.Kind() | ||||
| 	switch kind { | ||||
| 	case pref.BoolKind: | ||||
| 		e.WriteBool(val.Bool()) | ||||
|  | ||||
| 	case pref.StringKind: | ||||
| 		s := val.String() | ||||
| 		if !e.opts.allowInvalidUTF8 && strs.EnforceUTF8(fd) && !utf8.ValidString(s) { | ||||
| 			return errors.InvalidUTF8(string(fd.FullName())) | ||||
| 		} | ||||
| 		e.WriteString(s) | ||||
|  | ||||
| 	case pref.Int32Kind, pref.Int64Kind, | ||||
| 		pref.Sint32Kind, pref.Sint64Kind, | ||||
| 		pref.Sfixed32Kind, pref.Sfixed64Kind: | ||||
| 		e.WriteInt(val.Int()) | ||||
|  | ||||
| 	case pref.Uint32Kind, pref.Uint64Kind, | ||||
| 		pref.Fixed32Kind, pref.Fixed64Kind: | ||||
| 		e.WriteUint(val.Uint()) | ||||
|  | ||||
| 	case pref.FloatKind: | ||||
| 		// Encoder.WriteFloat handles the special numbers NaN and infinites. | ||||
| 		e.WriteFloat(val.Float(), 32) | ||||
|  | ||||
| 	case pref.DoubleKind: | ||||
| 		// Encoder.WriteFloat handles the special numbers NaN and infinites. | ||||
| 		e.WriteFloat(val.Float(), 64) | ||||
|  | ||||
| 	case pref.BytesKind: | ||||
| 		e.WriteString(string(val.Bytes())) | ||||
|  | ||||
| 	case pref.EnumKind: | ||||
| 		num := val.Enum() | ||||
| 		if desc := fd.Enum().Values().ByNumber(num); desc != nil { | ||||
| 			e.WriteLiteral(string(desc.Name())) | ||||
| 		} else { | ||||
| 			// Use numeric value if there is no enum description. | ||||
| 			e.WriteInt(int64(num)) | ||||
| 		} | ||||
|  | ||||
| 	case pref.MessageKind, pref.GroupKind: | ||||
| 		return e.marshalMessage(val.Message(), true) | ||||
|  | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("%v has unknown kind: %v", fd.FullName(), kind)) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // marshalList marshals the given protoreflect.List as multiple name-value fields. | ||||
| func (e encoder) marshalList(name string, list pref.List, fd pref.FieldDescriptor) error { | ||||
| 	size := list.Len() | ||||
| 	for i := 0; i < size; i++ { | ||||
| 		e.WriteName(name) | ||||
| 		if err := e.marshalSingular(list.Get(i), fd); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // marshalMap marshals the given protoreflect.Map as multiple name-value fields. | ||||
| func (e encoder) marshalMap(name string, mmap pref.Map, fd pref.FieldDescriptor) error { | ||||
| 	var err error | ||||
| 	order.RangeEntries(mmap, order.GenericKeyOrder, func(key pref.MapKey, val pref.Value) bool { | ||||
| 		e.WriteName(name) | ||||
| 		e.StartMessage() | ||||
| 		defer e.EndMessage() | ||||
|  | ||||
| 		e.WriteName(string(genid.MapEntry_Key_field_name)) | ||||
| 		err = e.marshalSingular(key.Value(), fd.MapKey()) | ||||
| 		if err != nil { | ||||
| 			return false | ||||
| 		} | ||||
|  | ||||
| 		e.WriteName(string(genid.MapEntry_Value_field_name)) | ||||
| 		err = e.marshalSingular(val, fd.MapValue()) | ||||
| 		if err != nil { | ||||
| 			return false | ||||
| 		} | ||||
| 		return true | ||||
| 	}) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // marshalUnknown parses the given []byte and marshals fields out. | ||||
| // This function assumes proper encoding in the given []byte. | ||||
| func (e encoder) marshalUnknown(b []byte) { | ||||
| 	const dec = 10 | ||||
| 	const hex = 16 | ||||
| 	for len(b) > 0 { | ||||
| 		num, wtype, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		e.WriteName(strconv.FormatInt(int64(num), dec)) | ||||
|  | ||||
| 		switch wtype { | ||||
| 		case protowire.VarintType: | ||||
| 			var v uint64 | ||||
| 			v, n = protowire.ConsumeVarint(b) | ||||
| 			e.WriteUint(v) | ||||
| 		case protowire.Fixed32Type: | ||||
| 			var v uint32 | ||||
| 			v, n = protowire.ConsumeFixed32(b) | ||||
| 			e.WriteLiteral("0x" + strconv.FormatUint(uint64(v), hex)) | ||||
| 		case protowire.Fixed64Type: | ||||
| 			var v uint64 | ||||
| 			v, n = protowire.ConsumeFixed64(b) | ||||
| 			e.WriteLiteral("0x" + strconv.FormatUint(v, hex)) | ||||
| 		case protowire.BytesType: | ||||
| 			var v []byte | ||||
| 			v, n = protowire.ConsumeBytes(b) | ||||
| 			e.WriteString(string(v)) | ||||
| 		case protowire.StartGroupType: | ||||
| 			e.StartMessage() | ||||
| 			var v []byte | ||||
| 			v, n = protowire.ConsumeGroup(num, b) | ||||
| 			e.marshalUnknown(v) | ||||
| 			e.EndMessage() | ||||
| 		default: | ||||
| 			panic(fmt.Sprintf("prototext: error parsing unknown field wire type: %v", wtype)) | ||||
| 		} | ||||
|  | ||||
| 		b = b[n:] | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // marshalAny marshals the given google.protobuf.Any message in expanded form. | ||||
| // It returns true if it was able to marshal, else false. | ||||
| func (e encoder) marshalAny(any pref.Message) bool { | ||||
| 	// Construct the embedded message. | ||||
| 	fds := any.Descriptor().Fields() | ||||
| 	fdType := fds.ByNumber(genid.Any_TypeUrl_field_number) | ||||
| 	typeURL := any.Get(fdType).String() | ||||
| 	mt, err := e.opts.Resolver.FindMessageByURL(typeURL) | ||||
| 	if err != nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	m := mt.New().Interface() | ||||
|  | ||||
| 	// Unmarshal bytes into embedded message. | ||||
| 	fdValue := fds.ByNumber(genid.Any_Value_field_number) | ||||
| 	value := any.Get(fdValue) | ||||
| 	err = proto.UnmarshalOptions{ | ||||
| 		AllowPartial: true, | ||||
| 		Resolver:     e.opts.Resolver, | ||||
| 	}.Unmarshal(value.Bytes(), m) | ||||
| 	if err != nil { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	// Get current encoder position. If marshaling fails, reset encoder output | ||||
| 	// back to this position. | ||||
| 	pos := e.Snapshot() | ||||
|  | ||||
| 	// Field name is the proto field name enclosed in []. | ||||
| 	e.WriteName("[" + typeURL + "]") | ||||
| 	err = e.marshalMessage(m.ProtoReflect(), true) | ||||
| 	if err != nil { | ||||
| 		e.Reset(pos) | ||||
| 		return false | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
							
								
								
									
										547
									
								
								vendor/google.golang.org/protobuf/encoding/protowire/wire.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										547
									
								
								vendor/google.golang.org/protobuf/encoding/protowire/wire.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,547 @@ | ||||
| // 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 protowire parses and formats the raw wire encoding. | ||||
| // See https://developers.google.com/protocol-buffers/docs/encoding. | ||||
| // | ||||
| // For marshaling and unmarshaling entire protobuf messages, | ||||
| // use the "google.golang.org/protobuf/proto" package instead. | ||||
| package protowire | ||||
|  | ||||
| import ( | ||||
| 	"io" | ||||
| 	"math" | ||||
| 	"math/bits" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| ) | ||||
|  | ||||
| // Number represents the field number. | ||||
| type Number int32 | ||||
|  | ||||
| const ( | ||||
| 	MinValidNumber        Number = 1 | ||||
| 	FirstReservedNumber   Number = 19000 | ||||
| 	LastReservedNumber    Number = 19999 | ||||
| 	MaxValidNumber        Number = 1<<29 - 1 | ||||
| 	DefaultRecursionLimit        = 10000 | ||||
| ) | ||||
|  | ||||
| // IsValid reports whether the field number is semantically valid. | ||||
| // | ||||
| // Note that while numbers within the reserved range are semantically invalid, | ||||
| // they are syntactically valid in the wire format. | ||||
| // Implementations may treat records with reserved field numbers as unknown. | ||||
| func (n Number) IsValid() bool { | ||||
| 	return MinValidNumber <= n && n < FirstReservedNumber || LastReservedNumber < n && n <= MaxValidNumber | ||||
| } | ||||
|  | ||||
| // Type represents the wire type. | ||||
| type Type int8 | ||||
|  | ||||
| const ( | ||||
| 	VarintType     Type = 0 | ||||
| 	Fixed32Type    Type = 5 | ||||
| 	Fixed64Type    Type = 1 | ||||
| 	BytesType      Type = 2 | ||||
| 	StartGroupType Type = 3 | ||||
| 	EndGroupType   Type = 4 | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	_ = -iota | ||||
| 	errCodeTruncated | ||||
| 	errCodeFieldNumber | ||||
| 	errCodeOverflow | ||||
| 	errCodeReserved | ||||
| 	errCodeEndGroup | ||||
| 	errCodeRecursionDepth | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	errFieldNumber = errors.New("invalid field number") | ||||
| 	errOverflow    = errors.New("variable length integer overflow") | ||||
| 	errReserved    = errors.New("cannot parse reserved wire type") | ||||
| 	errEndGroup    = errors.New("mismatching end group marker") | ||||
| 	errParse       = errors.New("parse error") | ||||
| ) | ||||
|  | ||||
| // ParseError converts an error code into an error value. | ||||
| // This returns nil if n is a non-negative number. | ||||
| func ParseError(n int) error { | ||||
| 	if n >= 0 { | ||||
| 		return nil | ||||
| 	} | ||||
| 	switch n { | ||||
| 	case errCodeTruncated: | ||||
| 		return io.ErrUnexpectedEOF | ||||
| 	case errCodeFieldNumber: | ||||
| 		return errFieldNumber | ||||
| 	case errCodeOverflow: | ||||
| 		return errOverflow | ||||
| 	case errCodeReserved: | ||||
| 		return errReserved | ||||
| 	case errCodeEndGroup: | ||||
| 		return errEndGroup | ||||
| 	default: | ||||
| 		return errParse | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ConsumeField parses an entire field record (both tag and value) and returns | ||||
| // the field number, the wire type, and the total length. | ||||
| // This returns a negative length upon an error (see ParseError). | ||||
| // | ||||
| // The total length includes the tag header and the end group marker (if the | ||||
| // field is a group). | ||||
| func ConsumeField(b []byte) (Number, Type, int) { | ||||
| 	num, typ, n := ConsumeTag(b) | ||||
| 	if n < 0 { | ||||
| 		return 0, 0, n // forward error code | ||||
| 	} | ||||
| 	m := ConsumeFieldValue(num, typ, b[n:]) | ||||
| 	if m < 0 { | ||||
| 		return 0, 0, m // forward error code | ||||
| 	} | ||||
| 	return num, typ, n + m | ||||
| } | ||||
|  | ||||
| // ConsumeFieldValue parses a field value and returns its length. | ||||
| // This assumes that the field Number and wire Type have already been parsed. | ||||
| // This returns a negative length upon an error (see ParseError). | ||||
| // | ||||
| // When parsing a group, the length includes the end group marker and | ||||
| // the end group is verified to match the starting field number. | ||||
| func ConsumeFieldValue(num Number, typ Type, b []byte) (n int) { | ||||
| 	return consumeFieldValueD(num, typ, b, DefaultRecursionLimit) | ||||
| } | ||||
|  | ||||
| func consumeFieldValueD(num Number, typ Type, b []byte, depth int) (n int) { | ||||
| 	switch typ { | ||||
| 	case VarintType: | ||||
| 		_, n = ConsumeVarint(b) | ||||
| 		return n | ||||
| 	case Fixed32Type: | ||||
| 		_, n = ConsumeFixed32(b) | ||||
| 		return n | ||||
| 	case Fixed64Type: | ||||
| 		_, n = ConsumeFixed64(b) | ||||
| 		return n | ||||
| 	case BytesType: | ||||
| 		_, n = ConsumeBytes(b) | ||||
| 		return n | ||||
| 	case StartGroupType: | ||||
| 		if depth < 0 { | ||||
| 			return errCodeRecursionDepth | ||||
| 		} | ||||
| 		n0 := len(b) | ||||
| 		for { | ||||
| 			num2, typ2, n := ConsumeTag(b) | ||||
| 			if n < 0 { | ||||
| 				return n // forward error code | ||||
| 			} | ||||
| 			b = b[n:] | ||||
| 			if typ2 == EndGroupType { | ||||
| 				if num != num2 { | ||||
| 					return errCodeEndGroup | ||||
| 				} | ||||
| 				return n0 - len(b) | ||||
| 			} | ||||
|  | ||||
| 			n = consumeFieldValueD(num2, typ2, b, depth-1) | ||||
| 			if n < 0 { | ||||
| 				return n // forward error code | ||||
| 			} | ||||
| 			b = b[n:] | ||||
| 		} | ||||
| 	case EndGroupType: | ||||
| 		return errCodeEndGroup | ||||
| 	default: | ||||
| 		return errCodeReserved | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // AppendTag encodes num and typ as a varint-encoded tag and appends it to b. | ||||
| func AppendTag(b []byte, num Number, typ Type) []byte { | ||||
| 	return AppendVarint(b, EncodeTag(num, typ)) | ||||
| } | ||||
|  | ||||
| // ConsumeTag parses b as a varint-encoded tag, reporting its length. | ||||
| // This returns a negative length upon an error (see ParseError). | ||||
| func ConsumeTag(b []byte) (Number, Type, int) { | ||||
| 	v, n := ConsumeVarint(b) | ||||
| 	if n < 0 { | ||||
| 		return 0, 0, n // forward error code | ||||
| 	} | ||||
| 	num, typ := DecodeTag(v) | ||||
| 	if num < MinValidNumber { | ||||
| 		return 0, 0, errCodeFieldNumber | ||||
| 	} | ||||
| 	return num, typ, n | ||||
| } | ||||
|  | ||||
| func SizeTag(num Number) int { | ||||
| 	return SizeVarint(EncodeTag(num, 0)) // wire type has no effect on size | ||||
| } | ||||
|  | ||||
| // AppendVarint appends v to b as a varint-encoded uint64. | ||||
| func AppendVarint(b []byte, v uint64) []byte { | ||||
| 	switch { | ||||
| 	case v < 1<<7: | ||||
| 		b = append(b, byte(v)) | ||||
| 	case v < 1<<14: | ||||
| 		b = append(b, | ||||
| 			byte((v>>0)&0x7f|0x80), | ||||
| 			byte(v>>7)) | ||||
| 	case v < 1<<21: | ||||
| 		b = append(b, | ||||
| 			byte((v>>0)&0x7f|0x80), | ||||
| 			byte((v>>7)&0x7f|0x80), | ||||
| 			byte(v>>14)) | ||||
| 	case v < 1<<28: | ||||
| 		b = append(b, | ||||
| 			byte((v>>0)&0x7f|0x80), | ||||
| 			byte((v>>7)&0x7f|0x80), | ||||
| 			byte((v>>14)&0x7f|0x80), | ||||
| 			byte(v>>21)) | ||||
| 	case v < 1<<35: | ||||
| 		b = append(b, | ||||
| 			byte((v>>0)&0x7f|0x80), | ||||
| 			byte((v>>7)&0x7f|0x80), | ||||
| 			byte((v>>14)&0x7f|0x80), | ||||
| 			byte((v>>21)&0x7f|0x80), | ||||
| 			byte(v>>28)) | ||||
| 	case v < 1<<42: | ||||
| 		b = append(b, | ||||
| 			byte((v>>0)&0x7f|0x80), | ||||
| 			byte((v>>7)&0x7f|0x80), | ||||
| 			byte((v>>14)&0x7f|0x80), | ||||
| 			byte((v>>21)&0x7f|0x80), | ||||
| 			byte((v>>28)&0x7f|0x80), | ||||
| 			byte(v>>35)) | ||||
| 	case v < 1<<49: | ||||
| 		b = append(b, | ||||
| 			byte((v>>0)&0x7f|0x80), | ||||
| 			byte((v>>7)&0x7f|0x80), | ||||
| 			byte((v>>14)&0x7f|0x80), | ||||
| 			byte((v>>21)&0x7f|0x80), | ||||
| 			byte((v>>28)&0x7f|0x80), | ||||
| 			byte((v>>35)&0x7f|0x80), | ||||
| 			byte(v>>42)) | ||||
| 	case v < 1<<56: | ||||
| 		b = append(b, | ||||
| 			byte((v>>0)&0x7f|0x80), | ||||
| 			byte((v>>7)&0x7f|0x80), | ||||
| 			byte((v>>14)&0x7f|0x80), | ||||
| 			byte((v>>21)&0x7f|0x80), | ||||
| 			byte((v>>28)&0x7f|0x80), | ||||
| 			byte((v>>35)&0x7f|0x80), | ||||
| 			byte((v>>42)&0x7f|0x80), | ||||
| 			byte(v>>49)) | ||||
| 	case v < 1<<63: | ||||
| 		b = append(b, | ||||
| 			byte((v>>0)&0x7f|0x80), | ||||
| 			byte((v>>7)&0x7f|0x80), | ||||
| 			byte((v>>14)&0x7f|0x80), | ||||
| 			byte((v>>21)&0x7f|0x80), | ||||
| 			byte((v>>28)&0x7f|0x80), | ||||
| 			byte((v>>35)&0x7f|0x80), | ||||
| 			byte((v>>42)&0x7f|0x80), | ||||
| 			byte((v>>49)&0x7f|0x80), | ||||
| 			byte(v>>56)) | ||||
| 	default: | ||||
| 		b = append(b, | ||||
| 			byte((v>>0)&0x7f|0x80), | ||||
| 			byte((v>>7)&0x7f|0x80), | ||||
| 			byte((v>>14)&0x7f|0x80), | ||||
| 			byte((v>>21)&0x7f|0x80), | ||||
| 			byte((v>>28)&0x7f|0x80), | ||||
| 			byte((v>>35)&0x7f|0x80), | ||||
| 			byte((v>>42)&0x7f|0x80), | ||||
| 			byte((v>>49)&0x7f|0x80), | ||||
| 			byte((v>>56)&0x7f|0x80), | ||||
| 			1) | ||||
| 	} | ||||
| 	return b | ||||
| } | ||||
|  | ||||
| // ConsumeVarint parses b as a varint-encoded uint64, reporting its length. | ||||
| // This returns a negative length upon an error (see ParseError). | ||||
| func ConsumeVarint(b []byte) (v uint64, n int) { | ||||
| 	var y uint64 | ||||
| 	if len(b) <= 0 { | ||||
| 		return 0, errCodeTruncated | ||||
| 	} | ||||
| 	v = uint64(b[0]) | ||||
| 	if v < 0x80 { | ||||
| 		return v, 1 | ||||
| 	} | ||||
| 	v -= 0x80 | ||||
|  | ||||
| 	if len(b) <= 1 { | ||||
| 		return 0, errCodeTruncated | ||||
| 	} | ||||
| 	y = uint64(b[1]) | ||||
| 	v += y << 7 | ||||
| 	if y < 0x80 { | ||||
| 		return v, 2 | ||||
| 	} | ||||
| 	v -= 0x80 << 7 | ||||
|  | ||||
| 	if len(b) <= 2 { | ||||
| 		return 0, errCodeTruncated | ||||
| 	} | ||||
| 	y = uint64(b[2]) | ||||
| 	v += y << 14 | ||||
| 	if y < 0x80 { | ||||
| 		return v, 3 | ||||
| 	} | ||||
| 	v -= 0x80 << 14 | ||||
|  | ||||
| 	if len(b) <= 3 { | ||||
| 		return 0, errCodeTruncated | ||||
| 	} | ||||
| 	y = uint64(b[3]) | ||||
| 	v += y << 21 | ||||
| 	if y < 0x80 { | ||||
| 		return v, 4 | ||||
| 	} | ||||
| 	v -= 0x80 << 21 | ||||
|  | ||||
| 	if len(b) <= 4 { | ||||
| 		return 0, errCodeTruncated | ||||
| 	} | ||||
| 	y = uint64(b[4]) | ||||
| 	v += y << 28 | ||||
| 	if y < 0x80 { | ||||
| 		return v, 5 | ||||
| 	} | ||||
| 	v -= 0x80 << 28 | ||||
|  | ||||
| 	if len(b) <= 5 { | ||||
| 		return 0, errCodeTruncated | ||||
| 	} | ||||
| 	y = uint64(b[5]) | ||||
| 	v += y << 35 | ||||
| 	if y < 0x80 { | ||||
| 		return v, 6 | ||||
| 	} | ||||
| 	v -= 0x80 << 35 | ||||
|  | ||||
| 	if len(b) <= 6 { | ||||
| 		return 0, errCodeTruncated | ||||
| 	} | ||||
| 	y = uint64(b[6]) | ||||
| 	v += y << 42 | ||||
| 	if y < 0x80 { | ||||
| 		return v, 7 | ||||
| 	} | ||||
| 	v -= 0x80 << 42 | ||||
|  | ||||
| 	if len(b) <= 7 { | ||||
| 		return 0, errCodeTruncated | ||||
| 	} | ||||
| 	y = uint64(b[7]) | ||||
| 	v += y << 49 | ||||
| 	if y < 0x80 { | ||||
| 		return v, 8 | ||||
| 	} | ||||
| 	v -= 0x80 << 49 | ||||
|  | ||||
| 	if len(b) <= 8 { | ||||
| 		return 0, errCodeTruncated | ||||
| 	} | ||||
| 	y = uint64(b[8]) | ||||
| 	v += y << 56 | ||||
| 	if y < 0x80 { | ||||
| 		return v, 9 | ||||
| 	} | ||||
| 	v -= 0x80 << 56 | ||||
|  | ||||
| 	if len(b) <= 9 { | ||||
| 		return 0, errCodeTruncated | ||||
| 	} | ||||
| 	y = uint64(b[9]) | ||||
| 	v += y << 63 | ||||
| 	if y < 2 { | ||||
| 		return v, 10 | ||||
| 	} | ||||
| 	return 0, errCodeOverflow | ||||
| } | ||||
|  | ||||
| // SizeVarint returns the encoded size of a varint. | ||||
| // The size is guaranteed to be within 1 and 10, inclusive. | ||||
| func SizeVarint(v uint64) int { | ||||
| 	// This computes 1 + (bits.Len64(v)-1)/7. | ||||
| 	// 9/64 is a good enough approximation of 1/7 | ||||
| 	return int(9*uint32(bits.Len64(v))+64) / 64 | ||||
| } | ||||
|  | ||||
| // AppendFixed32 appends v to b as a little-endian uint32. | ||||
| func AppendFixed32(b []byte, v uint32) []byte { | ||||
| 	return append(b, | ||||
| 		byte(v>>0), | ||||
| 		byte(v>>8), | ||||
| 		byte(v>>16), | ||||
| 		byte(v>>24)) | ||||
| } | ||||
|  | ||||
| // ConsumeFixed32 parses b as a little-endian uint32, reporting its length. | ||||
| // This returns a negative length upon an error (see ParseError). | ||||
| func ConsumeFixed32(b []byte) (v uint32, n int) { | ||||
| 	if len(b) < 4 { | ||||
| 		return 0, errCodeTruncated | ||||
| 	} | ||||
| 	v = uint32(b[0])<<0 | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 | ||||
| 	return v, 4 | ||||
| } | ||||
|  | ||||
| // SizeFixed32 returns the encoded size of a fixed32; which is always 4. | ||||
| func SizeFixed32() int { | ||||
| 	return 4 | ||||
| } | ||||
|  | ||||
| // AppendFixed64 appends v to b as a little-endian uint64. | ||||
| func AppendFixed64(b []byte, v uint64) []byte { | ||||
| 	return append(b, | ||||
| 		byte(v>>0), | ||||
| 		byte(v>>8), | ||||
| 		byte(v>>16), | ||||
| 		byte(v>>24), | ||||
| 		byte(v>>32), | ||||
| 		byte(v>>40), | ||||
| 		byte(v>>48), | ||||
| 		byte(v>>56)) | ||||
| } | ||||
|  | ||||
| // ConsumeFixed64 parses b as a little-endian uint64, reporting its length. | ||||
| // This returns a negative length upon an error (see ParseError). | ||||
| func ConsumeFixed64(b []byte) (v uint64, n int) { | ||||
| 	if len(b) < 8 { | ||||
| 		return 0, errCodeTruncated | ||||
| 	} | ||||
| 	v = uint64(b[0])<<0 | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 | ||||
| 	return v, 8 | ||||
| } | ||||
|  | ||||
| // SizeFixed64 returns the encoded size of a fixed64; which is always 8. | ||||
| func SizeFixed64() int { | ||||
| 	return 8 | ||||
| } | ||||
|  | ||||
| // AppendBytes appends v to b as a length-prefixed bytes value. | ||||
| func AppendBytes(b []byte, v []byte) []byte { | ||||
| 	return append(AppendVarint(b, uint64(len(v))), v...) | ||||
| } | ||||
|  | ||||
| // ConsumeBytes parses b as a length-prefixed bytes value, reporting its length. | ||||
| // This returns a negative length upon an error (see ParseError). | ||||
| func ConsumeBytes(b []byte) (v []byte, n int) { | ||||
| 	m, n := ConsumeVarint(b) | ||||
| 	if n < 0 { | ||||
| 		return nil, n // forward error code | ||||
| 	} | ||||
| 	if m > uint64(len(b[n:])) { | ||||
| 		return nil, errCodeTruncated | ||||
| 	} | ||||
| 	return b[n:][:m], n + int(m) | ||||
| } | ||||
|  | ||||
| // SizeBytes returns the encoded size of a length-prefixed bytes value, | ||||
| // given only the length. | ||||
| func SizeBytes(n int) int { | ||||
| 	return SizeVarint(uint64(n)) + n | ||||
| } | ||||
|  | ||||
| // AppendString appends v to b as a length-prefixed bytes value. | ||||
| func AppendString(b []byte, v string) []byte { | ||||
| 	return append(AppendVarint(b, uint64(len(v))), v...) | ||||
| } | ||||
|  | ||||
| // ConsumeString parses b as a length-prefixed bytes value, reporting its length. | ||||
| // This returns a negative length upon an error (see ParseError). | ||||
| func ConsumeString(b []byte) (v string, n int) { | ||||
| 	bb, n := ConsumeBytes(b) | ||||
| 	return string(bb), n | ||||
| } | ||||
|  | ||||
| // AppendGroup appends v to b as group value, with a trailing end group marker. | ||||
| // The value v must not contain the end marker. | ||||
| func AppendGroup(b []byte, num Number, v []byte) []byte { | ||||
| 	return AppendVarint(append(b, v...), EncodeTag(num, EndGroupType)) | ||||
| } | ||||
|  | ||||
| // ConsumeGroup parses b as a group value until the trailing end group marker, | ||||
| // and verifies that the end marker matches the provided num. The value v | ||||
| // does not contain the end marker, while the length does contain the end marker. | ||||
| // This returns a negative length upon an error (see ParseError). | ||||
| func ConsumeGroup(num Number, b []byte) (v []byte, n int) { | ||||
| 	n = ConsumeFieldValue(num, StartGroupType, b) | ||||
| 	if n < 0 { | ||||
| 		return nil, n // forward error code | ||||
| 	} | ||||
| 	b = b[:n] | ||||
|  | ||||
| 	// Truncate off end group marker, but need to handle denormalized varints. | ||||
| 	// Assuming end marker is never 0 (which is always the case since | ||||
| 	// EndGroupType is non-zero), we can truncate all trailing bytes where the | ||||
| 	// lower 7 bits are all zero (implying that the varint is denormalized). | ||||
| 	for len(b) > 0 && b[len(b)-1]&0x7f == 0 { | ||||
| 		b = b[:len(b)-1] | ||||
| 	} | ||||
| 	b = b[:len(b)-SizeTag(num)] | ||||
| 	return b, n | ||||
| } | ||||
|  | ||||
| // SizeGroup returns the encoded size of a group, given only the length. | ||||
| func SizeGroup(num Number, n int) int { | ||||
| 	return n + SizeTag(num) | ||||
| } | ||||
|  | ||||
| // DecodeTag decodes the field Number and wire Type from its unified form. | ||||
| // The Number is -1 if the decoded field number overflows int32. | ||||
| // Other than overflow, this does not check for field number validity. | ||||
| func DecodeTag(x uint64) (Number, Type) { | ||||
| 	// NOTE: MessageSet allows for larger field numbers than normal. | ||||
| 	if x>>3 > uint64(math.MaxInt32) { | ||||
| 		return -1, 0 | ||||
| 	} | ||||
| 	return Number(x >> 3), Type(x & 7) | ||||
| } | ||||
|  | ||||
| // EncodeTag encodes the field Number and wire Type into its unified form. | ||||
| func EncodeTag(num Number, typ Type) uint64 { | ||||
| 	return uint64(num)<<3 | uint64(typ&7) | ||||
| } | ||||
|  | ||||
| // DecodeZigZag decodes a zig-zag-encoded uint64 as an int64. | ||||
| //	Input:  {…,  5,  3,  1,  0,  2,  4,  6, …} | ||||
| //	Output: {…, -3, -2, -1,  0, +1, +2, +3, …} | ||||
| func DecodeZigZag(x uint64) int64 { | ||||
| 	return int64(x>>1) ^ int64(x)<<63>>63 | ||||
| } | ||||
|  | ||||
| // EncodeZigZag encodes an int64 as a zig-zag-encoded uint64. | ||||
| //	Input:  {…, -3, -2, -1,  0, +1, +2, +3, …} | ||||
| //	Output: {…,  5,  3,  1,  0,  2,  4,  6, …} | ||||
| func EncodeZigZag(x int64) uint64 { | ||||
| 	return uint64(x<<1) ^ uint64(x>>63) | ||||
| } | ||||
|  | ||||
| // DecodeBool decodes a uint64 as a bool. | ||||
| //	Input:  {    0,    1,    2, …} | ||||
| //	Output: {false, true, true, …} | ||||
| func DecodeBool(x uint64) bool { | ||||
| 	return x != 0 | ||||
| } | ||||
|  | ||||
| // EncodeBool encodes a bool as a uint64. | ||||
| //	Input:  {false, true} | ||||
| //	Output: {    0,    1} | ||||
| func EncodeBool(x bool) uint64 { | ||||
| 	if x { | ||||
| 		return 1 | ||||
| 	} | ||||
| 	return 0 | ||||
| } | ||||
							
								
								
									
										318
									
								
								vendor/google.golang.org/protobuf/internal/descfmt/stringer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										318
									
								
								vendor/google.golang.org/protobuf/internal/descfmt/stringer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,318 @@ | ||||
| // 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 descfmt provides functionality to format descriptors. | ||||
| package descfmt | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"reflect" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/detrand" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| type list interface { | ||||
| 	Len() int | ||||
| 	pragma.DoNotImplement | ||||
| } | ||||
|  | ||||
| func FormatList(s fmt.State, r rune, vs list) { | ||||
| 	io.WriteString(s, formatListOpt(vs, true, r == 'v' && (s.Flag('+') || s.Flag('#')))) | ||||
| } | ||||
| func formatListOpt(vs list, isRoot, allowMulti bool) string { | ||||
| 	start, end := "[", "]" | ||||
| 	if isRoot { | ||||
| 		var name string | ||||
| 		switch vs.(type) { | ||||
| 		case pref.Names: | ||||
| 			name = "Names" | ||||
| 		case pref.FieldNumbers: | ||||
| 			name = "FieldNumbers" | ||||
| 		case pref.FieldRanges: | ||||
| 			name = "FieldRanges" | ||||
| 		case pref.EnumRanges: | ||||
| 			name = "EnumRanges" | ||||
| 		case pref.FileImports: | ||||
| 			name = "FileImports" | ||||
| 		case pref.Descriptor: | ||||
| 			name = reflect.ValueOf(vs).MethodByName("Get").Type().Out(0).Name() + "s" | ||||
| 		default: | ||||
| 			name = reflect.ValueOf(vs).Elem().Type().Name() | ||||
| 		} | ||||
| 		start, end = name+"{", "}" | ||||
| 	} | ||||
|  | ||||
| 	var ss []string | ||||
| 	switch vs := vs.(type) { | ||||
| 	case pref.Names: | ||||
| 		for i := 0; i < vs.Len(); i++ { | ||||
| 			ss = append(ss, fmt.Sprint(vs.Get(i))) | ||||
| 		} | ||||
| 		return start + joinStrings(ss, false) + end | ||||
| 	case pref.FieldNumbers: | ||||
| 		for i := 0; i < vs.Len(); i++ { | ||||
| 			ss = append(ss, fmt.Sprint(vs.Get(i))) | ||||
| 		} | ||||
| 		return start + joinStrings(ss, false) + end | ||||
| 	case pref.FieldRanges: | ||||
| 		for i := 0; i < vs.Len(); i++ { | ||||
| 			r := vs.Get(i) | ||||
| 			if r[0]+1 == r[1] { | ||||
| 				ss = append(ss, fmt.Sprintf("%d", r[0])) | ||||
| 			} else { | ||||
| 				ss = append(ss, fmt.Sprintf("%d:%d", r[0], r[1])) // enum ranges are end exclusive | ||||
| 			} | ||||
| 		} | ||||
| 		return start + joinStrings(ss, false) + end | ||||
| 	case pref.EnumRanges: | ||||
| 		for i := 0; i < vs.Len(); i++ { | ||||
| 			r := vs.Get(i) | ||||
| 			if r[0] == r[1] { | ||||
| 				ss = append(ss, fmt.Sprintf("%d", r[0])) | ||||
| 			} else { | ||||
| 				ss = append(ss, fmt.Sprintf("%d:%d", r[0], int64(r[1])+1)) // enum ranges are end inclusive | ||||
| 			} | ||||
| 		} | ||||
| 		return start + joinStrings(ss, false) + end | ||||
| 	case pref.FileImports: | ||||
| 		for i := 0; i < vs.Len(); i++ { | ||||
| 			var rs records | ||||
| 			rs.Append(reflect.ValueOf(vs.Get(i)), "Path", "Package", "IsPublic", "IsWeak") | ||||
| 			ss = append(ss, "{"+rs.Join()+"}") | ||||
| 		} | ||||
| 		return start + joinStrings(ss, allowMulti) + end | ||||
| 	default: | ||||
| 		_, isEnumValue := vs.(pref.EnumValueDescriptors) | ||||
| 		for i := 0; i < vs.Len(); i++ { | ||||
| 			m := reflect.ValueOf(vs).MethodByName("Get") | ||||
| 			v := m.Call([]reflect.Value{reflect.ValueOf(i)})[0].Interface() | ||||
| 			ss = append(ss, formatDescOpt(v.(pref.Descriptor), false, allowMulti && !isEnumValue)) | ||||
| 		} | ||||
| 		return start + joinStrings(ss, allowMulti && isEnumValue) + end | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // descriptorAccessors is a list of accessors to print for each descriptor. | ||||
| // | ||||
| // Do not print all accessors since some contain redundant information, | ||||
| // while others are pointers that we do not want to follow since the descriptor | ||||
| // is actually a cyclic graph. | ||||
| // | ||||
| // Using a list allows us to print the accessors in a sensible order. | ||||
| var descriptorAccessors = map[reflect.Type][]string{ | ||||
| 	reflect.TypeOf((*pref.FileDescriptor)(nil)).Elem():      {"Path", "Package", "Imports", "Messages", "Enums", "Extensions", "Services"}, | ||||
| 	reflect.TypeOf((*pref.MessageDescriptor)(nil)).Elem():   {"IsMapEntry", "Fields", "Oneofs", "ReservedNames", "ReservedRanges", "RequiredNumbers", "ExtensionRanges", "Messages", "Enums", "Extensions"}, | ||||
| 	reflect.TypeOf((*pref.FieldDescriptor)(nil)).Elem():     {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "HasPresence", "IsExtension", "IsPacked", "IsWeak", "IsList", "IsMap", "MapKey", "MapValue", "HasDefault", "Default", "ContainingOneof", "ContainingMessage", "Message", "Enum"}, | ||||
| 	reflect.TypeOf((*pref.OneofDescriptor)(nil)).Elem():     {"Fields"}, // not directly used; must keep in sync with formatDescOpt | ||||
| 	reflect.TypeOf((*pref.EnumDescriptor)(nil)).Elem():      {"Values", "ReservedNames", "ReservedRanges"}, | ||||
| 	reflect.TypeOf((*pref.EnumValueDescriptor)(nil)).Elem(): {"Number"}, | ||||
| 	reflect.TypeOf((*pref.ServiceDescriptor)(nil)).Elem():   {"Methods"}, | ||||
| 	reflect.TypeOf((*pref.MethodDescriptor)(nil)).Elem():    {"Input", "Output", "IsStreamingClient", "IsStreamingServer"}, | ||||
| } | ||||
|  | ||||
| func FormatDesc(s fmt.State, r rune, t pref.Descriptor) { | ||||
| 	io.WriteString(s, formatDescOpt(t, true, r == 'v' && (s.Flag('+') || s.Flag('#')))) | ||||
| } | ||||
| func formatDescOpt(t pref.Descriptor, isRoot, allowMulti bool) string { | ||||
| 	rv := reflect.ValueOf(t) | ||||
| 	rt := rv.MethodByName("ProtoType").Type().In(0) | ||||
|  | ||||
| 	start, end := "{", "}" | ||||
| 	if isRoot { | ||||
| 		start = rt.Name() + "{" | ||||
| 	} | ||||
|  | ||||
| 	_, isFile := t.(pref.FileDescriptor) | ||||
| 	rs := records{allowMulti: allowMulti} | ||||
| 	if t.IsPlaceholder() { | ||||
| 		if isFile { | ||||
| 			rs.Append(rv, "Path", "Package", "IsPlaceholder") | ||||
| 		} else { | ||||
| 			rs.Append(rv, "FullName", "IsPlaceholder") | ||||
| 		} | ||||
| 	} else { | ||||
| 		switch { | ||||
| 		case isFile: | ||||
| 			rs.Append(rv, "Syntax") | ||||
| 		case isRoot: | ||||
| 			rs.Append(rv, "Syntax", "FullName") | ||||
| 		default: | ||||
| 			rs.Append(rv, "Name") | ||||
| 		} | ||||
| 		switch t := t.(type) { | ||||
| 		case pref.FieldDescriptor: | ||||
| 			for _, s := range descriptorAccessors[rt] { | ||||
| 				switch s { | ||||
| 				case "MapKey": | ||||
| 					if k := t.MapKey(); k != nil { | ||||
| 						rs.recs = append(rs.recs, [2]string{"MapKey", k.Kind().String()}) | ||||
| 					} | ||||
| 				case "MapValue": | ||||
| 					if v := t.MapValue(); v != nil { | ||||
| 						switch v.Kind() { | ||||
| 						case pref.EnumKind: | ||||
| 							rs.recs = append(rs.recs, [2]string{"MapValue", string(v.Enum().FullName())}) | ||||
| 						case pref.MessageKind, pref.GroupKind: | ||||
| 							rs.recs = append(rs.recs, [2]string{"MapValue", string(v.Message().FullName())}) | ||||
| 						default: | ||||
| 							rs.recs = append(rs.recs, [2]string{"MapValue", v.Kind().String()}) | ||||
| 						} | ||||
| 					} | ||||
| 				case "ContainingOneof": | ||||
| 					if od := t.ContainingOneof(); od != nil { | ||||
| 						rs.recs = append(rs.recs, [2]string{"Oneof", string(od.Name())}) | ||||
| 					} | ||||
| 				case "ContainingMessage": | ||||
| 					if t.IsExtension() { | ||||
| 						rs.recs = append(rs.recs, [2]string{"Extendee", string(t.ContainingMessage().FullName())}) | ||||
| 					} | ||||
| 				case "Message": | ||||
| 					if !t.IsMap() { | ||||
| 						rs.Append(rv, s) | ||||
| 					} | ||||
| 				default: | ||||
| 					rs.Append(rv, s) | ||||
| 				} | ||||
| 			} | ||||
| 		case pref.OneofDescriptor: | ||||
| 			var ss []string | ||||
| 			fs := t.Fields() | ||||
| 			for i := 0; i < fs.Len(); i++ { | ||||
| 				ss = append(ss, string(fs.Get(i).Name())) | ||||
| 			} | ||||
| 			if len(ss) > 0 { | ||||
| 				rs.recs = append(rs.recs, [2]string{"Fields", "[" + joinStrings(ss, false) + "]"}) | ||||
| 			} | ||||
| 		default: | ||||
| 			rs.Append(rv, descriptorAccessors[rt]...) | ||||
| 		} | ||||
| 		if rv.MethodByName("GoType").IsValid() { | ||||
| 			rs.Append(rv, "GoType") | ||||
| 		} | ||||
| 	} | ||||
| 	return start + rs.Join() + end | ||||
| } | ||||
|  | ||||
| type records struct { | ||||
| 	recs       [][2]string | ||||
| 	allowMulti bool | ||||
| } | ||||
|  | ||||
| func (rs *records) Append(v reflect.Value, accessors ...string) { | ||||
| 	for _, a := range accessors { | ||||
| 		var rv reflect.Value | ||||
| 		if m := v.MethodByName(a); m.IsValid() { | ||||
| 			rv = m.Call(nil)[0] | ||||
| 		} | ||||
| 		if v.Kind() == reflect.Struct && !rv.IsValid() { | ||||
| 			rv = v.FieldByName(a) | ||||
| 		} | ||||
| 		if !rv.IsValid() { | ||||
| 			panic(fmt.Sprintf("unknown accessor: %v.%s", v.Type(), a)) | ||||
| 		} | ||||
| 		if _, ok := rv.Interface().(pref.Value); ok { | ||||
| 			rv = rv.MethodByName("Interface").Call(nil)[0] | ||||
| 			if !rv.IsNil() { | ||||
| 				rv = rv.Elem() | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Ignore zero values. | ||||
| 		var isZero bool | ||||
| 		switch rv.Kind() { | ||||
| 		case reflect.Interface, reflect.Slice: | ||||
| 			isZero = rv.IsNil() | ||||
| 		case reflect.Bool: | ||||
| 			isZero = rv.Bool() == false | ||||
| 		case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | ||||
| 			isZero = rv.Int() == 0 | ||||
| 		case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: | ||||
| 			isZero = rv.Uint() == 0 | ||||
| 		case reflect.String: | ||||
| 			isZero = rv.String() == "" | ||||
| 		} | ||||
| 		if n, ok := rv.Interface().(list); ok { | ||||
| 			isZero = n.Len() == 0 | ||||
| 		} | ||||
| 		if isZero { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		// Format the value. | ||||
| 		var s string | ||||
| 		v := rv.Interface() | ||||
| 		switch v := v.(type) { | ||||
| 		case list: | ||||
| 			s = formatListOpt(v, false, rs.allowMulti) | ||||
| 		case pref.FieldDescriptor, pref.OneofDescriptor, pref.EnumValueDescriptor, pref.MethodDescriptor: | ||||
| 			s = string(v.(pref.Descriptor).Name()) | ||||
| 		case pref.Descriptor: | ||||
| 			s = string(v.FullName()) | ||||
| 		case string: | ||||
| 			s = strconv.Quote(v) | ||||
| 		case []byte: | ||||
| 			s = fmt.Sprintf("%q", v) | ||||
| 		default: | ||||
| 			s = fmt.Sprint(v) | ||||
| 		} | ||||
| 		rs.recs = append(rs.recs, [2]string{a, s}) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (rs *records) Join() string { | ||||
| 	var ss []string | ||||
|  | ||||
| 	// In single line mode, simply join all records with commas. | ||||
| 	if !rs.allowMulti { | ||||
| 		for _, r := range rs.recs { | ||||
| 			ss = append(ss, r[0]+formatColon(0)+r[1]) | ||||
| 		} | ||||
| 		return joinStrings(ss, false) | ||||
| 	} | ||||
|  | ||||
| 	// In allowMulti line mode, align single line records for more readable output. | ||||
| 	var maxLen int | ||||
| 	flush := func(i int) { | ||||
| 		for _, r := range rs.recs[len(ss):i] { | ||||
| 			ss = append(ss, r[0]+formatColon(maxLen-len(r[0]))+r[1]) | ||||
| 		} | ||||
| 		maxLen = 0 | ||||
| 	} | ||||
| 	for i, r := range rs.recs { | ||||
| 		if isMulti := strings.Contains(r[1], "\n"); isMulti { | ||||
| 			flush(i) | ||||
| 			ss = append(ss, r[0]+formatColon(0)+strings.Join(strings.Split(r[1], "\n"), "\n\t")) | ||||
| 		} else if maxLen < len(r[0]) { | ||||
| 			maxLen = len(r[0]) | ||||
| 		} | ||||
| 	} | ||||
| 	flush(len(rs.recs)) | ||||
| 	return joinStrings(ss, true) | ||||
| } | ||||
|  | ||||
| func formatColon(padding int) string { | ||||
| 	// Deliberately introduce instability into the debug output to | ||||
| 	// discourage users from performing string comparisons. | ||||
| 	// This provides us flexibility to change the output in the future. | ||||
| 	if detrand.Bool() { | ||||
| 		return ":" + strings.Repeat(" ", 1+padding) // use non-breaking spaces (U+00a0) | ||||
| 	} else { | ||||
| 		return ":" + strings.Repeat(" ", 1+padding) // use regular spaces (U+0020) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func joinStrings(ss []string, isMulti bool) string { | ||||
| 	if len(ss) == 0 { | ||||
| 		return "" | ||||
| 	} | ||||
| 	if isMulti { | ||||
| 		return "\n\t" + strings.Join(ss, "\n\t") + "\n" | ||||
| 	} | ||||
| 	return strings.Join(ss, ", ") | ||||
| } | ||||
							
								
								
									
										29
									
								
								vendor/google.golang.org/protobuf/internal/descopts/options.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								vendor/google.golang.org/protobuf/internal/descopts/options.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| // 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 descopts contains the nil pointers to concrete descriptor options. | ||||
| // | ||||
| // This package exists as a form of reverse dependency injection so that certain | ||||
| // packages (e.g., internal/filedesc and internal/filetype can avoid a direct | ||||
| // dependency on the descriptor proto package). | ||||
| package descopts | ||||
|  | ||||
| import pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
|  | ||||
| // These variables are set by the init function in descriptor.pb.go via logic | ||||
| // in internal/filetype. In other words, so long as the descriptor proto package | ||||
| // is linked in, these variables will be populated. | ||||
| // | ||||
| // Each variable is populated with a nil pointer to the options struct. | ||||
| var ( | ||||
| 	File           pref.ProtoMessage | ||||
| 	Enum           pref.ProtoMessage | ||||
| 	EnumValue      pref.ProtoMessage | ||||
| 	Message        pref.ProtoMessage | ||||
| 	Field          pref.ProtoMessage | ||||
| 	Oneof          pref.ProtoMessage | ||||
| 	ExtensionRange pref.ProtoMessage | ||||
| 	Service        pref.ProtoMessage | ||||
| 	Method         pref.ProtoMessage | ||||
| ) | ||||
							
								
								
									
										69
									
								
								vendor/google.golang.org/protobuf/internal/detrand/rand.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								vendor/google.golang.org/protobuf/internal/detrand/rand.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| // 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 detrand provides deterministically random functionality. | ||||
| // | ||||
| // The pseudo-randomness of these functions is seeded by the program binary | ||||
| // itself and guarantees that the output does not change within a program, | ||||
| // while ensuring that the output is unstable across different builds. | ||||
| package detrand | ||||
|  | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| 	"hash/fnv" | ||||
| 	"os" | ||||
| ) | ||||
|  | ||||
| // Disable disables detrand such that all functions returns the zero value. | ||||
| // This function is not concurrent-safe and must be called during program init. | ||||
| func Disable() { | ||||
| 	randSeed = 0 | ||||
| } | ||||
|  | ||||
| // Bool returns a deterministically random boolean. | ||||
| func Bool() bool { | ||||
| 	return randSeed%2 == 1 | ||||
| } | ||||
|  | ||||
| // Intn returns a deterministically random integer between 0 and n-1, inclusive. | ||||
| func Intn(n int) int { | ||||
| 	if n <= 0 { | ||||
| 		panic("must be positive") | ||||
| 	} | ||||
| 	return int(randSeed % uint64(n)) | ||||
| } | ||||
|  | ||||
| // randSeed is a best-effort at an approximate hash of the Go binary. | ||||
| var randSeed = binaryHash() | ||||
|  | ||||
| func binaryHash() uint64 { | ||||
| 	// Open the Go binary. | ||||
| 	s, err := os.Executable() | ||||
| 	if err != nil { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	f, err := os.Open(s) | ||||
| 	if err != nil { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	defer f.Close() | ||||
|  | ||||
| 	// Hash the size and several samples of the Go binary. | ||||
| 	const numSamples = 8 | ||||
| 	var buf [64]byte | ||||
| 	h := fnv.New64() | ||||
| 	fi, err := f.Stat() | ||||
| 	if err != nil { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	binary.LittleEndian.PutUint64(buf[:8], uint64(fi.Size())) | ||||
| 	h.Write(buf[:8]) | ||||
| 	for i := int64(0); i < numSamples; i++ { | ||||
| 		if _, err := f.ReadAt(buf[:], i*fi.Size()/numSamples); err != nil { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		h.Write(buf[:]) | ||||
| 	} | ||||
| 	return h.Sum64() | ||||
| } | ||||
							
								
								
									
										213
									
								
								vendor/google.golang.org/protobuf/internal/encoding/defval/default.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								vendor/google.golang.org/protobuf/internal/encoding/defval/default.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,213 @@ | ||||
| // 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 defval marshals and unmarshals textual forms of default values. | ||||
| // | ||||
| // This package handles both the form historically used in Go struct field tags | ||||
| // and also the form used by google.protobuf.FieldDescriptorProto.default_value | ||||
| // since they differ in superficial ways. | ||||
| package defval | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"math" | ||||
| 	"strconv" | ||||
|  | ||||
| 	ptext "google.golang.org/protobuf/internal/encoding/text" | ||||
| 	errors "google.golang.org/protobuf/internal/errors" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| // Format is the serialization format used to represent the default value. | ||||
| type Format int | ||||
|  | ||||
| const ( | ||||
| 	_ Format = iota | ||||
|  | ||||
| 	// Descriptor uses the serialization format that protoc uses with the | ||||
| 	// google.protobuf.FieldDescriptorProto.default_value field. | ||||
| 	Descriptor | ||||
|  | ||||
| 	// GoTag uses the historical serialization format in Go struct field tags. | ||||
| 	GoTag | ||||
| ) | ||||
|  | ||||
| // Unmarshal deserializes the default string s according to the given kind k. | ||||
| // When k is an enum, a list of enum value descriptors must be provided. | ||||
| func Unmarshal(s string, k pref.Kind, evs pref.EnumValueDescriptors, f Format) (pref.Value, pref.EnumValueDescriptor, error) { | ||||
| 	switch k { | ||||
| 	case pref.BoolKind: | ||||
| 		if f == GoTag { | ||||
| 			switch s { | ||||
| 			case "1": | ||||
| 				return pref.ValueOfBool(true), nil, nil | ||||
| 			case "0": | ||||
| 				return pref.ValueOfBool(false), nil, nil | ||||
| 			} | ||||
| 		} else { | ||||
| 			switch s { | ||||
| 			case "true": | ||||
| 				return pref.ValueOfBool(true), nil, nil | ||||
| 			case "false": | ||||
| 				return pref.ValueOfBool(false), nil, nil | ||||
| 			} | ||||
| 		} | ||||
| 	case pref.EnumKind: | ||||
| 		if f == GoTag { | ||||
| 			// Go tags use the numeric form of the enum value. | ||||
| 			if n, err := strconv.ParseInt(s, 10, 32); err == nil { | ||||
| 				if ev := evs.ByNumber(pref.EnumNumber(n)); ev != nil { | ||||
| 					return pref.ValueOfEnum(ev.Number()), ev, nil | ||||
| 				} | ||||
| 			} | ||||
| 		} else { | ||||
| 			// Descriptor default_value use the enum identifier. | ||||
| 			ev := evs.ByName(pref.Name(s)) | ||||
| 			if ev != nil { | ||||
| 				return pref.ValueOfEnum(ev.Number()), ev, nil | ||||
| 			} | ||||
| 		} | ||||
| 	case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: | ||||
| 		if v, err := strconv.ParseInt(s, 10, 32); err == nil { | ||||
| 			return pref.ValueOfInt32(int32(v)), nil, nil | ||||
| 		} | ||||
| 	case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: | ||||
| 		if v, err := strconv.ParseInt(s, 10, 64); err == nil { | ||||
| 			return pref.ValueOfInt64(int64(v)), nil, nil | ||||
| 		} | ||||
| 	case pref.Uint32Kind, pref.Fixed32Kind: | ||||
| 		if v, err := strconv.ParseUint(s, 10, 32); err == nil { | ||||
| 			return pref.ValueOfUint32(uint32(v)), nil, nil | ||||
| 		} | ||||
| 	case pref.Uint64Kind, pref.Fixed64Kind: | ||||
| 		if v, err := strconv.ParseUint(s, 10, 64); err == nil { | ||||
| 			return pref.ValueOfUint64(uint64(v)), nil, nil | ||||
| 		} | ||||
| 	case pref.FloatKind, pref.DoubleKind: | ||||
| 		var v float64 | ||||
| 		var err error | ||||
| 		switch s { | ||||
| 		case "-inf": | ||||
| 			v = math.Inf(-1) | ||||
| 		case "inf": | ||||
| 			v = math.Inf(+1) | ||||
| 		case "nan": | ||||
| 			v = math.NaN() | ||||
| 		default: | ||||
| 			v, err = strconv.ParseFloat(s, 64) | ||||
| 		} | ||||
| 		if err == nil { | ||||
| 			if k == pref.FloatKind { | ||||
| 				return pref.ValueOfFloat32(float32(v)), nil, nil | ||||
| 			} else { | ||||
| 				return pref.ValueOfFloat64(float64(v)), nil, nil | ||||
| 			} | ||||
| 		} | ||||
| 	case pref.StringKind: | ||||
| 		// String values are already unescaped and can be used as is. | ||||
| 		return pref.ValueOfString(s), nil, nil | ||||
| 	case pref.BytesKind: | ||||
| 		if b, ok := unmarshalBytes(s); ok { | ||||
| 			return pref.ValueOfBytes(b), nil, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return pref.Value{}, nil, errors.New("could not parse value for %v: %q", k, s) | ||||
| } | ||||
|  | ||||
| // Marshal serializes v as the default string according to the given kind k. | ||||
| // When specifying the Descriptor format for an enum kind, the associated | ||||
| // enum value descriptor must be provided. | ||||
| func Marshal(v pref.Value, ev pref.EnumValueDescriptor, k pref.Kind, f Format) (string, error) { | ||||
| 	switch k { | ||||
| 	case pref.BoolKind: | ||||
| 		if f == GoTag { | ||||
| 			if v.Bool() { | ||||
| 				return "1", nil | ||||
| 			} else { | ||||
| 				return "0", nil | ||||
| 			} | ||||
| 		} else { | ||||
| 			if v.Bool() { | ||||
| 				return "true", nil | ||||
| 			} else { | ||||
| 				return "false", nil | ||||
| 			} | ||||
| 		} | ||||
| 	case pref.EnumKind: | ||||
| 		if f == GoTag { | ||||
| 			return strconv.FormatInt(int64(v.Enum()), 10), nil | ||||
| 		} else { | ||||
| 			return string(ev.Name()), nil | ||||
| 		} | ||||
| 	case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind, pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: | ||||
| 		return strconv.FormatInt(v.Int(), 10), nil | ||||
| 	case pref.Uint32Kind, pref.Fixed32Kind, pref.Uint64Kind, pref.Fixed64Kind: | ||||
| 		return strconv.FormatUint(v.Uint(), 10), nil | ||||
| 	case pref.FloatKind, pref.DoubleKind: | ||||
| 		f := v.Float() | ||||
| 		switch { | ||||
| 		case math.IsInf(f, -1): | ||||
| 			return "-inf", nil | ||||
| 		case math.IsInf(f, +1): | ||||
| 			return "inf", nil | ||||
| 		case math.IsNaN(f): | ||||
| 			return "nan", nil | ||||
| 		default: | ||||
| 			if k == pref.FloatKind { | ||||
| 				return strconv.FormatFloat(f, 'g', -1, 32), nil | ||||
| 			} else { | ||||
| 				return strconv.FormatFloat(f, 'g', -1, 64), nil | ||||
| 			} | ||||
| 		} | ||||
| 	case pref.StringKind: | ||||
| 		// String values are serialized as is without any escaping. | ||||
| 		return v.String(), nil | ||||
| 	case pref.BytesKind: | ||||
| 		if s, ok := marshalBytes(v.Bytes()); ok { | ||||
| 			return s, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return "", errors.New("could not format value for %v: %v", k, v) | ||||
| } | ||||
|  | ||||
| // unmarshalBytes deserializes bytes by applying C unescaping. | ||||
| func unmarshalBytes(s string) ([]byte, bool) { | ||||
| 	// Bytes values use the same escaping as the text format, | ||||
| 	// however they lack the surrounding double quotes. | ||||
| 	v, err := ptext.UnmarshalString(`"` + s + `"`) | ||||
| 	if err != nil { | ||||
| 		return nil, false | ||||
| 	} | ||||
| 	return []byte(v), true | ||||
| } | ||||
|  | ||||
| // marshalBytes serializes bytes by using C escaping. | ||||
| // To match the exact output of protoc, this is identical to the | ||||
| // CEscape function in strutil.cc of the protoc source code. | ||||
| func marshalBytes(b []byte) (string, bool) { | ||||
| 	var s []byte | ||||
| 	for _, c := range b { | ||||
| 		switch c { | ||||
| 		case '\n': | ||||
| 			s = append(s, `\n`...) | ||||
| 		case '\r': | ||||
| 			s = append(s, `\r`...) | ||||
| 		case '\t': | ||||
| 			s = append(s, `\t`...) | ||||
| 		case '"': | ||||
| 			s = append(s, `\"`...) | ||||
| 		case '\'': | ||||
| 			s = append(s, `\'`...) | ||||
| 		case '\\': | ||||
| 			s = append(s, `\\`...) | ||||
| 		default: | ||||
| 			if printableASCII := c >= 0x20 && c <= 0x7e; printableASCII { | ||||
| 				s = append(s, c) | ||||
| 			} else { | ||||
| 				s = append(s, fmt.Sprintf(`\%03o`, c)...) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return string(s), true | ||||
| } | ||||
							
								
								
									
										340
									
								
								vendor/google.golang.org/protobuf/internal/encoding/json/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										340
									
								
								vendor/google.golang.org/protobuf/internal/encoding/json/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,340 @@ | ||||
| // 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 json | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"regexp" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| ) | ||||
|  | ||||
| // call specifies which Decoder method was invoked. | ||||
| type call uint8 | ||||
|  | ||||
| const ( | ||||
| 	readCall call = iota | ||||
| 	peekCall | ||||
| ) | ||||
|  | ||||
| const unexpectedFmt = "unexpected token %s" | ||||
|  | ||||
| // ErrUnexpectedEOF means that EOF was encountered in the middle of the input. | ||||
| var ErrUnexpectedEOF = errors.New("%v", io.ErrUnexpectedEOF) | ||||
|  | ||||
| // Decoder is a token-based JSON decoder. | ||||
| type Decoder struct { | ||||
| 	// lastCall is last method called, either readCall or peekCall. | ||||
| 	// Initial value is readCall. | ||||
| 	lastCall call | ||||
|  | ||||
| 	// lastToken contains the last read token. | ||||
| 	lastToken Token | ||||
|  | ||||
| 	// lastErr contains the last read error. | ||||
| 	lastErr error | ||||
|  | ||||
| 	// openStack is a stack containing ObjectOpen and ArrayOpen values. The | ||||
| 	// top of stack represents the object or the array the current value is | ||||
| 	// directly located in. | ||||
| 	openStack []Kind | ||||
|  | ||||
| 	// orig is used in reporting line and column. | ||||
| 	orig []byte | ||||
| 	// in contains the unconsumed input. | ||||
| 	in []byte | ||||
| } | ||||
|  | ||||
| // NewDecoder returns a Decoder to read the given []byte. | ||||
| func NewDecoder(b []byte) *Decoder { | ||||
| 	return &Decoder{orig: b, in: b} | ||||
| } | ||||
|  | ||||
| // Peek looks ahead and returns the next token kind without advancing a read. | ||||
| func (d *Decoder) Peek() (Token, error) { | ||||
| 	defer func() { d.lastCall = peekCall }() | ||||
| 	if d.lastCall == readCall { | ||||
| 		d.lastToken, d.lastErr = d.Read() | ||||
| 	} | ||||
| 	return d.lastToken, d.lastErr | ||||
| } | ||||
|  | ||||
| // Read returns the next JSON token. | ||||
| // It will return an error if there is no valid token. | ||||
| func (d *Decoder) Read() (Token, error) { | ||||
| 	const scalar = Null | Bool | Number | String | ||||
|  | ||||
| 	defer func() { d.lastCall = readCall }() | ||||
| 	if d.lastCall == peekCall { | ||||
| 		return d.lastToken, d.lastErr | ||||
| 	} | ||||
|  | ||||
| 	tok, err := d.parseNext() | ||||
| 	if err != nil { | ||||
| 		return Token{}, err | ||||
| 	} | ||||
|  | ||||
| 	switch tok.kind { | ||||
| 	case EOF: | ||||
| 		if len(d.openStack) != 0 || | ||||
| 			d.lastToken.kind&scalar|ObjectClose|ArrayClose == 0 { | ||||
| 			return Token{}, ErrUnexpectedEOF | ||||
| 		} | ||||
|  | ||||
| 	case Null: | ||||
| 		if !d.isValueNext() { | ||||
| 			return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) | ||||
| 		} | ||||
|  | ||||
| 	case Bool, Number: | ||||
| 		if !d.isValueNext() { | ||||
| 			return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) | ||||
| 		} | ||||
|  | ||||
| 	case String: | ||||
| 		if d.isValueNext() { | ||||
| 			break | ||||
| 		} | ||||
| 		// This string token should only be for a field name. | ||||
| 		if d.lastToken.kind&(ObjectOpen|comma) == 0 { | ||||
| 			return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) | ||||
| 		} | ||||
| 		if len(d.in) == 0 { | ||||
| 			return Token{}, ErrUnexpectedEOF | ||||
| 		} | ||||
| 		if c := d.in[0]; c != ':' { | ||||
| 			return Token{}, d.newSyntaxError(d.currPos(), `unexpected character %s, missing ":" after field name`, string(c)) | ||||
| 		} | ||||
| 		tok.kind = Name | ||||
| 		d.consume(1) | ||||
|  | ||||
| 	case ObjectOpen, ArrayOpen: | ||||
| 		if !d.isValueNext() { | ||||
| 			return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) | ||||
| 		} | ||||
| 		d.openStack = append(d.openStack, tok.kind) | ||||
|  | ||||
| 	case ObjectClose: | ||||
| 		if len(d.openStack) == 0 || | ||||
| 			d.lastToken.kind == comma || | ||||
| 			d.openStack[len(d.openStack)-1] != ObjectOpen { | ||||
| 			return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) | ||||
| 		} | ||||
| 		d.openStack = d.openStack[:len(d.openStack)-1] | ||||
|  | ||||
| 	case ArrayClose: | ||||
| 		if len(d.openStack) == 0 || | ||||
| 			d.lastToken.kind == comma || | ||||
| 			d.openStack[len(d.openStack)-1] != ArrayOpen { | ||||
| 			return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) | ||||
| 		} | ||||
| 		d.openStack = d.openStack[:len(d.openStack)-1] | ||||
|  | ||||
| 	case comma: | ||||
| 		if len(d.openStack) == 0 || | ||||
| 			d.lastToken.kind&(scalar|ObjectClose|ArrayClose) == 0 { | ||||
| 			return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString()) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Update d.lastToken only after validating token to be in the right sequence. | ||||
| 	d.lastToken = tok | ||||
|  | ||||
| 	if d.lastToken.kind == comma { | ||||
| 		return d.Read() | ||||
| 	} | ||||
| 	return tok, nil | ||||
| } | ||||
|  | ||||
| // Any sequence that looks like a non-delimiter (for error reporting). | ||||
| var errRegexp = regexp.MustCompile(`^([-+._a-zA-Z0-9]{1,32}|.)`) | ||||
|  | ||||
| // parseNext parses for the next JSON token. It returns a Token object for | ||||
| // different types, except for Name. It does not handle whether the next token | ||||
| // is in a valid sequence or not. | ||||
| func (d *Decoder) parseNext() (Token, error) { | ||||
| 	// Trim leading spaces. | ||||
| 	d.consume(0) | ||||
|  | ||||
| 	in := d.in | ||||
| 	if len(in) == 0 { | ||||
| 		return d.consumeToken(EOF, 0), nil | ||||
| 	} | ||||
|  | ||||
| 	switch in[0] { | ||||
| 	case 'n': | ||||
| 		if n := matchWithDelim("null", in); n != 0 { | ||||
| 			return d.consumeToken(Null, n), nil | ||||
| 		} | ||||
|  | ||||
| 	case 't': | ||||
| 		if n := matchWithDelim("true", in); n != 0 { | ||||
| 			return d.consumeBoolToken(true, n), nil | ||||
| 		} | ||||
|  | ||||
| 	case 'f': | ||||
| 		if n := matchWithDelim("false", in); n != 0 { | ||||
| 			return d.consumeBoolToken(false, n), nil | ||||
| 		} | ||||
|  | ||||
| 	case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': | ||||
| 		if n, ok := parseNumber(in); ok { | ||||
| 			return d.consumeToken(Number, n), nil | ||||
| 		} | ||||
|  | ||||
| 	case '"': | ||||
| 		s, n, err := d.parseString(in) | ||||
| 		if err != nil { | ||||
| 			return Token{}, err | ||||
| 		} | ||||
| 		return d.consumeStringToken(s, n), nil | ||||
|  | ||||
| 	case '{': | ||||
| 		return d.consumeToken(ObjectOpen, 1), nil | ||||
|  | ||||
| 	case '}': | ||||
| 		return d.consumeToken(ObjectClose, 1), nil | ||||
|  | ||||
| 	case '[': | ||||
| 		return d.consumeToken(ArrayOpen, 1), nil | ||||
|  | ||||
| 	case ']': | ||||
| 		return d.consumeToken(ArrayClose, 1), nil | ||||
|  | ||||
| 	case ',': | ||||
| 		return d.consumeToken(comma, 1), nil | ||||
| 	} | ||||
| 	return Token{}, d.newSyntaxError(d.currPos(), "invalid value %s", errRegexp.Find(in)) | ||||
| } | ||||
|  | ||||
| // newSyntaxError returns an error with line and column information useful for | ||||
| // syntax errors. | ||||
| func (d *Decoder) newSyntaxError(pos int, f string, x ...interface{}) error { | ||||
| 	e := errors.New(f, x...) | ||||
| 	line, column := d.Position(pos) | ||||
| 	return errors.New("syntax error (line %d:%d): %v", line, column, e) | ||||
| } | ||||
|  | ||||
| // Position returns line and column number of given index of the original input. | ||||
| // It will panic if index is out of range. | ||||
| func (d *Decoder) Position(idx int) (line int, column int) { | ||||
| 	b := d.orig[:idx] | ||||
| 	line = bytes.Count(b, []byte("\n")) + 1 | ||||
| 	if i := bytes.LastIndexByte(b, '\n'); i >= 0 { | ||||
| 		b = b[i+1:] | ||||
| 	} | ||||
| 	column = utf8.RuneCount(b) + 1 // ignore multi-rune characters | ||||
| 	return line, column | ||||
| } | ||||
|  | ||||
| // currPos returns the current index position of d.in from d.orig. | ||||
| func (d *Decoder) currPos() int { | ||||
| 	return len(d.orig) - len(d.in) | ||||
| } | ||||
|  | ||||
| // matchWithDelim matches s with the input b and verifies that the match | ||||
| // terminates with a delimiter of some form (e.g., r"[^-+_.a-zA-Z0-9]"). | ||||
| // As a special case, EOF is considered a delimiter. It returns the length of s | ||||
| // if there is a match, else 0. | ||||
| func matchWithDelim(s string, b []byte) int { | ||||
| 	if !bytes.HasPrefix(b, []byte(s)) { | ||||
| 		return 0 | ||||
| 	} | ||||
|  | ||||
| 	n := len(s) | ||||
| 	if n < len(b) && isNotDelim(b[n]) { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| // isNotDelim returns true if given byte is a not delimiter character. | ||||
| func isNotDelim(c byte) bool { | ||||
| 	return (c == '-' || c == '+' || c == '.' || c == '_' || | ||||
| 		('a' <= c && c <= 'z') || | ||||
| 		('A' <= c && c <= 'Z') || | ||||
| 		('0' <= c && c <= '9')) | ||||
| } | ||||
|  | ||||
| // consume consumes n bytes of input and any subsequent whitespace. | ||||
| func (d *Decoder) consume(n int) { | ||||
| 	d.in = d.in[n:] | ||||
| 	for len(d.in) > 0 { | ||||
| 		switch d.in[0] { | ||||
| 		case ' ', '\n', '\r', '\t': | ||||
| 			d.in = d.in[1:] | ||||
| 		default: | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // isValueNext returns true if next type should be a JSON value: Null, | ||||
| // Number, String or Bool. | ||||
| func (d *Decoder) isValueNext() bool { | ||||
| 	if len(d.openStack) == 0 { | ||||
| 		return d.lastToken.kind == 0 | ||||
| 	} | ||||
|  | ||||
| 	start := d.openStack[len(d.openStack)-1] | ||||
| 	switch start { | ||||
| 	case ObjectOpen: | ||||
| 		return d.lastToken.kind&Name != 0 | ||||
| 	case ArrayOpen: | ||||
| 		return d.lastToken.kind&(ArrayOpen|comma) != 0 | ||||
| 	} | ||||
| 	panic(fmt.Sprintf( | ||||
| 		"unreachable logic in Decoder.isValueNext, lastToken.kind: %v, openStack: %v", | ||||
| 		d.lastToken.kind, start)) | ||||
| } | ||||
|  | ||||
| // consumeToken constructs a Token for given Kind with raw value derived from | ||||
| // current d.in and given size, and consumes the given size-lenght of it. | ||||
| func (d *Decoder) consumeToken(kind Kind, size int) Token { | ||||
| 	tok := Token{ | ||||
| 		kind: kind, | ||||
| 		raw:  d.in[:size], | ||||
| 		pos:  len(d.orig) - len(d.in), | ||||
| 	} | ||||
| 	d.consume(size) | ||||
| 	return tok | ||||
| } | ||||
|  | ||||
| // consumeBoolToken constructs a Token for a Bool kind with raw value derived from | ||||
| // current d.in and given size. | ||||
| func (d *Decoder) consumeBoolToken(b bool, size int) Token { | ||||
| 	tok := Token{ | ||||
| 		kind: Bool, | ||||
| 		raw:  d.in[:size], | ||||
| 		pos:  len(d.orig) - len(d.in), | ||||
| 		boo:  b, | ||||
| 	} | ||||
| 	d.consume(size) | ||||
| 	return tok | ||||
| } | ||||
|  | ||||
| // consumeStringToken constructs a Token for a String kind with raw value derived | ||||
| // from current d.in and given size. | ||||
| func (d *Decoder) consumeStringToken(s string, size int) Token { | ||||
| 	tok := Token{ | ||||
| 		kind: String, | ||||
| 		raw:  d.in[:size], | ||||
| 		pos:  len(d.orig) - len(d.in), | ||||
| 		str:  s, | ||||
| 	} | ||||
| 	d.consume(size) | ||||
| 	return tok | ||||
| } | ||||
|  | ||||
| // Clone returns a copy of the Decoder for use in reading ahead the next JSON | ||||
| // object, array or other values without affecting current Decoder. | ||||
| func (d *Decoder) Clone() *Decoder { | ||||
| 	ret := *d | ||||
| 	ret.openStack = append([]Kind(nil), ret.openStack...) | ||||
| 	return &ret | ||||
| } | ||||
							
								
								
									
										254
									
								
								vendor/google.golang.org/protobuf/internal/encoding/json/decode_number.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										254
									
								
								vendor/google.golang.org/protobuf/internal/encoding/json/decode_number.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,254 @@ | ||||
| // 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 json | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"strconv" | ||||
| ) | ||||
|  | ||||
| // parseNumber reads the given []byte for a valid JSON number. If it is valid, | ||||
| // it returns the number of bytes.  Parsing logic follows the definition in | ||||
| // https://tools.ietf.org/html/rfc7159#section-6, and is based off | ||||
| // encoding/json.isValidNumber function. | ||||
| func parseNumber(input []byte) (int, bool) { | ||||
| 	var n int | ||||
|  | ||||
| 	s := input | ||||
| 	if len(s) == 0 { | ||||
| 		return 0, false | ||||
| 	} | ||||
|  | ||||
| 	// Optional - | ||||
| 	if s[0] == '-' { | ||||
| 		s = s[1:] | ||||
| 		n++ | ||||
| 		if len(s) == 0 { | ||||
| 			return 0, false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Digits | ||||
| 	switch { | ||||
| 	case s[0] == '0': | ||||
| 		s = s[1:] | ||||
| 		n++ | ||||
|  | ||||
| 	case '1' <= s[0] && s[0] <= '9': | ||||
| 		s = s[1:] | ||||
| 		n++ | ||||
| 		for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { | ||||
| 			s = s[1:] | ||||
| 			n++ | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		return 0, false | ||||
| 	} | ||||
|  | ||||
| 	// . followed by 1 or more digits. | ||||
| 	if len(s) >= 2 && s[0] == '.' && '0' <= s[1] && s[1] <= '9' { | ||||
| 		s = s[2:] | ||||
| 		n += 2 | ||||
| 		for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { | ||||
| 			s = s[1:] | ||||
| 			n++ | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// e or E followed by an optional - or + and | ||||
| 	// 1 or more digits. | ||||
| 	if len(s) >= 2 && (s[0] == 'e' || s[0] == 'E') { | ||||
| 		s = s[1:] | ||||
| 		n++ | ||||
| 		if s[0] == '+' || s[0] == '-' { | ||||
| 			s = s[1:] | ||||
| 			n++ | ||||
| 			if len(s) == 0 { | ||||
| 				return 0, false | ||||
| 			} | ||||
| 		} | ||||
| 		for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { | ||||
| 			s = s[1:] | ||||
| 			n++ | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Check that next byte is a delimiter or it is at the end. | ||||
| 	if n < len(input) && isNotDelim(input[n]) { | ||||
| 		return 0, false | ||||
| 	} | ||||
|  | ||||
| 	return n, true | ||||
| } | ||||
|  | ||||
| // numberParts is the result of parsing out a valid JSON number. It contains | ||||
| // the parts of a number. The parts are used for integer conversion. | ||||
| type numberParts struct { | ||||
| 	neg  bool | ||||
| 	intp []byte | ||||
| 	frac []byte | ||||
| 	exp  []byte | ||||
| } | ||||
|  | ||||
| // parseNumber constructs numberParts from given []byte. The logic here is | ||||
| // similar to consumeNumber above with the difference of having to construct | ||||
| // numberParts. The slice fields in numberParts are subslices of the input. | ||||
| func parseNumberParts(input []byte) (numberParts, bool) { | ||||
| 	var neg bool | ||||
| 	var intp []byte | ||||
| 	var frac []byte | ||||
| 	var exp []byte | ||||
|  | ||||
| 	s := input | ||||
| 	if len(s) == 0 { | ||||
| 		return numberParts{}, false | ||||
| 	} | ||||
|  | ||||
| 	// Optional - | ||||
| 	if s[0] == '-' { | ||||
| 		neg = true | ||||
| 		s = s[1:] | ||||
| 		if len(s) == 0 { | ||||
| 			return numberParts{}, false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Digits | ||||
| 	switch { | ||||
| 	case s[0] == '0': | ||||
| 		// Skip first 0 and no need to store. | ||||
| 		s = s[1:] | ||||
|  | ||||
| 	case '1' <= s[0] && s[0] <= '9': | ||||
| 		intp = s | ||||
| 		n := 1 | ||||
| 		s = s[1:] | ||||
| 		for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { | ||||
| 			s = s[1:] | ||||
| 			n++ | ||||
| 		} | ||||
| 		intp = intp[:n] | ||||
|  | ||||
| 	default: | ||||
| 		return numberParts{}, false | ||||
| 	} | ||||
|  | ||||
| 	// . followed by 1 or more digits. | ||||
| 	if len(s) >= 2 && s[0] == '.' && '0' <= s[1] && s[1] <= '9' { | ||||
| 		frac = s[1:] | ||||
| 		n := 1 | ||||
| 		s = s[2:] | ||||
| 		for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { | ||||
| 			s = s[1:] | ||||
| 			n++ | ||||
| 		} | ||||
| 		frac = frac[:n] | ||||
| 	} | ||||
|  | ||||
| 	// e or E followed by an optional - or + and | ||||
| 	// 1 or more digits. | ||||
| 	if len(s) >= 2 && (s[0] == 'e' || s[0] == 'E') { | ||||
| 		s = s[1:] | ||||
| 		exp = s | ||||
| 		n := 0 | ||||
| 		if s[0] == '+' || s[0] == '-' { | ||||
| 			s = s[1:] | ||||
| 			n++ | ||||
| 			if len(s) == 0 { | ||||
| 				return numberParts{}, false | ||||
| 			} | ||||
| 		} | ||||
| 		for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { | ||||
| 			s = s[1:] | ||||
| 			n++ | ||||
| 		} | ||||
| 		exp = exp[:n] | ||||
| 	} | ||||
|  | ||||
| 	return numberParts{ | ||||
| 		neg:  neg, | ||||
| 		intp: intp, | ||||
| 		frac: bytes.TrimRight(frac, "0"), // Remove unnecessary 0s to the right. | ||||
| 		exp:  exp, | ||||
| 	}, true | ||||
| } | ||||
|  | ||||
| // normalizeToIntString returns an integer string in normal form without the | ||||
| // E-notation for given numberParts. It will return false if it is not an | ||||
| // integer or if the exponent exceeds than max/min int value. | ||||
| func normalizeToIntString(n numberParts) (string, bool) { | ||||
| 	intpSize := len(n.intp) | ||||
| 	fracSize := len(n.frac) | ||||
|  | ||||
| 	if intpSize == 0 && fracSize == 0 { | ||||
| 		return "0", true | ||||
| 	} | ||||
|  | ||||
| 	var exp int | ||||
| 	if len(n.exp) > 0 { | ||||
| 		i, err := strconv.ParseInt(string(n.exp), 10, 32) | ||||
| 		if err != nil { | ||||
| 			return "", false | ||||
| 		} | ||||
| 		exp = int(i) | ||||
| 	} | ||||
|  | ||||
| 	var num []byte | ||||
| 	if exp >= 0 { | ||||
| 		// For positive E, shift fraction digits into integer part and also pad | ||||
| 		// with zeroes as needed. | ||||
|  | ||||
| 		// If there are more digits in fraction than the E value, then the | ||||
| 		// number is not an integer. | ||||
| 		if fracSize > exp { | ||||
| 			return "", false | ||||
| 		} | ||||
|  | ||||
| 		// Make sure resulting digits are within max value limit to avoid | ||||
| 		// unnecessarily constructing a large byte slice that may simply fail | ||||
| 		// later on. | ||||
| 		const maxDigits = 20 // Max uint64 value has 20 decimal digits. | ||||
| 		if intpSize+exp > maxDigits { | ||||
| 			return "", false | ||||
| 		} | ||||
|  | ||||
| 		// Set cap to make a copy of integer part when appended. | ||||
| 		num = n.intp[:len(n.intp):len(n.intp)] | ||||
| 		num = append(num, n.frac...) | ||||
| 		for i := 0; i < exp-fracSize; i++ { | ||||
| 			num = append(num, '0') | ||||
| 		} | ||||
| 	} else { | ||||
| 		// For negative E, shift digits in integer part out. | ||||
|  | ||||
| 		// If there are fractions, then the number is not an integer. | ||||
| 		if fracSize > 0 { | ||||
| 			return "", false | ||||
| 		} | ||||
|  | ||||
| 		// index is where the decimal point will be after adjusting for negative | ||||
| 		// exponent. | ||||
| 		index := intpSize + exp | ||||
| 		if index < 0 { | ||||
| 			return "", false | ||||
| 		} | ||||
|  | ||||
| 		num = n.intp | ||||
| 		// If any of the digits being shifted to the right of the decimal point | ||||
| 		// is non-zero, then the number is not an integer. | ||||
| 		for i := index; i < intpSize; i++ { | ||||
| 			if num[i] != '0' { | ||||
| 				return "", false | ||||
| 			} | ||||
| 		} | ||||
| 		num = num[:index] | ||||
| 	} | ||||
|  | ||||
| 	if n.neg { | ||||
| 		return "-" + string(num), true | ||||
| 	} | ||||
| 	return string(num), true | ||||
| } | ||||
							
								
								
									
										91
									
								
								vendor/google.golang.org/protobuf/internal/encoding/json/decode_string.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								vendor/google.golang.org/protobuf/internal/encoding/json/decode_string.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
| // 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 json | ||||
|  | ||||
| import ( | ||||
| 	"strconv" | ||||
| 	"unicode" | ||||
| 	"unicode/utf16" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| ) | ||||
|  | ||||
| func (d *Decoder) parseString(in []byte) (string, int, error) { | ||||
| 	in0 := in | ||||
| 	if len(in) == 0 { | ||||
| 		return "", 0, ErrUnexpectedEOF | ||||
| 	} | ||||
| 	if in[0] != '"' { | ||||
| 		return "", 0, d.newSyntaxError(d.currPos(), "invalid character %q at start of string", in[0]) | ||||
| 	} | ||||
| 	in = in[1:] | ||||
| 	i := indexNeedEscapeInBytes(in) | ||||
| 	in, out := in[i:], in[:i:i] // set cap to prevent mutations | ||||
| 	for len(in) > 0 { | ||||
| 		switch r, n := utf8.DecodeRune(in); { | ||||
| 		case r == utf8.RuneError && n == 1: | ||||
| 			return "", 0, d.newSyntaxError(d.currPos(), "invalid UTF-8 in string") | ||||
| 		case r < ' ': | ||||
| 			return "", 0, d.newSyntaxError(d.currPos(), "invalid character %q in string", r) | ||||
| 		case r == '"': | ||||
| 			in = in[1:] | ||||
| 			n := len(in0) - len(in) | ||||
| 			return string(out), n, nil | ||||
| 		case r == '\\': | ||||
| 			if len(in) < 2 { | ||||
| 				return "", 0, ErrUnexpectedEOF | ||||
| 			} | ||||
| 			switch r := in[1]; r { | ||||
| 			case '"', '\\', '/': | ||||
| 				in, out = in[2:], append(out, r) | ||||
| 			case 'b': | ||||
| 				in, out = in[2:], append(out, '\b') | ||||
| 			case 'f': | ||||
| 				in, out = in[2:], append(out, '\f') | ||||
| 			case 'n': | ||||
| 				in, out = in[2:], append(out, '\n') | ||||
| 			case 'r': | ||||
| 				in, out = in[2:], append(out, '\r') | ||||
| 			case 't': | ||||
| 				in, out = in[2:], append(out, '\t') | ||||
| 			case 'u': | ||||
| 				if len(in) < 6 { | ||||
| 					return "", 0, ErrUnexpectedEOF | ||||
| 				} | ||||
| 				v, err := strconv.ParseUint(string(in[2:6]), 16, 16) | ||||
| 				if err != nil { | ||||
| 					return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:6]) | ||||
| 				} | ||||
| 				in = in[6:] | ||||
|  | ||||
| 				r := rune(v) | ||||
| 				if utf16.IsSurrogate(r) { | ||||
| 					if len(in) < 6 { | ||||
| 						return "", 0, ErrUnexpectedEOF | ||||
| 					} | ||||
| 					v, err := strconv.ParseUint(string(in[2:6]), 16, 16) | ||||
| 					r = utf16.DecodeRune(r, rune(v)) | ||||
| 					if in[0] != '\\' || in[1] != 'u' || | ||||
| 						r == unicode.ReplacementChar || err != nil { | ||||
| 						return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:6]) | ||||
| 					} | ||||
| 					in = in[6:] | ||||
| 				} | ||||
| 				out = append(out, string(r)...) | ||||
| 			default: | ||||
| 				return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:2]) | ||||
| 			} | ||||
| 		default: | ||||
| 			i := indexNeedEscapeInBytes(in[n:]) | ||||
| 			in, out = in[n+i:], append(out, in[:n+i]...) | ||||
| 		} | ||||
| 	} | ||||
| 	return "", 0, ErrUnexpectedEOF | ||||
| } | ||||
|  | ||||
| // indexNeedEscapeInBytes returns the index of the character that needs | ||||
| // escaping. If no characters need escaping, this returns the input length. | ||||
| func indexNeedEscapeInBytes(b []byte) int { return indexNeedEscapeInString(strs.UnsafeString(b)) } | ||||
							
								
								
									
										192
									
								
								vendor/google.golang.org/protobuf/internal/encoding/json/decode_token.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										192
									
								
								vendor/google.golang.org/protobuf/internal/encoding/json/decode_token.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,192 @@ | ||||
| // 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 json | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
| ) | ||||
|  | ||||
| // Kind represents a token kind expressible in the JSON format. | ||||
| type Kind uint16 | ||||
|  | ||||
| const ( | ||||
| 	Invalid Kind = (1 << iota) / 2 | ||||
| 	EOF | ||||
| 	Null | ||||
| 	Bool | ||||
| 	Number | ||||
| 	String | ||||
| 	Name | ||||
| 	ObjectOpen | ||||
| 	ObjectClose | ||||
| 	ArrayOpen | ||||
| 	ArrayClose | ||||
|  | ||||
| 	// comma is only for parsing in between tokens and | ||||
| 	// does not need to be exported. | ||||
| 	comma | ||||
| ) | ||||
|  | ||||
| func (k Kind) String() string { | ||||
| 	switch k { | ||||
| 	case EOF: | ||||
| 		return "eof" | ||||
| 	case Null: | ||||
| 		return "null" | ||||
| 	case Bool: | ||||
| 		return "bool" | ||||
| 	case Number: | ||||
| 		return "number" | ||||
| 	case String: | ||||
| 		return "string" | ||||
| 	case ObjectOpen: | ||||
| 		return "{" | ||||
| 	case ObjectClose: | ||||
| 		return "}" | ||||
| 	case Name: | ||||
| 		return "name" | ||||
| 	case ArrayOpen: | ||||
| 		return "[" | ||||
| 	case ArrayClose: | ||||
| 		return "]" | ||||
| 	case comma: | ||||
| 		return "," | ||||
| 	} | ||||
| 	return "<invalid>" | ||||
| } | ||||
|  | ||||
| // Token provides a parsed token kind and value. | ||||
| // | ||||
| // Values are provided by the difference accessor methods. The accessor methods | ||||
| // Name, Bool, and ParsedString will panic if called on the wrong kind. There | ||||
| // are different accessor methods for the Number kind for converting to the | ||||
| // appropriate Go numeric type and those methods have the ok return value. | ||||
| type Token struct { | ||||
| 	// Token kind. | ||||
| 	kind Kind | ||||
| 	// pos provides the position of the token in the original input. | ||||
| 	pos int | ||||
| 	// raw bytes of the serialized token. | ||||
| 	// This is a subslice into the original input. | ||||
| 	raw []byte | ||||
| 	// boo is parsed boolean value. | ||||
| 	boo bool | ||||
| 	// str is parsed string value. | ||||
| 	str string | ||||
| } | ||||
|  | ||||
| // Kind returns the token kind. | ||||
| func (t Token) Kind() Kind { | ||||
| 	return t.kind | ||||
| } | ||||
|  | ||||
| // RawString returns the read value in string. | ||||
| func (t Token) RawString() string { | ||||
| 	return string(t.raw) | ||||
| } | ||||
|  | ||||
| // Pos returns the token position from the input. | ||||
| func (t Token) Pos() int { | ||||
| 	return t.pos | ||||
| } | ||||
|  | ||||
| // Name returns the object name if token is Name, else it panics. | ||||
| func (t Token) Name() string { | ||||
| 	if t.kind == Name { | ||||
| 		return t.str | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("Token is not a Name: %v", t.RawString())) | ||||
| } | ||||
|  | ||||
| // Bool returns the bool value if token kind is Bool, else it panics. | ||||
| func (t Token) Bool() bool { | ||||
| 	if t.kind == Bool { | ||||
| 		return t.boo | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("Token is not a Bool: %v", t.RawString())) | ||||
| } | ||||
|  | ||||
| // ParsedString returns the string value for a JSON string token or the read | ||||
| // value in string if token is not a string. | ||||
| func (t Token) ParsedString() string { | ||||
| 	if t.kind == String { | ||||
| 		return t.str | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("Token is not a String: %v", t.RawString())) | ||||
| } | ||||
|  | ||||
| // Float returns the floating-point number if token kind is Number. | ||||
| // | ||||
| // The floating-point precision is specified by the bitSize parameter: 32 for | ||||
| // float32 or 64 for float64. If bitSize=32, the result still has type float64, | ||||
| // but it will be convertible to float32 without changing its value. It will | ||||
| // return false if the number exceeds the floating point limits for given | ||||
| // bitSize. | ||||
| func (t Token) Float(bitSize int) (float64, bool) { | ||||
| 	if t.kind != Number { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	f, err := strconv.ParseFloat(t.RawString(), bitSize) | ||||
| 	if err != nil { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	return f, true | ||||
| } | ||||
|  | ||||
| // Int returns the signed integer number if token is Number. | ||||
| // | ||||
| // The given bitSize specifies the integer type that the result must fit into. | ||||
| // It returns false if the number is not an integer value or if the result | ||||
| // exceeds the limits for given bitSize. | ||||
| func (t Token) Int(bitSize int) (int64, bool) { | ||||
| 	s, ok := t.getIntStr() | ||||
| 	if !ok { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	n, err := strconv.ParseInt(s, 10, bitSize) | ||||
| 	if err != nil { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	return n, true | ||||
| } | ||||
|  | ||||
| // Uint returns the signed integer number if token is Number. | ||||
| // | ||||
| // The given bitSize specifies the unsigned integer type that the result must | ||||
| // fit into. It returns false if the number is not an unsigned integer value | ||||
| // or if the result exceeds the limits for given bitSize. | ||||
| func (t Token) Uint(bitSize int) (uint64, bool) { | ||||
| 	s, ok := t.getIntStr() | ||||
| 	if !ok { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	n, err := strconv.ParseUint(s, 10, bitSize) | ||||
| 	if err != nil { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	return n, true | ||||
| } | ||||
|  | ||||
| func (t Token) getIntStr() (string, bool) { | ||||
| 	if t.kind != Number { | ||||
| 		return "", false | ||||
| 	} | ||||
| 	parts, ok := parseNumberParts(t.raw) | ||||
| 	if !ok { | ||||
| 		return "", false | ||||
| 	} | ||||
| 	return normalizeToIntString(parts) | ||||
| } | ||||
|  | ||||
| // TokenEquals returns true if given Tokens are equal, else false. | ||||
| func TokenEquals(x, y Token) bool { | ||||
| 	return x.kind == y.kind && | ||||
| 		x.pos == y.pos && | ||||
| 		bytes.Equal(x.raw, y.raw) && | ||||
| 		x.boo == y.boo && | ||||
| 		x.str == y.str | ||||
| } | ||||
							
								
								
									
										276
									
								
								vendor/google.golang.org/protobuf/internal/encoding/json/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										276
									
								
								vendor/google.golang.org/protobuf/internal/encoding/json/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,276 @@ | ||||
| // 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 json | ||||
|  | ||||
| import ( | ||||
| 	"math" | ||||
| 	"math/bits" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/detrand" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| ) | ||||
|  | ||||
| // kind represents an encoding type. | ||||
| type kind uint8 | ||||
|  | ||||
| const ( | ||||
| 	_ kind = (1 << iota) / 2 | ||||
| 	name | ||||
| 	scalar | ||||
| 	objectOpen | ||||
| 	objectClose | ||||
| 	arrayOpen | ||||
| 	arrayClose | ||||
| ) | ||||
|  | ||||
| // Encoder provides methods to write out JSON constructs and values. The user is | ||||
| // responsible for producing valid sequences of JSON constructs and values. | ||||
| type Encoder struct { | ||||
| 	indent   string | ||||
| 	lastKind kind | ||||
| 	indents  []byte | ||||
| 	out      []byte | ||||
| } | ||||
|  | ||||
| // NewEncoder returns an Encoder. | ||||
| // | ||||
| // If indent is a non-empty string, it causes every entry for an Array or Object | ||||
| // to be preceded by the indent and trailed by a newline. | ||||
| func NewEncoder(indent string) (*Encoder, error) { | ||||
| 	e := &Encoder{} | ||||
| 	if len(indent) > 0 { | ||||
| 		if strings.Trim(indent, " \t") != "" { | ||||
| 			return nil, errors.New("indent may only be composed of space or tab characters") | ||||
| 		} | ||||
| 		e.indent = indent | ||||
| 	} | ||||
| 	return e, nil | ||||
| } | ||||
|  | ||||
| // Bytes returns the content of the written bytes. | ||||
| func (e *Encoder) Bytes() []byte { | ||||
| 	return e.out | ||||
| } | ||||
|  | ||||
| // WriteNull writes out the null value. | ||||
| func (e *Encoder) WriteNull() { | ||||
| 	e.prepareNext(scalar) | ||||
| 	e.out = append(e.out, "null"...) | ||||
| } | ||||
|  | ||||
| // WriteBool writes out the given boolean value. | ||||
| func (e *Encoder) WriteBool(b bool) { | ||||
| 	e.prepareNext(scalar) | ||||
| 	if b { | ||||
| 		e.out = append(e.out, "true"...) | ||||
| 	} else { | ||||
| 		e.out = append(e.out, "false"...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // WriteString writes out the given string in JSON string value. Returns error | ||||
| // if input string contains invalid UTF-8. | ||||
| func (e *Encoder) WriteString(s string) error { | ||||
| 	e.prepareNext(scalar) | ||||
| 	var err error | ||||
| 	if e.out, err = appendString(e.out, s); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Sentinel error used for indicating invalid UTF-8. | ||||
| var errInvalidUTF8 = errors.New("invalid UTF-8") | ||||
|  | ||||
| func appendString(out []byte, in string) ([]byte, error) { | ||||
| 	out = append(out, '"') | ||||
| 	i := indexNeedEscapeInString(in) | ||||
| 	in, out = in[i:], append(out, in[:i]...) | ||||
| 	for len(in) > 0 { | ||||
| 		switch r, n := utf8.DecodeRuneInString(in); { | ||||
| 		case r == utf8.RuneError && n == 1: | ||||
| 			return out, errInvalidUTF8 | ||||
| 		case r < ' ' || r == '"' || r == '\\': | ||||
| 			out = append(out, '\\') | ||||
| 			switch r { | ||||
| 			case '"', '\\': | ||||
| 				out = append(out, byte(r)) | ||||
| 			case '\b': | ||||
| 				out = append(out, 'b') | ||||
| 			case '\f': | ||||
| 				out = append(out, 'f') | ||||
| 			case '\n': | ||||
| 				out = append(out, 'n') | ||||
| 			case '\r': | ||||
| 				out = append(out, 'r') | ||||
| 			case '\t': | ||||
| 				out = append(out, 't') | ||||
| 			default: | ||||
| 				out = append(out, 'u') | ||||
| 				out = append(out, "0000"[1+(bits.Len32(uint32(r))-1)/4:]...) | ||||
| 				out = strconv.AppendUint(out, uint64(r), 16) | ||||
| 			} | ||||
| 			in = in[n:] | ||||
| 		default: | ||||
| 			i := indexNeedEscapeInString(in[n:]) | ||||
| 			in, out = in[n+i:], append(out, in[:n+i]...) | ||||
| 		} | ||||
| 	} | ||||
| 	out = append(out, '"') | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| // indexNeedEscapeInString returns the index of the character that needs | ||||
| // escaping. If no characters need escaping, this returns the input length. | ||||
| func indexNeedEscapeInString(s string) int { | ||||
| 	for i, r := range s { | ||||
| 		if r < ' ' || r == '\\' || r == '"' || r == utf8.RuneError { | ||||
| 			return i | ||||
| 		} | ||||
| 	} | ||||
| 	return len(s) | ||||
| } | ||||
|  | ||||
| // WriteFloat writes out the given float and bitSize in JSON number value. | ||||
| func (e *Encoder) WriteFloat(n float64, bitSize int) { | ||||
| 	e.prepareNext(scalar) | ||||
| 	e.out = appendFloat(e.out, n, bitSize) | ||||
| } | ||||
|  | ||||
| // appendFloat formats given float in bitSize, and appends to the given []byte. | ||||
| func appendFloat(out []byte, n float64, bitSize int) []byte { | ||||
| 	switch { | ||||
| 	case math.IsNaN(n): | ||||
| 		return append(out, `"NaN"`...) | ||||
| 	case math.IsInf(n, +1): | ||||
| 		return append(out, `"Infinity"`...) | ||||
| 	case math.IsInf(n, -1): | ||||
| 		return append(out, `"-Infinity"`...) | ||||
| 	} | ||||
|  | ||||
| 	// JSON number formatting logic based on encoding/json. | ||||
| 	// See floatEncoder.encode for reference. | ||||
| 	fmt := byte('f') | ||||
| 	if abs := math.Abs(n); abs != 0 { | ||||
| 		if bitSize == 64 && (abs < 1e-6 || abs >= 1e21) || | ||||
| 			bitSize == 32 && (float32(abs) < 1e-6 || float32(abs) >= 1e21) { | ||||
| 			fmt = 'e' | ||||
| 		} | ||||
| 	} | ||||
| 	out = strconv.AppendFloat(out, n, fmt, -1, bitSize) | ||||
| 	if fmt == 'e' { | ||||
| 		n := len(out) | ||||
| 		if n >= 4 && out[n-4] == 'e' && out[n-3] == '-' && out[n-2] == '0' { | ||||
| 			out[n-2] = out[n-1] | ||||
| 			out = out[:n-1] | ||||
| 		} | ||||
| 	} | ||||
| 	return out | ||||
| } | ||||
|  | ||||
| // WriteInt writes out the given signed integer in JSON number value. | ||||
| func (e *Encoder) WriteInt(n int64) { | ||||
| 	e.prepareNext(scalar) | ||||
| 	e.out = append(e.out, strconv.FormatInt(n, 10)...) | ||||
| } | ||||
|  | ||||
| // WriteUint writes out the given unsigned integer in JSON number value. | ||||
| func (e *Encoder) WriteUint(n uint64) { | ||||
| 	e.prepareNext(scalar) | ||||
| 	e.out = append(e.out, strconv.FormatUint(n, 10)...) | ||||
| } | ||||
|  | ||||
| // StartObject writes out the '{' symbol. | ||||
| func (e *Encoder) StartObject() { | ||||
| 	e.prepareNext(objectOpen) | ||||
| 	e.out = append(e.out, '{') | ||||
| } | ||||
|  | ||||
| // EndObject writes out the '}' symbol. | ||||
| func (e *Encoder) EndObject() { | ||||
| 	e.prepareNext(objectClose) | ||||
| 	e.out = append(e.out, '}') | ||||
| } | ||||
|  | ||||
| // WriteName writes out the given string in JSON string value and the name | ||||
| // separator ':'. Returns error if input string contains invalid UTF-8, which | ||||
| // should not be likely as protobuf field names should be valid. | ||||
| func (e *Encoder) WriteName(s string) error { | ||||
| 	e.prepareNext(name) | ||||
| 	var err error | ||||
| 	// Append to output regardless of error. | ||||
| 	e.out, err = appendString(e.out, s) | ||||
| 	e.out = append(e.out, ':') | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // StartArray writes out the '[' symbol. | ||||
| func (e *Encoder) StartArray() { | ||||
| 	e.prepareNext(arrayOpen) | ||||
| 	e.out = append(e.out, '[') | ||||
| } | ||||
|  | ||||
| // EndArray writes out the ']' symbol. | ||||
| func (e *Encoder) EndArray() { | ||||
| 	e.prepareNext(arrayClose) | ||||
| 	e.out = append(e.out, ']') | ||||
| } | ||||
|  | ||||
| // prepareNext adds possible comma and indentation for the next value based | ||||
| // on last type and indent option. It also updates lastKind to next. | ||||
| func (e *Encoder) prepareNext(next kind) { | ||||
| 	defer func() { | ||||
| 		// Set lastKind to next. | ||||
| 		e.lastKind = next | ||||
| 	}() | ||||
|  | ||||
| 	if len(e.indent) == 0 { | ||||
| 		// Need to add comma on the following condition. | ||||
| 		if e.lastKind&(scalar|objectClose|arrayClose) != 0 && | ||||
| 			next&(name|scalar|objectOpen|arrayOpen) != 0 { | ||||
| 			e.out = append(e.out, ',') | ||||
| 			// For single-line output, add a random extra space after each | ||||
| 			// comma to make output unstable. | ||||
| 			if detrand.Bool() { | ||||
| 				e.out = append(e.out, ' ') | ||||
| 			} | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	switch { | ||||
| 	case e.lastKind&(objectOpen|arrayOpen) != 0: | ||||
| 		// If next type is NOT closing, add indent and newline. | ||||
| 		if next&(objectClose|arrayClose) == 0 { | ||||
| 			e.indents = append(e.indents, e.indent...) | ||||
| 			e.out = append(e.out, '\n') | ||||
| 			e.out = append(e.out, e.indents...) | ||||
| 		} | ||||
|  | ||||
| 	case e.lastKind&(scalar|objectClose|arrayClose) != 0: | ||||
| 		switch { | ||||
| 		// If next type is either a value or name, add comma and newline. | ||||
| 		case next&(name|scalar|objectOpen|arrayOpen) != 0: | ||||
| 			e.out = append(e.out, ',', '\n') | ||||
|  | ||||
| 		// If next type is a closing object or array, adjust indentation. | ||||
| 		case next&(objectClose|arrayClose) != 0: | ||||
| 			e.indents = e.indents[:len(e.indents)-len(e.indent)] | ||||
| 			e.out = append(e.out, '\n') | ||||
| 		} | ||||
| 		e.out = append(e.out, e.indents...) | ||||
|  | ||||
| 	case e.lastKind&name != 0: | ||||
| 		e.out = append(e.out, ' ') | ||||
| 		// For multi-line output, add a random extra space after key: to make | ||||
| 		// output unstable. | ||||
| 		if detrand.Bool() { | ||||
| 			e.out = append(e.out, ' ') | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										241
									
								
								vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										241
									
								
								vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,241 @@ | ||||
| // 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 messageset encodes and decodes the obsolete MessageSet wire format. | ||||
| package messageset | ||||
|  | ||||
| import ( | ||||
| 	"math" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| // The MessageSet wire format is equivalent to a message defined as follows, | ||||
| // where each Item defines an extension field with a field number of 'type_id' | ||||
| // and content of 'message'. MessageSet extensions must be non-repeated message | ||||
| // fields. | ||||
| // | ||||
| //	message MessageSet { | ||||
| //		repeated group Item = 1 { | ||||
| //			required int32 type_id = 2; | ||||
| //			required string message = 3; | ||||
| //		} | ||||
| //	} | ||||
| const ( | ||||
| 	FieldItem    = protowire.Number(1) | ||||
| 	FieldTypeID  = protowire.Number(2) | ||||
| 	FieldMessage = protowire.Number(3) | ||||
| ) | ||||
|  | ||||
| // ExtensionName is the field name for extensions of MessageSet. | ||||
| // | ||||
| // A valid MessageSet extension must be of the form: | ||||
| //	message MyMessage { | ||||
| //		extend proto2.bridge.MessageSet { | ||||
| //			optional MyMessage message_set_extension = 1234; | ||||
| //		} | ||||
| //		... | ||||
| //	} | ||||
| const ExtensionName = "message_set_extension" | ||||
|  | ||||
| // IsMessageSet returns whether the message uses the MessageSet wire format. | ||||
| func IsMessageSet(md pref.MessageDescriptor) bool { | ||||
| 	xmd, ok := md.(interface{ IsMessageSet() bool }) | ||||
| 	return ok && xmd.IsMessageSet() | ||||
| } | ||||
|  | ||||
| // IsMessageSetExtension reports this field properly extends a MessageSet. | ||||
| func IsMessageSetExtension(fd pref.FieldDescriptor) bool { | ||||
| 	switch { | ||||
| 	case fd.Name() != ExtensionName: | ||||
| 		return false | ||||
| 	case !IsMessageSet(fd.ContainingMessage()): | ||||
| 		return false | ||||
| 	case fd.FullName().Parent() != fd.Message().FullName(): | ||||
| 		return false | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // SizeField returns the size of a MessageSet item field containing an extension | ||||
| // with the given field number, not counting the contents of the message subfield. | ||||
| func SizeField(num protowire.Number) int { | ||||
| 	return 2*protowire.SizeTag(FieldItem) + protowire.SizeTag(FieldTypeID) + protowire.SizeVarint(uint64(num)) | ||||
| } | ||||
|  | ||||
| // Unmarshal parses a MessageSet. | ||||
| // | ||||
| // It calls fn with the type ID and value of each item in the MessageSet. | ||||
| // Unknown fields are discarded. | ||||
| // | ||||
| // If wantLen is true, the item values include the varint length prefix. | ||||
| // This is ugly, but simplifies the fast-path decoder in internal/impl. | ||||
| func Unmarshal(b []byte, wantLen bool, fn func(typeID protowire.Number, value []byte) error) error { | ||||
| 	for len(b) > 0 { | ||||
| 		num, wtyp, n := protowire.ConsumeTag(b) | ||||
| 		if n < 0 { | ||||
| 			return protowire.ParseError(n) | ||||
| 		} | ||||
| 		b = b[n:] | ||||
| 		if num != FieldItem || wtyp != protowire.StartGroupType { | ||||
| 			n := protowire.ConsumeFieldValue(num, wtyp, b) | ||||
| 			if n < 0 { | ||||
| 				return protowire.ParseError(n) | ||||
| 			} | ||||
| 			b = b[n:] | ||||
| 			continue | ||||
| 		} | ||||
| 		typeID, value, n, err := ConsumeFieldValue(b, wantLen) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		b = b[n:] | ||||
| 		if typeID == 0 { | ||||
| 			continue | ||||
| 		} | ||||
| 		if err := fn(typeID, value); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // ConsumeFieldValue parses b as a MessageSet item field value until and including | ||||
| // the trailing end group marker. It assumes the start group tag has already been parsed. | ||||
| // It returns the contents of the type_id and message subfields and the total | ||||
| // item length. | ||||
| // | ||||
| // If wantLen is true, the returned message value includes the length prefix. | ||||
| func ConsumeFieldValue(b []byte, wantLen bool) (typeid protowire.Number, message []byte, n int, err error) { | ||||
| 	ilen := len(b) | ||||
| 	for { | ||||
| 		num, wtyp, n := protowire.ConsumeTag(b) | ||||
| 		if n < 0 { | ||||
| 			return 0, nil, 0, protowire.ParseError(n) | ||||
| 		} | ||||
| 		b = b[n:] | ||||
| 		switch { | ||||
| 		case num == FieldItem && wtyp == protowire.EndGroupType: | ||||
| 			if wantLen && len(message) == 0 { | ||||
| 				// The message field was missing, which should never happen. | ||||
| 				// Be prepared for this case anyway. | ||||
| 				message = protowire.AppendVarint(message, 0) | ||||
| 			} | ||||
| 			return typeid, message, ilen - len(b), nil | ||||
| 		case num == FieldTypeID && wtyp == protowire.VarintType: | ||||
| 			v, n := protowire.ConsumeVarint(b) | ||||
| 			if n < 0 { | ||||
| 				return 0, nil, 0, protowire.ParseError(n) | ||||
| 			} | ||||
| 			b = b[n:] | ||||
| 			if v < 1 || v > math.MaxInt32 { | ||||
| 				return 0, nil, 0, errors.New("invalid type_id in message set") | ||||
| 			} | ||||
| 			typeid = protowire.Number(v) | ||||
| 		case num == FieldMessage && wtyp == protowire.BytesType: | ||||
| 			m, n := protowire.ConsumeBytes(b) | ||||
| 			if n < 0 { | ||||
| 				return 0, nil, 0, protowire.ParseError(n) | ||||
| 			} | ||||
| 			if message == nil { | ||||
| 				if wantLen { | ||||
| 					message = b[:n:n] | ||||
| 				} else { | ||||
| 					message = m[:len(m):len(m)] | ||||
| 				} | ||||
| 			} else { | ||||
| 				// This case should never happen in practice, but handle it for | ||||
| 				// correctness: The MessageSet item contains multiple message | ||||
| 				// fields, which need to be merged. | ||||
| 				// | ||||
| 				// In the case where we're returning the length, this becomes | ||||
| 				// quite inefficient since we need to strip the length off | ||||
| 				// the existing data and reconstruct it with the combined length. | ||||
| 				if wantLen { | ||||
| 					_, nn := protowire.ConsumeVarint(message) | ||||
| 					m0 := message[nn:] | ||||
| 					message = nil | ||||
| 					message = protowire.AppendVarint(message, uint64(len(m0)+len(m))) | ||||
| 					message = append(message, m0...) | ||||
| 					message = append(message, m...) | ||||
| 				} else { | ||||
| 					message = append(message, m...) | ||||
| 				} | ||||
| 			} | ||||
| 			b = b[n:] | ||||
| 		default: | ||||
| 			// We have no place to put it, so we just ignore unknown fields. | ||||
| 			n := protowire.ConsumeFieldValue(num, wtyp, b) | ||||
| 			if n < 0 { | ||||
| 				return 0, nil, 0, protowire.ParseError(n) | ||||
| 			} | ||||
| 			b = b[n:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // AppendFieldStart appends the start of a MessageSet item field containing | ||||
| // an extension with the given number. The caller must add the message | ||||
| // subfield (including the tag). | ||||
| func AppendFieldStart(b []byte, num protowire.Number) []byte { | ||||
| 	b = protowire.AppendTag(b, FieldItem, protowire.StartGroupType) | ||||
| 	b = protowire.AppendTag(b, FieldTypeID, protowire.VarintType) | ||||
| 	b = protowire.AppendVarint(b, uint64(num)) | ||||
| 	return b | ||||
| } | ||||
|  | ||||
| // AppendFieldEnd appends the trailing end group marker for a MessageSet item field. | ||||
| func AppendFieldEnd(b []byte) []byte { | ||||
| 	return protowire.AppendTag(b, FieldItem, protowire.EndGroupType) | ||||
| } | ||||
|  | ||||
| // SizeUnknown returns the size of an unknown fields section in MessageSet format. | ||||
| // | ||||
| // See AppendUnknown. | ||||
| func SizeUnknown(unknown []byte) (size int) { | ||||
| 	for len(unknown) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(unknown) | ||||
| 		if n < 0 || typ != protowire.BytesType { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		unknown = unknown[n:] | ||||
| 		_, n = protowire.ConsumeBytes(unknown) | ||||
| 		if n < 0 { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		unknown = unknown[n:] | ||||
| 		size += SizeField(num) + protowire.SizeTag(FieldMessage) + n | ||||
| 	} | ||||
| 	return size | ||||
| } | ||||
|  | ||||
| // AppendUnknown appends unknown fields to b in MessageSet format. | ||||
| // | ||||
| // For historic reasons, unresolved items in a MessageSet are stored in a | ||||
| // message's unknown fields section in non-MessageSet format. That is, an | ||||
| // unknown item with typeID T and value V appears in the unknown fields as | ||||
| // a field with number T and value V. | ||||
| // | ||||
| // This function converts the unknown fields back into MessageSet form. | ||||
| func AppendUnknown(b, unknown []byte) ([]byte, error) { | ||||
| 	for len(unknown) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(unknown) | ||||
| 		if n < 0 || typ != protowire.BytesType { | ||||
| 			return nil, errors.New("invalid data in message set unknown fields") | ||||
| 		} | ||||
| 		unknown = unknown[n:] | ||||
| 		_, n = protowire.ConsumeBytes(unknown) | ||||
| 		if n < 0 { | ||||
| 			return nil, errors.New("invalid data in message set unknown fields") | ||||
| 		} | ||||
| 		b = AppendFieldStart(b, num) | ||||
| 		b = protowire.AppendTag(b, FieldMessage, protowire.BytesType) | ||||
| 		b = append(b, unknown[:n]...) | ||||
| 		b = AppendFieldEnd(b) | ||||
| 		unknown = unknown[n:] | ||||
| 	} | ||||
| 	return b, nil | ||||
| } | ||||
							
								
								
									
										207
									
								
								vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,207 @@ | ||||
| // 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 tag marshals and unmarshals the legacy struct tags as generated | ||||
| // by historical versions of protoc-gen-go. | ||||
| package tag | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
|  | ||||
| 	defval "google.golang.org/protobuf/internal/encoding/defval" | ||||
| 	fdesc "google.golang.org/protobuf/internal/filedesc" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| var byteType = reflect.TypeOf(byte(0)) | ||||
|  | ||||
| // Unmarshal decodes the tag into a prototype.Field. | ||||
| // | ||||
| // The goType is needed to determine the original protoreflect.Kind since the | ||||
| // tag does not record sufficient information to determine that. | ||||
| // The type is the underlying field type (e.g., a repeated field may be | ||||
| // represented by []T, but the Go type passed in is just T). | ||||
| // A list of enum value descriptors must be provided for enum fields. | ||||
| // This does not populate the Enum or Message (except for weak message). | ||||
| // | ||||
| // This function is a best effort attempt; parsing errors are ignored. | ||||
| func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) pref.FieldDescriptor { | ||||
| 	f := new(fdesc.Field) | ||||
| 	f.L0.ParentFile = fdesc.SurrogateProto2 | ||||
| 	for len(tag) > 0 { | ||||
| 		i := strings.IndexByte(tag, ',') | ||||
| 		if i < 0 { | ||||
| 			i = len(tag) | ||||
| 		} | ||||
| 		switch s := tag[:i]; { | ||||
| 		case strings.HasPrefix(s, "name="): | ||||
| 			f.L0.FullName = pref.FullName(s[len("name="):]) | ||||
| 		case strings.Trim(s, "0123456789") == "": | ||||
| 			n, _ := strconv.ParseUint(s, 10, 32) | ||||
| 			f.L1.Number = pref.FieldNumber(n) | ||||
| 		case s == "opt": | ||||
| 			f.L1.Cardinality = pref.Optional | ||||
| 		case s == "req": | ||||
| 			f.L1.Cardinality = pref.Required | ||||
| 		case s == "rep": | ||||
| 			f.L1.Cardinality = pref.Repeated | ||||
| 		case s == "varint": | ||||
| 			switch goType.Kind() { | ||||
| 			case reflect.Bool: | ||||
| 				f.L1.Kind = pref.BoolKind | ||||
| 			case reflect.Int32: | ||||
| 				f.L1.Kind = pref.Int32Kind | ||||
| 			case reflect.Int64: | ||||
| 				f.L1.Kind = pref.Int64Kind | ||||
| 			case reflect.Uint32: | ||||
| 				f.L1.Kind = pref.Uint32Kind | ||||
| 			case reflect.Uint64: | ||||
| 				f.L1.Kind = pref.Uint64Kind | ||||
| 			} | ||||
| 		case s == "zigzag32": | ||||
| 			if goType.Kind() == reflect.Int32 { | ||||
| 				f.L1.Kind = pref.Sint32Kind | ||||
| 			} | ||||
| 		case s == "zigzag64": | ||||
| 			if goType.Kind() == reflect.Int64 { | ||||
| 				f.L1.Kind = pref.Sint64Kind | ||||
| 			} | ||||
| 		case s == "fixed32": | ||||
| 			switch goType.Kind() { | ||||
| 			case reflect.Int32: | ||||
| 				f.L1.Kind = pref.Sfixed32Kind | ||||
| 			case reflect.Uint32: | ||||
| 				f.L1.Kind = pref.Fixed32Kind | ||||
| 			case reflect.Float32: | ||||
| 				f.L1.Kind = pref.FloatKind | ||||
| 			} | ||||
| 		case s == "fixed64": | ||||
| 			switch goType.Kind() { | ||||
| 			case reflect.Int64: | ||||
| 				f.L1.Kind = pref.Sfixed64Kind | ||||
| 			case reflect.Uint64: | ||||
| 				f.L1.Kind = pref.Fixed64Kind | ||||
| 			case reflect.Float64: | ||||
| 				f.L1.Kind = pref.DoubleKind | ||||
| 			} | ||||
| 		case s == "bytes": | ||||
| 			switch { | ||||
| 			case goType.Kind() == reflect.String: | ||||
| 				f.L1.Kind = pref.StringKind | ||||
| 			case goType.Kind() == reflect.Slice && goType.Elem() == byteType: | ||||
| 				f.L1.Kind = pref.BytesKind | ||||
| 			default: | ||||
| 				f.L1.Kind = pref.MessageKind | ||||
| 			} | ||||
| 		case s == "group": | ||||
| 			f.L1.Kind = pref.GroupKind | ||||
| 		case strings.HasPrefix(s, "enum="): | ||||
| 			f.L1.Kind = pref.EnumKind | ||||
| 		case strings.HasPrefix(s, "json="): | ||||
| 			jsonName := s[len("json="):] | ||||
| 			if jsonName != strs.JSONCamelCase(string(f.L0.FullName.Name())) { | ||||
| 				f.L1.StringName.InitJSON(jsonName) | ||||
| 			} | ||||
| 		case s == "packed": | ||||
| 			f.L1.HasPacked = true | ||||
| 			f.L1.IsPacked = true | ||||
| 		case strings.HasPrefix(s, "weak="): | ||||
| 			f.L1.IsWeak = true | ||||
| 			f.L1.Message = fdesc.PlaceholderMessage(pref.FullName(s[len("weak="):])) | ||||
| 		case strings.HasPrefix(s, "def="): | ||||
| 			// The default tag is special in that everything afterwards is the | ||||
| 			// default regardless of the presence of commas. | ||||
| 			s, i = tag[len("def="):], len(tag) | ||||
| 			v, ev, _ := defval.Unmarshal(s, f.L1.Kind, evs, defval.GoTag) | ||||
| 			f.L1.Default = fdesc.DefaultValue(v, ev) | ||||
| 		case s == "proto3": | ||||
| 			f.L0.ParentFile = fdesc.SurrogateProto3 | ||||
| 		} | ||||
| 		tag = strings.TrimPrefix(tag[i:], ",") | ||||
| 	} | ||||
|  | ||||
| 	// The generator uses the group message name instead of the field name. | ||||
| 	// We obtain the real field name by lowercasing the group name. | ||||
| 	if f.L1.Kind == pref.GroupKind { | ||||
| 		f.L0.FullName = pref.FullName(strings.ToLower(string(f.L0.FullName))) | ||||
| 	} | ||||
| 	return f | ||||
| } | ||||
|  | ||||
| // Marshal encodes the protoreflect.FieldDescriptor as a tag. | ||||
| // | ||||
| // The enumName must be provided if the kind is an enum. | ||||
| // Historically, the formulation of the enum "name" was the proto package | ||||
| // dot-concatenated with the generated Go identifier for the enum type. | ||||
| // Depending on the context on how Marshal is called, there are different ways | ||||
| // through which that information is determined. As such it is the caller's | ||||
| // responsibility to provide a function to obtain that information. | ||||
| func Marshal(fd pref.FieldDescriptor, enumName string) string { | ||||
| 	var tag []string | ||||
| 	switch fd.Kind() { | ||||
| 	case pref.BoolKind, pref.EnumKind, pref.Int32Kind, pref.Uint32Kind, pref.Int64Kind, pref.Uint64Kind: | ||||
| 		tag = append(tag, "varint") | ||||
| 	case pref.Sint32Kind: | ||||
| 		tag = append(tag, "zigzag32") | ||||
| 	case pref.Sint64Kind: | ||||
| 		tag = append(tag, "zigzag64") | ||||
| 	case pref.Sfixed32Kind, pref.Fixed32Kind, pref.FloatKind: | ||||
| 		tag = append(tag, "fixed32") | ||||
| 	case pref.Sfixed64Kind, pref.Fixed64Kind, pref.DoubleKind: | ||||
| 		tag = append(tag, "fixed64") | ||||
| 	case pref.StringKind, pref.BytesKind, pref.MessageKind: | ||||
| 		tag = append(tag, "bytes") | ||||
| 	case pref.GroupKind: | ||||
| 		tag = append(tag, "group") | ||||
| 	} | ||||
| 	tag = append(tag, strconv.Itoa(int(fd.Number()))) | ||||
| 	switch fd.Cardinality() { | ||||
| 	case pref.Optional: | ||||
| 		tag = append(tag, "opt") | ||||
| 	case pref.Required: | ||||
| 		tag = append(tag, "req") | ||||
| 	case pref.Repeated: | ||||
| 		tag = append(tag, "rep") | ||||
| 	} | ||||
| 	if fd.IsPacked() { | ||||
| 		tag = append(tag, "packed") | ||||
| 	} | ||||
| 	name := string(fd.Name()) | ||||
| 	if fd.Kind() == pref.GroupKind { | ||||
| 		// The name of the FieldDescriptor for a group field is | ||||
| 		// lowercased. To find the original capitalization, we | ||||
| 		// look in the field's MessageType. | ||||
| 		name = string(fd.Message().Name()) | ||||
| 	} | ||||
| 	tag = append(tag, "name="+name) | ||||
| 	if jsonName := fd.JSONName(); jsonName != "" && jsonName != name && !fd.IsExtension() { | ||||
| 		// NOTE: The jsonName != name condition is suspect, but it preserve | ||||
| 		// the exact same semantics from the previous generator. | ||||
| 		tag = append(tag, "json="+jsonName) | ||||
| 	} | ||||
| 	if fd.IsWeak() { | ||||
| 		tag = append(tag, "weak="+string(fd.Message().FullName())) | ||||
| 	} | ||||
| 	// The previous implementation does not tag extension fields as proto3, | ||||
| 	// even when the field is defined in a proto3 file. Match that behavior | ||||
| 	// for consistency. | ||||
| 	if fd.Syntax() == pref.Proto3 && !fd.IsExtension() { | ||||
| 		tag = append(tag, "proto3") | ||||
| 	} | ||||
| 	if fd.Kind() == pref.EnumKind && enumName != "" { | ||||
| 		tag = append(tag, "enum="+enumName) | ||||
| 	} | ||||
| 	if fd.ContainingOneof() != nil { | ||||
| 		tag = append(tag, "oneof") | ||||
| 	} | ||||
| 	// This must appear last in the tag, since commas in strings aren't escaped. | ||||
| 	if fd.HasDefault() { | ||||
| 		def, _ := defval.Marshal(fd.Default(), fd.DefaultEnumValue(), fd.Kind(), defval.GoTag) | ||||
| 		tag = append(tag, "def="+def) | ||||
| 	} | ||||
| 	return strings.Join(tag, ",") | ||||
| } | ||||
							
								
								
									
										665
									
								
								vendor/google.golang.org/protobuf/internal/encoding/text/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										665
									
								
								vendor/google.golang.org/protobuf/internal/encoding/text/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,665 @@ | ||||
| // 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 text | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"regexp" | ||||
| 	"strconv" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| ) | ||||
|  | ||||
| // Decoder is a token-based textproto decoder. | ||||
| type Decoder struct { | ||||
| 	// lastCall is last method called, either readCall or peekCall. | ||||
| 	// Initial value is readCall. | ||||
| 	lastCall call | ||||
|  | ||||
| 	// lastToken contains the last read token. | ||||
| 	lastToken Token | ||||
|  | ||||
| 	// lastErr contains the last read error. | ||||
| 	lastErr error | ||||
|  | ||||
| 	// openStack is a stack containing the byte characters for MessageOpen and | ||||
| 	// ListOpen kinds. The top of stack represents the message or the list that | ||||
| 	// the current token is nested in. An empty stack means the current token is | ||||
| 	// at the top level message. The characters '{' and '<' both represent the | ||||
| 	// MessageOpen kind. | ||||
| 	openStack []byte | ||||
|  | ||||
| 	// orig is used in reporting line and column. | ||||
| 	orig []byte | ||||
| 	// in contains the unconsumed input. | ||||
| 	in []byte | ||||
| } | ||||
|  | ||||
| // NewDecoder returns a Decoder to read the given []byte. | ||||
| func NewDecoder(b []byte) *Decoder { | ||||
| 	return &Decoder{orig: b, in: b} | ||||
| } | ||||
|  | ||||
| // ErrUnexpectedEOF means that EOF was encountered in the middle of the input. | ||||
| var ErrUnexpectedEOF = errors.New("%v", io.ErrUnexpectedEOF) | ||||
|  | ||||
| // call specifies which Decoder method was invoked. | ||||
| type call uint8 | ||||
|  | ||||
| const ( | ||||
| 	readCall call = iota | ||||
| 	peekCall | ||||
| ) | ||||
|  | ||||
| // Peek looks ahead and returns the next token and error without advancing a read. | ||||
| func (d *Decoder) Peek() (Token, error) { | ||||
| 	defer func() { d.lastCall = peekCall }() | ||||
| 	if d.lastCall == readCall { | ||||
| 		d.lastToken, d.lastErr = d.Read() | ||||
| 	} | ||||
| 	return d.lastToken, d.lastErr | ||||
| } | ||||
|  | ||||
| // Read returns the next token. | ||||
| // It will return an error if there is no valid token. | ||||
| func (d *Decoder) Read() (Token, error) { | ||||
| 	defer func() { d.lastCall = readCall }() | ||||
| 	if d.lastCall == peekCall { | ||||
| 		return d.lastToken, d.lastErr | ||||
| 	} | ||||
|  | ||||
| 	tok, err := d.parseNext(d.lastToken.kind) | ||||
| 	if err != nil { | ||||
| 		return Token{}, err | ||||
| 	} | ||||
|  | ||||
| 	switch tok.kind { | ||||
| 	case comma, semicolon: | ||||
| 		tok, err = d.parseNext(tok.kind) | ||||
| 		if err != nil { | ||||
| 			return Token{}, err | ||||
| 		} | ||||
| 	} | ||||
| 	d.lastToken = tok | ||||
| 	return tok, nil | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	mismatchedFmt = "mismatched close character %q" | ||||
| 	unexpectedFmt = "unexpected character %q" | ||||
| ) | ||||
|  | ||||
| // parseNext parses the next Token based on given last kind. | ||||
| func (d *Decoder) parseNext(lastKind Kind) (Token, error) { | ||||
| 	// Trim leading spaces. | ||||
| 	d.consume(0) | ||||
| 	isEOF := false | ||||
| 	if len(d.in) == 0 { | ||||
| 		isEOF = true | ||||
| 	} | ||||
|  | ||||
| 	switch lastKind { | ||||
| 	case EOF: | ||||
| 		return d.consumeToken(EOF, 0, 0), nil | ||||
|  | ||||
| 	case bof: | ||||
| 		// Start of top level message. Next token can be EOF or Name. | ||||
| 		if isEOF { | ||||
| 			return d.consumeToken(EOF, 0, 0), nil | ||||
| 		} | ||||
| 		return d.parseFieldName() | ||||
|  | ||||
| 	case Name: | ||||
| 		// Next token can be MessageOpen, ListOpen or Scalar. | ||||
| 		if isEOF { | ||||
| 			return Token{}, ErrUnexpectedEOF | ||||
| 		} | ||||
| 		switch ch := d.in[0]; ch { | ||||
| 		case '{', '<': | ||||
| 			d.pushOpenStack(ch) | ||||
| 			return d.consumeToken(MessageOpen, 1, 0), nil | ||||
| 		case '[': | ||||
| 			d.pushOpenStack(ch) | ||||
| 			return d.consumeToken(ListOpen, 1, 0), nil | ||||
| 		default: | ||||
| 			return d.parseScalar() | ||||
| 		} | ||||
|  | ||||
| 	case Scalar: | ||||
| 		openKind, closeCh := d.currentOpenKind() | ||||
| 		switch openKind { | ||||
| 		case bof: | ||||
| 			// Top level message. | ||||
| 			// 	Next token can be EOF, comma, semicolon or Name. | ||||
| 			if isEOF { | ||||
| 				return d.consumeToken(EOF, 0, 0), nil | ||||
| 			} | ||||
| 			switch d.in[0] { | ||||
| 			case ',': | ||||
| 				return d.consumeToken(comma, 1, 0), nil | ||||
| 			case ';': | ||||
| 				return d.consumeToken(semicolon, 1, 0), nil | ||||
| 			default: | ||||
| 				return d.parseFieldName() | ||||
| 			} | ||||
|  | ||||
| 		case MessageOpen: | ||||
| 			// Next token can be MessageClose, comma, semicolon or Name. | ||||
| 			if isEOF { | ||||
| 				return Token{}, ErrUnexpectedEOF | ||||
| 			} | ||||
| 			switch ch := d.in[0]; ch { | ||||
| 			case closeCh: | ||||
| 				d.popOpenStack() | ||||
| 				return d.consumeToken(MessageClose, 1, 0), nil | ||||
| 			case otherCloseChar[closeCh]: | ||||
| 				return Token{}, d.newSyntaxError(mismatchedFmt, ch) | ||||
| 			case ',': | ||||
| 				return d.consumeToken(comma, 1, 0), nil | ||||
| 			case ';': | ||||
| 				return d.consumeToken(semicolon, 1, 0), nil | ||||
| 			default: | ||||
| 				return d.parseFieldName() | ||||
| 			} | ||||
|  | ||||
| 		case ListOpen: | ||||
| 			// Next token can be ListClose or comma. | ||||
| 			if isEOF { | ||||
| 				return Token{}, ErrUnexpectedEOF | ||||
| 			} | ||||
| 			switch ch := d.in[0]; ch { | ||||
| 			case ']': | ||||
| 				d.popOpenStack() | ||||
| 				return d.consumeToken(ListClose, 1, 0), nil | ||||
| 			case ',': | ||||
| 				return d.consumeToken(comma, 1, 0), nil | ||||
| 			default: | ||||
| 				return Token{}, d.newSyntaxError(unexpectedFmt, ch) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	case MessageOpen: | ||||
| 		// Next token can be MessageClose or Name. | ||||
| 		if isEOF { | ||||
| 			return Token{}, ErrUnexpectedEOF | ||||
| 		} | ||||
| 		_, closeCh := d.currentOpenKind() | ||||
| 		switch ch := d.in[0]; ch { | ||||
| 		case closeCh: | ||||
| 			d.popOpenStack() | ||||
| 			return d.consumeToken(MessageClose, 1, 0), nil | ||||
| 		case otherCloseChar[closeCh]: | ||||
| 			return Token{}, d.newSyntaxError(mismatchedFmt, ch) | ||||
| 		default: | ||||
| 			return d.parseFieldName() | ||||
| 		} | ||||
|  | ||||
| 	case MessageClose: | ||||
| 		openKind, closeCh := d.currentOpenKind() | ||||
| 		switch openKind { | ||||
| 		case bof: | ||||
| 			// Top level message. | ||||
| 			// Next token can be EOF, comma, semicolon or Name. | ||||
| 			if isEOF { | ||||
| 				return d.consumeToken(EOF, 0, 0), nil | ||||
| 			} | ||||
| 			switch ch := d.in[0]; ch { | ||||
| 			case ',': | ||||
| 				return d.consumeToken(comma, 1, 0), nil | ||||
| 			case ';': | ||||
| 				return d.consumeToken(semicolon, 1, 0), nil | ||||
| 			default: | ||||
| 				return d.parseFieldName() | ||||
| 			} | ||||
|  | ||||
| 		case MessageOpen: | ||||
| 			// Next token can be MessageClose, comma, semicolon or Name. | ||||
| 			if isEOF { | ||||
| 				return Token{}, ErrUnexpectedEOF | ||||
| 			} | ||||
| 			switch ch := d.in[0]; ch { | ||||
| 			case closeCh: | ||||
| 				d.popOpenStack() | ||||
| 				return d.consumeToken(MessageClose, 1, 0), nil | ||||
| 			case otherCloseChar[closeCh]: | ||||
| 				return Token{}, d.newSyntaxError(mismatchedFmt, ch) | ||||
| 			case ',': | ||||
| 				return d.consumeToken(comma, 1, 0), nil | ||||
| 			case ';': | ||||
| 				return d.consumeToken(semicolon, 1, 0), nil | ||||
| 			default: | ||||
| 				return d.parseFieldName() | ||||
| 			} | ||||
|  | ||||
| 		case ListOpen: | ||||
| 			// Next token can be ListClose or comma | ||||
| 			if isEOF { | ||||
| 				return Token{}, ErrUnexpectedEOF | ||||
| 			} | ||||
| 			switch ch := d.in[0]; ch { | ||||
| 			case closeCh: | ||||
| 				d.popOpenStack() | ||||
| 				return d.consumeToken(ListClose, 1, 0), nil | ||||
| 			case ',': | ||||
| 				return d.consumeToken(comma, 1, 0), nil | ||||
| 			default: | ||||
| 				return Token{}, d.newSyntaxError(unexpectedFmt, ch) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	case ListOpen: | ||||
| 		// Next token can be ListClose, MessageStart or Scalar. | ||||
| 		if isEOF { | ||||
| 			return Token{}, ErrUnexpectedEOF | ||||
| 		} | ||||
| 		switch ch := d.in[0]; ch { | ||||
| 		case ']': | ||||
| 			d.popOpenStack() | ||||
| 			return d.consumeToken(ListClose, 1, 0), nil | ||||
| 		case '{', '<': | ||||
| 			d.pushOpenStack(ch) | ||||
| 			return d.consumeToken(MessageOpen, 1, 0), nil | ||||
| 		default: | ||||
| 			return d.parseScalar() | ||||
| 		} | ||||
|  | ||||
| 	case ListClose: | ||||
| 		openKind, closeCh := d.currentOpenKind() | ||||
| 		switch openKind { | ||||
| 		case bof: | ||||
| 			// Top level message. | ||||
| 			// Next token can be EOF, comma, semicolon or Name. | ||||
| 			if isEOF { | ||||
| 				return d.consumeToken(EOF, 0, 0), nil | ||||
| 			} | ||||
| 			switch ch := d.in[0]; ch { | ||||
| 			case ',': | ||||
| 				return d.consumeToken(comma, 1, 0), nil | ||||
| 			case ';': | ||||
| 				return d.consumeToken(semicolon, 1, 0), nil | ||||
| 			default: | ||||
| 				return d.parseFieldName() | ||||
| 			} | ||||
|  | ||||
| 		case MessageOpen: | ||||
| 			// Next token can be MessageClose, comma, semicolon or Name. | ||||
| 			if isEOF { | ||||
| 				return Token{}, ErrUnexpectedEOF | ||||
| 			} | ||||
| 			switch ch := d.in[0]; ch { | ||||
| 			case closeCh: | ||||
| 				d.popOpenStack() | ||||
| 				return d.consumeToken(MessageClose, 1, 0), nil | ||||
| 			case otherCloseChar[closeCh]: | ||||
| 				return Token{}, d.newSyntaxError(mismatchedFmt, ch) | ||||
| 			case ',': | ||||
| 				return d.consumeToken(comma, 1, 0), nil | ||||
| 			case ';': | ||||
| 				return d.consumeToken(semicolon, 1, 0), nil | ||||
| 			default: | ||||
| 				return d.parseFieldName() | ||||
| 			} | ||||
|  | ||||
| 		default: | ||||
| 			// It is not possible to have this case. Let it panic below. | ||||
| 		} | ||||
|  | ||||
| 	case comma, semicolon: | ||||
| 		openKind, closeCh := d.currentOpenKind() | ||||
| 		switch openKind { | ||||
| 		case bof: | ||||
| 			// Top level message. Next token can be EOF or Name. | ||||
| 			if isEOF { | ||||
| 				return d.consumeToken(EOF, 0, 0), nil | ||||
| 			} | ||||
| 			return d.parseFieldName() | ||||
|  | ||||
| 		case MessageOpen: | ||||
| 			// Next token can be MessageClose or Name. | ||||
| 			if isEOF { | ||||
| 				return Token{}, ErrUnexpectedEOF | ||||
| 			} | ||||
| 			switch ch := d.in[0]; ch { | ||||
| 			case closeCh: | ||||
| 				d.popOpenStack() | ||||
| 				return d.consumeToken(MessageClose, 1, 0), nil | ||||
| 			case otherCloseChar[closeCh]: | ||||
| 				return Token{}, d.newSyntaxError(mismatchedFmt, ch) | ||||
| 			default: | ||||
| 				return d.parseFieldName() | ||||
| 			} | ||||
|  | ||||
| 		case ListOpen: | ||||
| 			if lastKind == semicolon { | ||||
| 				// It is not be possible to have this case as logic here | ||||
| 				// should not have produced a semicolon Token when inside a | ||||
| 				// list. Let it panic below. | ||||
| 				break | ||||
| 			} | ||||
| 			// Next token can be MessageOpen or Scalar. | ||||
| 			if isEOF { | ||||
| 				return Token{}, ErrUnexpectedEOF | ||||
| 			} | ||||
| 			switch ch := d.in[0]; ch { | ||||
| 			case '{', '<': | ||||
| 				d.pushOpenStack(ch) | ||||
| 				return d.consumeToken(MessageOpen, 1, 0), nil | ||||
| 			default: | ||||
| 				return d.parseScalar() | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	line, column := d.Position(len(d.orig) - len(d.in)) | ||||
| 	panic(fmt.Sprintf("Decoder.parseNext: bug at handling line %d:%d with lastKind=%v", line, column, lastKind)) | ||||
| } | ||||
|  | ||||
| var otherCloseChar = map[byte]byte{ | ||||
| 	'}': '>', | ||||
| 	'>': '}', | ||||
| } | ||||
|  | ||||
| // currentOpenKind indicates whether current position is inside a message, list | ||||
| // or top-level message by returning MessageOpen, ListOpen or bof respectively. | ||||
| // If the returned kind is either a MessageOpen or ListOpen, it also returns the | ||||
| // corresponding closing character. | ||||
| func (d *Decoder) currentOpenKind() (Kind, byte) { | ||||
| 	if len(d.openStack) == 0 { | ||||
| 		return bof, 0 | ||||
| 	} | ||||
| 	openCh := d.openStack[len(d.openStack)-1] | ||||
| 	switch openCh { | ||||
| 	case '{': | ||||
| 		return MessageOpen, '}' | ||||
| 	case '<': | ||||
| 		return MessageOpen, '>' | ||||
| 	case '[': | ||||
| 		return ListOpen, ']' | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("Decoder: openStack contains invalid byte %c", openCh)) | ||||
| } | ||||
|  | ||||
| func (d *Decoder) pushOpenStack(ch byte) { | ||||
| 	d.openStack = append(d.openStack, ch) | ||||
| } | ||||
|  | ||||
| func (d *Decoder) popOpenStack() { | ||||
| 	d.openStack = d.openStack[:len(d.openStack)-1] | ||||
| } | ||||
|  | ||||
| // parseFieldName parses field name and separator. | ||||
| func (d *Decoder) parseFieldName() (tok Token, err error) { | ||||
| 	defer func() { | ||||
| 		if err == nil && d.tryConsumeChar(':') { | ||||
| 			tok.attrs |= hasSeparator | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	// Extension or Any type URL. | ||||
| 	if d.in[0] == '[' { | ||||
| 		return d.parseTypeName() | ||||
| 	} | ||||
|  | ||||
| 	// Identifier. | ||||
| 	if size := parseIdent(d.in, false); size > 0 { | ||||
| 		return d.consumeToken(Name, size, uint8(IdentName)), nil | ||||
| 	} | ||||
|  | ||||
| 	// Field number. Identify if input is a valid number that is not negative | ||||
| 	// and is decimal integer within 32-bit range. | ||||
| 	if num := parseNumber(d.in); num.size > 0 { | ||||
| 		if !num.neg && num.kind == numDec { | ||||
| 			if _, err := strconv.ParseInt(string(d.in[:num.size]), 10, 32); err == nil { | ||||
| 				return d.consumeToken(Name, num.size, uint8(FieldNumber)), nil | ||||
| 			} | ||||
| 		} | ||||
| 		return Token{}, d.newSyntaxError("invalid field number: %s", d.in[:num.size]) | ||||
| 	} | ||||
|  | ||||
| 	return Token{}, d.newSyntaxError("invalid field name: %s", errRegexp.Find(d.in)) | ||||
| } | ||||
|  | ||||
| // parseTypeName parses Any type URL or extension field name. The name is | ||||
| // enclosed in [ and ] characters. The C++ parser does not handle many legal URL | ||||
| // strings. This implementation is more liberal and allows for the pattern | ||||
| // ^[-_a-zA-Z0-9]+([./][-_a-zA-Z0-9]+)*`). Whitespaces and comments are allowed | ||||
| // in between [ ], '.', '/' and the sub names. | ||||
| func (d *Decoder) parseTypeName() (Token, error) { | ||||
| 	startPos := len(d.orig) - len(d.in) | ||||
| 	// Use alias s to advance first in order to use d.in for error handling. | ||||
| 	// Caller already checks for [ as first character. | ||||
| 	s := consume(d.in[1:], 0) | ||||
| 	if len(s) == 0 { | ||||
| 		return Token{}, ErrUnexpectedEOF | ||||
| 	} | ||||
|  | ||||
| 	var name []byte | ||||
| 	for len(s) > 0 && isTypeNameChar(s[0]) { | ||||
| 		name = append(name, s[0]) | ||||
| 		s = s[1:] | ||||
| 	} | ||||
| 	s = consume(s, 0) | ||||
|  | ||||
| 	var closed bool | ||||
| 	for len(s) > 0 && !closed { | ||||
| 		switch { | ||||
| 		case s[0] == ']': | ||||
| 			s = s[1:] | ||||
| 			closed = true | ||||
|  | ||||
| 		case s[0] == '/', s[0] == '.': | ||||
| 			if len(name) > 0 && (name[len(name)-1] == '/' || name[len(name)-1] == '.') { | ||||
| 				return Token{}, d.newSyntaxError("invalid type URL/extension field name: %s", | ||||
| 					d.orig[startPos:len(d.orig)-len(s)+1]) | ||||
| 			} | ||||
| 			name = append(name, s[0]) | ||||
| 			s = s[1:] | ||||
| 			s = consume(s, 0) | ||||
| 			for len(s) > 0 && isTypeNameChar(s[0]) { | ||||
| 				name = append(name, s[0]) | ||||
| 				s = s[1:] | ||||
| 			} | ||||
| 			s = consume(s, 0) | ||||
|  | ||||
| 		default: | ||||
| 			return Token{}, d.newSyntaxError( | ||||
| 				"invalid type URL/extension field name: %s", d.orig[startPos:len(d.orig)-len(s)+1]) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if !closed { | ||||
| 		return Token{}, ErrUnexpectedEOF | ||||
| 	} | ||||
|  | ||||
| 	// First character cannot be '.'. Last character cannot be '.' or '/'. | ||||
| 	size := len(name) | ||||
| 	if size == 0 || name[0] == '.' || name[size-1] == '.' || name[size-1] == '/' { | ||||
| 		return Token{}, d.newSyntaxError("invalid type URL/extension field name: %s", | ||||
| 			d.orig[startPos:len(d.orig)-len(s)]) | ||||
| 	} | ||||
|  | ||||
| 	d.in = s | ||||
| 	endPos := len(d.orig) - len(d.in) | ||||
| 	d.consume(0) | ||||
|  | ||||
| 	return Token{ | ||||
| 		kind:  Name, | ||||
| 		attrs: uint8(TypeName), | ||||
| 		pos:   startPos, | ||||
| 		raw:   d.orig[startPos:endPos], | ||||
| 		str:   string(name), | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| func isTypeNameChar(b byte) bool { | ||||
| 	return (b == '-' || b == '_' || | ||||
| 		('0' <= b && b <= '9') || | ||||
| 		('a' <= b && b <= 'z') || | ||||
| 		('A' <= b && b <= 'Z')) | ||||
| } | ||||
|  | ||||
| func isWhiteSpace(b byte) bool { | ||||
| 	switch b { | ||||
| 	case ' ', '\n', '\r', '\t': | ||||
| 		return true | ||||
| 	default: | ||||
| 		return false | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // parseIdent parses an unquoted proto identifier and returns size. | ||||
| // If allowNeg is true, it allows '-' to be the first character in the | ||||
| // identifier. This is used when parsing literal values like -infinity, etc. | ||||
| // Regular expression matches an identifier: `^[_a-zA-Z][_a-zA-Z0-9]*` | ||||
| func parseIdent(input []byte, allowNeg bool) int { | ||||
| 	var size int | ||||
|  | ||||
| 	s := input | ||||
| 	if len(s) == 0 { | ||||
| 		return 0 | ||||
| 	} | ||||
|  | ||||
| 	if allowNeg && s[0] == '-' { | ||||
| 		s = s[1:] | ||||
| 		size++ | ||||
| 		if len(s) == 0 { | ||||
| 			return 0 | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	switch { | ||||
| 	case s[0] == '_', | ||||
| 		'a' <= s[0] && s[0] <= 'z', | ||||
| 		'A' <= s[0] && s[0] <= 'Z': | ||||
| 		s = s[1:] | ||||
| 		size++ | ||||
| 	default: | ||||
| 		return 0 | ||||
| 	} | ||||
|  | ||||
| 	for len(s) > 0 && (s[0] == '_' || | ||||
| 		'a' <= s[0] && s[0] <= 'z' || | ||||
| 		'A' <= s[0] && s[0] <= 'Z' || | ||||
| 		'0' <= s[0] && s[0] <= '9') { | ||||
| 		s = s[1:] | ||||
| 		size++ | ||||
| 	} | ||||
|  | ||||
| 	if len(s) > 0 && !isDelim(s[0]) { | ||||
| 		return 0 | ||||
| 	} | ||||
|  | ||||
| 	return size | ||||
| } | ||||
|  | ||||
| // parseScalar parses for a string, literal or number value. | ||||
| func (d *Decoder) parseScalar() (Token, error) { | ||||
| 	if d.in[0] == '"' || d.in[0] == '\'' { | ||||
| 		return d.parseStringValue() | ||||
| 	} | ||||
|  | ||||
| 	if tok, ok := d.parseLiteralValue(); ok { | ||||
| 		return tok, nil | ||||
| 	} | ||||
|  | ||||
| 	if tok, ok := d.parseNumberValue(); ok { | ||||
| 		return tok, nil | ||||
| 	} | ||||
|  | ||||
| 	return Token{}, d.newSyntaxError("invalid scalar value: %s", errRegexp.Find(d.in)) | ||||
| } | ||||
|  | ||||
| // parseLiteralValue parses a literal value. A literal value is used for | ||||
| // bools, special floats and enums. This function simply identifies that the | ||||
| // field value is a literal. | ||||
| func (d *Decoder) parseLiteralValue() (Token, bool) { | ||||
| 	size := parseIdent(d.in, true) | ||||
| 	if size == 0 { | ||||
| 		return Token{}, false | ||||
| 	} | ||||
| 	return d.consumeToken(Scalar, size, literalValue), true | ||||
| } | ||||
|  | ||||
| // consumeToken constructs a Token for given Kind from d.in and consumes given | ||||
| // size-length from it. | ||||
| func (d *Decoder) consumeToken(kind Kind, size int, attrs uint8) Token { | ||||
| 	// Important to compute raw and pos before consuming. | ||||
| 	tok := Token{ | ||||
| 		kind:  kind, | ||||
| 		attrs: attrs, | ||||
| 		pos:   len(d.orig) - len(d.in), | ||||
| 		raw:   d.in[:size], | ||||
| 	} | ||||
| 	d.consume(size) | ||||
| 	return tok | ||||
| } | ||||
|  | ||||
| // newSyntaxError returns a syntax error with line and column information for | ||||
| // current position. | ||||
| func (d *Decoder) newSyntaxError(f string, x ...interface{}) error { | ||||
| 	e := errors.New(f, x...) | ||||
| 	line, column := d.Position(len(d.orig) - len(d.in)) | ||||
| 	return errors.New("syntax error (line %d:%d): %v", line, column, e) | ||||
| } | ||||
|  | ||||
| // Position returns line and column number of given index of the original input. | ||||
| // It will panic if index is out of range. | ||||
| func (d *Decoder) Position(idx int) (line int, column int) { | ||||
| 	b := d.orig[:idx] | ||||
| 	line = bytes.Count(b, []byte("\n")) + 1 | ||||
| 	if i := bytes.LastIndexByte(b, '\n'); i >= 0 { | ||||
| 		b = b[i+1:] | ||||
| 	} | ||||
| 	column = utf8.RuneCount(b) + 1 // ignore multi-rune characters | ||||
| 	return line, column | ||||
| } | ||||
|  | ||||
| func (d *Decoder) tryConsumeChar(c byte) bool { | ||||
| 	if len(d.in) > 0 && d.in[0] == c { | ||||
| 		d.consume(1) | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // consume consumes n bytes of input and any subsequent whitespace or comments. | ||||
| func (d *Decoder) consume(n int) { | ||||
| 	d.in = consume(d.in, n) | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // consume consumes n bytes of input and any subsequent whitespace or comments. | ||||
| func consume(b []byte, n int) []byte { | ||||
| 	b = b[n:] | ||||
| 	for len(b) > 0 { | ||||
| 		switch b[0] { | ||||
| 		case ' ', '\n', '\r', '\t': | ||||
| 			b = b[1:] | ||||
| 		case '#': | ||||
| 			if i := bytes.IndexByte(b, '\n'); i >= 0 { | ||||
| 				b = b[i+len("\n"):] | ||||
| 			} else { | ||||
| 				b = nil | ||||
| 			} | ||||
| 		default: | ||||
| 			return b | ||||
| 		} | ||||
| 	} | ||||
| 	return b | ||||
| } | ||||
|  | ||||
| // Any sequence that looks like a non-delimiter (for error reporting). | ||||
| var errRegexp = regexp.MustCompile(`^([-+._a-zA-Z0-9\/]+|.)`) | ||||
|  | ||||
| // isDelim returns true if given byte is a delimiter character. | ||||
| func isDelim(c byte) bool { | ||||
| 	return !(c == '-' || c == '+' || c == '.' || c == '_' || | ||||
| 		('a' <= c && c <= 'z') || | ||||
| 		('A' <= c && c <= 'Z') || | ||||
| 		('0' <= c && c <= '9')) | ||||
| } | ||||
							
								
								
									
										190
									
								
								vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,190 @@ | ||||
| // 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 text | ||||
|  | ||||
| // parseNumberValue parses a number from the input and returns a Token object. | ||||
| func (d *Decoder) parseNumberValue() (Token, bool) { | ||||
| 	in := d.in | ||||
| 	num := parseNumber(in) | ||||
| 	if num.size == 0 { | ||||
| 		return Token{}, false | ||||
| 	} | ||||
| 	numAttrs := num.kind | ||||
| 	if num.neg { | ||||
| 		numAttrs |= isNegative | ||||
| 	} | ||||
| 	strSize := num.size | ||||
| 	last := num.size - 1 | ||||
| 	if num.kind == numFloat && (d.in[last] == 'f' || d.in[last] == 'F') { | ||||
| 		strSize = last | ||||
| 	} | ||||
| 	tok := Token{ | ||||
| 		kind:     Scalar, | ||||
| 		attrs:    numberValue, | ||||
| 		pos:      len(d.orig) - len(d.in), | ||||
| 		raw:      d.in[:num.size], | ||||
| 		str:      string(d.in[:strSize]), | ||||
| 		numAttrs: numAttrs, | ||||
| 	} | ||||
| 	d.consume(num.size) | ||||
| 	return tok, true | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	numDec uint8 = (1 << iota) / 2 | ||||
| 	numHex | ||||
| 	numOct | ||||
| 	numFloat | ||||
| ) | ||||
|  | ||||
| // number is the result of parsing out a valid number from parseNumber. It | ||||
| // contains data for doing float or integer conversion via the strconv package | ||||
| // in conjunction with the input bytes. | ||||
| type number struct { | ||||
| 	kind uint8 | ||||
| 	neg  bool | ||||
| 	size int | ||||
| } | ||||
|  | ||||
| // parseNumber constructs a number object from given input. It allows for the | ||||
| // following patterns: | ||||
| //   integer: ^-?([1-9][0-9]*|0[xX][0-9a-fA-F]+|0[0-7]*) | ||||
| //   float: ^-?((0|[1-9][0-9]*)?([.][0-9]*)?([eE][+-]?[0-9]+)?[fF]?) | ||||
| // It also returns the number of parsed bytes for the given number, 0 if it is | ||||
| // not a number. | ||||
| func parseNumber(input []byte) number { | ||||
| 	kind := numDec | ||||
| 	var size int | ||||
| 	var neg bool | ||||
|  | ||||
| 	s := input | ||||
| 	if len(s) == 0 { | ||||
| 		return number{} | ||||
| 	} | ||||
|  | ||||
| 	// Optional - | ||||
| 	if s[0] == '-' { | ||||
| 		neg = true | ||||
| 		s = s[1:] | ||||
| 		size++ | ||||
| 		if len(s) == 0 { | ||||
| 			return number{} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// C++ allows for whitespace and comments in between the negative sign and | ||||
| 	// the rest of the number. This logic currently does not but is consistent | ||||
| 	// with v1. | ||||
|  | ||||
| 	switch { | ||||
| 	case s[0] == '0': | ||||
| 		if len(s) > 1 { | ||||
| 			switch { | ||||
| 			case s[1] == 'x' || s[1] == 'X': | ||||
| 				// Parse as hex number. | ||||
| 				kind = numHex | ||||
| 				n := 2 | ||||
| 				s = s[2:] | ||||
| 				for len(s) > 0 && (('0' <= s[0] && s[0] <= '9') || | ||||
| 					('a' <= s[0] && s[0] <= 'f') || | ||||
| 					('A' <= s[0] && s[0] <= 'F')) { | ||||
| 					s = s[1:] | ||||
| 					n++ | ||||
| 				} | ||||
| 				if n == 2 { | ||||
| 					return number{} | ||||
| 				} | ||||
| 				size += n | ||||
|  | ||||
| 			case '0' <= s[1] && s[1] <= '7': | ||||
| 				// Parse as octal number. | ||||
| 				kind = numOct | ||||
| 				n := 2 | ||||
| 				s = s[2:] | ||||
| 				for len(s) > 0 && '0' <= s[0] && s[0] <= '7' { | ||||
| 					s = s[1:] | ||||
| 					n++ | ||||
| 				} | ||||
| 				size += n | ||||
| 			} | ||||
|  | ||||
| 			if kind&(numHex|numOct) > 0 { | ||||
| 				if len(s) > 0 && !isDelim(s[0]) { | ||||
| 					return number{} | ||||
| 				} | ||||
| 				return number{kind: kind, neg: neg, size: size} | ||||
| 			} | ||||
| 		} | ||||
| 		s = s[1:] | ||||
| 		size++ | ||||
|  | ||||
| 	case '1' <= s[0] && s[0] <= '9': | ||||
| 		n := 1 | ||||
| 		s = s[1:] | ||||
| 		for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { | ||||
| 			s = s[1:] | ||||
| 			n++ | ||||
| 		} | ||||
| 		size += n | ||||
|  | ||||
| 	case s[0] == '.': | ||||
| 		// Set kind to numFloat to signify the intent to parse as float. And | ||||
| 		// that it needs to have other digits after '.'. | ||||
| 		kind = numFloat | ||||
|  | ||||
| 	default: | ||||
| 		return number{} | ||||
| 	} | ||||
|  | ||||
| 	// . followed by 0 or more digits. | ||||
| 	if len(s) > 0 && s[0] == '.' { | ||||
| 		n := 1 | ||||
| 		s = s[1:] | ||||
| 		// If decimal point was before any digits, it should be followed by | ||||
| 		// other digits. | ||||
| 		if len(s) == 0 && kind == numFloat { | ||||
| 			return number{} | ||||
| 		} | ||||
| 		for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { | ||||
| 			s = s[1:] | ||||
| 			n++ | ||||
| 		} | ||||
| 		size += n | ||||
| 		kind = numFloat | ||||
| 	} | ||||
|  | ||||
| 	// e or E followed by an optional - or + and 1 or more digits. | ||||
| 	if len(s) >= 2 && (s[0] == 'e' || s[0] == 'E') { | ||||
| 		kind = numFloat | ||||
| 		s = s[1:] | ||||
| 		n := 1 | ||||
| 		if s[0] == '+' || s[0] == '-' { | ||||
| 			s = s[1:] | ||||
| 			n++ | ||||
| 			if len(s) == 0 { | ||||
| 				return number{} | ||||
| 			} | ||||
| 		} | ||||
| 		for len(s) > 0 && '0' <= s[0] && s[0] <= '9' { | ||||
| 			s = s[1:] | ||||
| 			n++ | ||||
| 		} | ||||
| 		size += n | ||||
| 	} | ||||
|  | ||||
| 	// Optional suffix f or F for floats. | ||||
| 	if len(s) > 0 && (s[0] == 'f' || s[0] == 'F') { | ||||
| 		kind = numFloat | ||||
| 		s = s[1:] | ||||
| 		size++ | ||||
| 	} | ||||
|  | ||||
| 	// Check that next byte is a delimiter or it is at the end. | ||||
| 	if len(s) > 0 && !isDelim(s[0]) { | ||||
| 		return number{} | ||||
| 	} | ||||
|  | ||||
| 	return number{kind: kind, neg: neg, size: size} | ||||
| } | ||||
							
								
								
									
										161
									
								
								vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,161 @@ | ||||
| // 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 text | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"unicode" | ||||
| 	"unicode/utf16" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| ) | ||||
|  | ||||
| // parseStringValue parses string field token. | ||||
| // This differs from parseString since the text format allows | ||||
| // multiple back-to-back string literals where they are semantically treated | ||||
| // as a single large string with all values concatenated. | ||||
| // | ||||
| // E.g., `"foo" "bar" "baz"` => "foobarbaz" | ||||
| func (d *Decoder) parseStringValue() (Token, error) { | ||||
| 	// Note that the ending quote is sufficient to unambiguously mark the end | ||||
| 	// of a string. Thus, the text grammar does not require intervening | ||||
| 	// whitespace or control characters in-between strings. | ||||
| 	// Thus, the following is valid: | ||||
| 	//	`"foo"'bar'"baz"` => "foobarbaz" | ||||
| 	in0 := d.in | ||||
| 	var ss []string | ||||
| 	for len(d.in) > 0 && (d.in[0] == '"' || d.in[0] == '\'') { | ||||
| 		s, err := d.parseString() | ||||
| 		if err != nil { | ||||
| 			return Token{}, err | ||||
| 		} | ||||
| 		ss = append(ss, s) | ||||
| 	} | ||||
| 	// d.in already points to the end of the value at this point. | ||||
| 	return Token{ | ||||
| 		kind:  Scalar, | ||||
| 		attrs: stringValue, | ||||
| 		pos:   len(d.orig) - len(in0), | ||||
| 		raw:   in0[:len(in0)-len(d.in)], | ||||
| 		str:   strings.Join(ss, ""), | ||||
| 	}, nil | ||||
| } | ||||
|  | ||||
| // parseString parses a string value enclosed in " or '. | ||||
| func (d *Decoder) parseString() (string, error) { | ||||
| 	in := d.in | ||||
| 	if len(in) == 0 { | ||||
| 		return "", ErrUnexpectedEOF | ||||
| 	} | ||||
| 	quote := in[0] | ||||
| 	in = in[1:] | ||||
| 	i := indexNeedEscapeInBytes(in) | ||||
| 	in, out := in[i:], in[:i:i] // set cap to prevent mutations | ||||
| 	for len(in) > 0 { | ||||
| 		switch r, n := utf8.DecodeRune(in); { | ||||
| 		case r == utf8.RuneError && n == 1: | ||||
| 			return "", d.newSyntaxError("invalid UTF-8 detected") | ||||
| 		case r == 0 || r == '\n': | ||||
| 			return "", d.newSyntaxError("invalid character %q in string", r) | ||||
| 		case r == rune(quote): | ||||
| 			in = in[1:] | ||||
| 			d.consume(len(d.in) - len(in)) | ||||
| 			return string(out), nil | ||||
| 		case r == '\\': | ||||
| 			if len(in) < 2 { | ||||
| 				return "", ErrUnexpectedEOF | ||||
| 			} | ||||
| 			switch r := in[1]; r { | ||||
| 			case '"', '\'', '\\', '?': | ||||
| 				in, out = in[2:], append(out, r) | ||||
| 			case 'a': | ||||
| 				in, out = in[2:], append(out, '\a') | ||||
| 			case 'b': | ||||
| 				in, out = in[2:], append(out, '\b') | ||||
| 			case 'n': | ||||
| 				in, out = in[2:], append(out, '\n') | ||||
| 			case 'r': | ||||
| 				in, out = in[2:], append(out, '\r') | ||||
| 			case 't': | ||||
| 				in, out = in[2:], append(out, '\t') | ||||
| 			case 'v': | ||||
| 				in, out = in[2:], append(out, '\v') | ||||
| 			case 'f': | ||||
| 				in, out = in[2:], append(out, '\f') | ||||
| 			case '0', '1', '2', '3', '4', '5', '6', '7': | ||||
| 				// One, two, or three octal characters. | ||||
| 				n := len(in[1:]) - len(bytes.TrimLeft(in[1:], "01234567")) | ||||
| 				if n > 3 { | ||||
| 					n = 3 | ||||
| 				} | ||||
| 				v, err := strconv.ParseUint(string(in[1:1+n]), 8, 8) | ||||
| 				if err != nil { | ||||
| 					return "", d.newSyntaxError("invalid octal escape code %q in string", in[:1+n]) | ||||
| 				} | ||||
| 				in, out = in[1+n:], append(out, byte(v)) | ||||
| 			case 'x': | ||||
| 				// One or two hexadecimal characters. | ||||
| 				n := len(in[2:]) - len(bytes.TrimLeft(in[2:], "0123456789abcdefABCDEF")) | ||||
| 				if n > 2 { | ||||
| 					n = 2 | ||||
| 				} | ||||
| 				v, err := strconv.ParseUint(string(in[2:2+n]), 16, 8) | ||||
| 				if err != nil { | ||||
| 					return "", d.newSyntaxError("invalid hex escape code %q in string", in[:2+n]) | ||||
| 				} | ||||
| 				in, out = in[2+n:], append(out, byte(v)) | ||||
| 			case 'u', 'U': | ||||
| 				// Four or eight hexadecimal characters | ||||
| 				n := 6 | ||||
| 				if r == 'U' { | ||||
| 					n = 10 | ||||
| 				} | ||||
| 				if len(in) < n { | ||||
| 					return "", ErrUnexpectedEOF | ||||
| 				} | ||||
| 				v, err := strconv.ParseUint(string(in[2:n]), 16, 32) | ||||
| 				if utf8.MaxRune < v || err != nil { | ||||
| 					return "", d.newSyntaxError("invalid Unicode escape code %q in string", in[:n]) | ||||
| 				} | ||||
| 				in = in[n:] | ||||
|  | ||||
| 				r := rune(v) | ||||
| 				if utf16.IsSurrogate(r) { | ||||
| 					if len(in) < 6 { | ||||
| 						return "", ErrUnexpectedEOF | ||||
| 					} | ||||
| 					v, err := strconv.ParseUint(string(in[2:6]), 16, 16) | ||||
| 					r = utf16.DecodeRune(r, rune(v)) | ||||
| 					if in[0] != '\\' || in[1] != 'u' || r == unicode.ReplacementChar || err != nil { | ||||
| 						return "", d.newSyntaxError("invalid Unicode escape code %q in string", in[:6]) | ||||
| 					} | ||||
| 					in = in[6:] | ||||
| 				} | ||||
| 				out = append(out, string(r)...) | ||||
| 			default: | ||||
| 				return "", d.newSyntaxError("invalid escape code %q in string", in[:2]) | ||||
| 			} | ||||
| 		default: | ||||
| 			i := indexNeedEscapeInBytes(in[n:]) | ||||
| 			in, out = in[n+i:], append(out, in[:n+i]...) | ||||
| 		} | ||||
| 	} | ||||
| 	return "", ErrUnexpectedEOF | ||||
| } | ||||
|  | ||||
| // indexNeedEscapeInString returns the index of the character that needs | ||||
| // escaping. If no characters need escaping, this returns the input length. | ||||
| func indexNeedEscapeInBytes(b []byte) int { return indexNeedEscapeInString(strs.UnsafeString(b)) } | ||||
|  | ||||
| // UnmarshalString returns an unescaped string given a textproto string value. | ||||
| // String value needs to contain single or double quotes. This is only used by | ||||
| // internal/encoding/defval package for unmarshaling bytes. | ||||
| func UnmarshalString(s string) (string, error) { | ||||
| 	d := NewDecoder([]byte(s)) | ||||
| 	return d.parseString() | ||||
| } | ||||
							
								
								
									
										373
									
								
								vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										373
									
								
								vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,373 @@ | ||||
| // 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 text | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"math" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/flags" | ||||
| ) | ||||
|  | ||||
| // Kind represents a token kind expressible in the textproto format. | ||||
| type Kind uint8 | ||||
|  | ||||
| // Kind values. | ||||
| const ( | ||||
| 	Invalid Kind = iota | ||||
| 	EOF | ||||
| 	Name   // Name indicates the field name. | ||||
| 	Scalar // Scalar are scalar values, e.g. "string", 47, ENUM_LITERAL, true. | ||||
| 	MessageOpen | ||||
| 	MessageClose | ||||
| 	ListOpen | ||||
| 	ListClose | ||||
|  | ||||
| 	// comma and semi-colon are only for parsing in between values and should not be exposed. | ||||
| 	comma | ||||
| 	semicolon | ||||
|  | ||||
| 	// bof indicates beginning of file, which is the default token | ||||
| 	// kind at the beginning of parsing. | ||||
| 	bof = Invalid | ||||
| ) | ||||
|  | ||||
| func (t Kind) String() string { | ||||
| 	switch t { | ||||
| 	case Invalid: | ||||
| 		return "<invalid>" | ||||
| 	case EOF: | ||||
| 		return "eof" | ||||
| 	case Scalar: | ||||
| 		return "scalar" | ||||
| 	case Name: | ||||
| 		return "name" | ||||
| 	case MessageOpen: | ||||
| 		return "{" | ||||
| 	case MessageClose: | ||||
| 		return "}" | ||||
| 	case ListOpen: | ||||
| 		return "[" | ||||
| 	case ListClose: | ||||
| 		return "]" | ||||
| 	case comma: | ||||
| 		return "," | ||||
| 	case semicolon: | ||||
| 		return ";" | ||||
| 	default: | ||||
| 		return fmt.Sprintf("<invalid:%v>", uint8(t)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // NameKind represents different types of field names. | ||||
| type NameKind uint8 | ||||
|  | ||||
| // NameKind values. | ||||
| const ( | ||||
| 	IdentName NameKind = iota + 1 | ||||
| 	TypeName | ||||
| 	FieldNumber | ||||
| ) | ||||
|  | ||||
| func (t NameKind) String() string { | ||||
| 	switch t { | ||||
| 	case IdentName: | ||||
| 		return "IdentName" | ||||
| 	case TypeName: | ||||
| 		return "TypeName" | ||||
| 	case FieldNumber: | ||||
| 		return "FieldNumber" | ||||
| 	default: | ||||
| 		return fmt.Sprintf("<invalid:%v>", uint8(t)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Bit mask in Token.attrs to indicate if a Name token is followed by the | ||||
| // separator char ':'. The field name separator char is optional for message | ||||
| // field or repeated message field, but required for all other types. Decoder | ||||
| // simply indicates whether a Name token is followed by separator or not.  It is | ||||
| // up to the prototext package to validate. | ||||
| const hasSeparator = 1 << 7 | ||||
|  | ||||
| // Scalar value types. | ||||
| const ( | ||||
| 	numberValue = iota + 1 | ||||
| 	stringValue | ||||
| 	literalValue | ||||
| ) | ||||
|  | ||||
| // Bit mask in Token.numAttrs to indicate that the number is a negative. | ||||
| const isNegative = 1 << 7 | ||||
|  | ||||
| // Token provides a parsed token kind and value. Values are provided by the | ||||
| // different accessor methods. | ||||
| type Token struct { | ||||
| 	// Kind of the Token object. | ||||
| 	kind Kind | ||||
| 	// attrs contains metadata for the following Kinds: | ||||
| 	// Name: hasSeparator bit and one of NameKind. | ||||
| 	// Scalar: one of numberValue, stringValue, literalValue. | ||||
| 	attrs uint8 | ||||
| 	// numAttrs contains metadata for numberValue: | ||||
| 	// - highest bit is whether negative or positive. | ||||
| 	// - lower bits indicate one of numDec, numHex, numOct, numFloat. | ||||
| 	numAttrs uint8 | ||||
| 	// pos provides the position of the token in the original input. | ||||
| 	pos int | ||||
| 	// raw bytes of the serialized token. | ||||
| 	// This is a subslice into the original input. | ||||
| 	raw []byte | ||||
| 	// str contains parsed string for the following: | ||||
| 	// - stringValue of Scalar kind | ||||
| 	// - numberValue of Scalar kind | ||||
| 	// - TypeName of Name kind | ||||
| 	str string | ||||
| } | ||||
|  | ||||
| // Kind returns the token kind. | ||||
| func (t Token) Kind() Kind { | ||||
| 	return t.kind | ||||
| } | ||||
|  | ||||
| // RawString returns the read value in string. | ||||
| func (t Token) RawString() string { | ||||
| 	return string(t.raw) | ||||
| } | ||||
|  | ||||
| // Pos returns the token position from the input. | ||||
| func (t Token) Pos() int { | ||||
| 	return t.pos | ||||
| } | ||||
|  | ||||
| // NameKind returns IdentName, TypeName or FieldNumber. | ||||
| // It panics if type is not Name. | ||||
| func (t Token) NameKind() NameKind { | ||||
| 	if t.kind == Name { | ||||
| 		return NameKind(t.attrs &^ hasSeparator) | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("Token is not a Name type: %s", t.kind)) | ||||
| } | ||||
|  | ||||
| // HasSeparator returns true if the field name is followed by the separator char | ||||
| // ':', else false. It panics if type is not Name. | ||||
| func (t Token) HasSeparator() bool { | ||||
| 	if t.kind == Name { | ||||
| 		return t.attrs&hasSeparator != 0 | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("Token is not a Name type: %s", t.kind)) | ||||
| } | ||||
|  | ||||
| // IdentName returns the value for IdentName type. | ||||
| func (t Token) IdentName() string { | ||||
| 	if t.kind == Name && t.attrs&uint8(IdentName) != 0 { | ||||
| 		return string(t.raw) | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("Token is not an IdentName: %s:%s", t.kind, NameKind(t.attrs&^hasSeparator))) | ||||
| } | ||||
|  | ||||
| // TypeName returns the value for TypeName type. | ||||
| func (t Token) TypeName() string { | ||||
| 	if t.kind == Name && t.attrs&uint8(TypeName) != 0 { | ||||
| 		return t.str | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("Token is not a TypeName: %s:%s", t.kind, NameKind(t.attrs&^hasSeparator))) | ||||
| } | ||||
|  | ||||
| // FieldNumber returns the value for FieldNumber type. It returns a | ||||
| // non-negative int32 value. Caller will still need to validate for the correct | ||||
| // field number range. | ||||
| func (t Token) FieldNumber() int32 { | ||||
| 	if t.kind != Name || t.attrs&uint8(FieldNumber) == 0 { | ||||
| 		panic(fmt.Sprintf("Token is not a FieldNumber: %s:%s", t.kind, NameKind(t.attrs&^hasSeparator))) | ||||
| 	} | ||||
| 	// Following should not return an error as it had already been called right | ||||
| 	// before this Token was constructed. | ||||
| 	num, _ := strconv.ParseInt(string(t.raw), 10, 32) | ||||
| 	return int32(num) | ||||
| } | ||||
|  | ||||
| // String returns the string value for a Scalar type. | ||||
| func (t Token) String() (string, bool) { | ||||
| 	if t.kind != Scalar || t.attrs != stringValue { | ||||
| 		return "", false | ||||
| 	} | ||||
| 	return t.str, true | ||||
| } | ||||
|  | ||||
| // Enum returns the literal value for a Scalar type for use as enum literals. | ||||
| func (t Token) Enum() (string, bool) { | ||||
| 	if t.kind != Scalar || t.attrs != literalValue || (len(t.raw) > 0 && t.raw[0] == '-') { | ||||
| 		return "", false | ||||
| 	} | ||||
| 	return string(t.raw), true | ||||
| } | ||||
|  | ||||
| // Bool returns the bool value for a Scalar type. | ||||
| func (t Token) Bool() (bool, bool) { | ||||
| 	if t.kind != Scalar { | ||||
| 		return false, false | ||||
| 	} | ||||
| 	switch t.attrs { | ||||
| 	case literalValue: | ||||
| 		if b, ok := boolLits[string(t.raw)]; ok { | ||||
| 			return b, true | ||||
| 		} | ||||
| 	case numberValue: | ||||
| 		// Unsigned integer representation of 0 or 1 is permitted: 00, 0x0, 01, | ||||
| 		// 0x1, etc. | ||||
| 		n, err := strconv.ParseUint(t.str, 0, 64) | ||||
| 		if err == nil { | ||||
| 			switch n { | ||||
| 			case 0: | ||||
| 				return false, true | ||||
| 			case 1: | ||||
| 				return true, true | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return false, false | ||||
| } | ||||
|  | ||||
| // These exact boolean literals are the ones supported in C++. | ||||
| var boolLits = map[string]bool{ | ||||
| 	"t":     true, | ||||
| 	"true":  true, | ||||
| 	"True":  true, | ||||
| 	"f":     false, | ||||
| 	"false": false, | ||||
| 	"False": false, | ||||
| } | ||||
|  | ||||
| // Uint64 returns the uint64 value for a Scalar type. | ||||
| func (t Token) Uint64() (uint64, bool) { | ||||
| 	if t.kind != Scalar || t.attrs != numberValue || | ||||
| 		t.numAttrs&isNegative > 0 || t.numAttrs&numFloat > 0 { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	n, err := strconv.ParseUint(t.str, 0, 64) | ||||
| 	if err != nil { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	return n, true | ||||
| } | ||||
|  | ||||
| // Uint32 returns the uint32 value for a Scalar type. | ||||
| func (t Token) Uint32() (uint32, bool) { | ||||
| 	if t.kind != Scalar || t.attrs != numberValue || | ||||
| 		t.numAttrs&isNegative > 0 || t.numAttrs&numFloat > 0 { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	n, err := strconv.ParseUint(t.str, 0, 32) | ||||
| 	if err != nil { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	return uint32(n), true | ||||
| } | ||||
|  | ||||
| // Int64 returns the int64 value for a Scalar type. | ||||
| func (t Token) Int64() (int64, bool) { | ||||
| 	if t.kind != Scalar || t.attrs != numberValue || t.numAttrs&numFloat > 0 { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	if n, err := strconv.ParseInt(t.str, 0, 64); err == nil { | ||||
| 		return n, true | ||||
| 	} | ||||
| 	// C++ accepts large positive hex numbers as negative values. | ||||
| 	// This feature is here for proto1 backwards compatibility purposes. | ||||
| 	if flags.ProtoLegacy && (t.numAttrs == numHex) { | ||||
| 		if n, err := strconv.ParseUint(t.str, 0, 64); err == nil { | ||||
| 			return int64(n), true | ||||
| 		} | ||||
| 	} | ||||
| 	return 0, false | ||||
| } | ||||
|  | ||||
| // Int32 returns the int32 value for a Scalar type. | ||||
| func (t Token) Int32() (int32, bool) { | ||||
| 	if t.kind != Scalar || t.attrs != numberValue || t.numAttrs&numFloat > 0 { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	if n, err := strconv.ParseInt(t.str, 0, 32); err == nil { | ||||
| 		return int32(n), true | ||||
| 	} | ||||
| 	// C++ accepts large positive hex numbers as negative values. | ||||
| 	// This feature is here for proto1 backwards compatibility purposes. | ||||
| 	if flags.ProtoLegacy && (t.numAttrs == numHex) { | ||||
| 		if n, err := strconv.ParseUint(t.str, 0, 32); err == nil { | ||||
| 			return int32(n), true | ||||
| 		} | ||||
| 	} | ||||
| 	return 0, false | ||||
| } | ||||
|  | ||||
| // Float64 returns the float64 value for a Scalar type. | ||||
| func (t Token) Float64() (float64, bool) { | ||||
| 	if t.kind != Scalar { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	switch t.attrs { | ||||
| 	case literalValue: | ||||
| 		if f, ok := floatLits[strings.ToLower(string(t.raw))]; ok { | ||||
| 			return f, true | ||||
| 		} | ||||
| 	case numberValue: | ||||
| 		n, err := strconv.ParseFloat(t.str, 64) | ||||
| 		if err == nil { | ||||
| 			return n, true | ||||
| 		} | ||||
| 		nerr := err.(*strconv.NumError) | ||||
| 		if nerr.Err == strconv.ErrRange { | ||||
| 			return n, true | ||||
| 		} | ||||
| 	} | ||||
| 	return 0, false | ||||
| } | ||||
|  | ||||
| // Float32 returns the float32 value for a Scalar type. | ||||
| func (t Token) Float32() (float32, bool) { | ||||
| 	if t.kind != Scalar { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	switch t.attrs { | ||||
| 	case literalValue: | ||||
| 		if f, ok := floatLits[strings.ToLower(string(t.raw))]; ok { | ||||
| 			return float32(f), true | ||||
| 		} | ||||
| 	case numberValue: | ||||
| 		n, err := strconv.ParseFloat(t.str, 64) | ||||
| 		if err == nil { | ||||
| 			// Overflows are treated as (-)infinity. | ||||
| 			return float32(n), true | ||||
| 		} | ||||
| 		nerr := err.(*strconv.NumError) | ||||
| 		if nerr.Err == strconv.ErrRange { | ||||
| 			return float32(n), true | ||||
| 		} | ||||
| 	} | ||||
| 	return 0, false | ||||
| } | ||||
|  | ||||
| // These are the supported float literals which C++ permits case-insensitive | ||||
| // variants of these. | ||||
| var floatLits = map[string]float64{ | ||||
| 	"nan":       math.NaN(), | ||||
| 	"inf":       math.Inf(1), | ||||
| 	"infinity":  math.Inf(1), | ||||
| 	"-inf":      math.Inf(-1), | ||||
| 	"-infinity": math.Inf(-1), | ||||
| } | ||||
|  | ||||
| // TokenEquals returns true if given Tokens are equal, else false. | ||||
| func TokenEquals(x, y Token) bool { | ||||
| 	return x.kind == y.kind && | ||||
| 		x.attrs == y.attrs && | ||||
| 		x.numAttrs == y.numAttrs && | ||||
| 		x.pos == y.pos && | ||||
| 		bytes.Equal(x.raw, y.raw) && | ||||
| 		x.str == y.str | ||||
| } | ||||
							
								
								
									
										29
									
								
								vendor/google.golang.org/protobuf/internal/encoding/text/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								vendor/google.golang.org/protobuf/internal/encoding/text/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| // 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 text implements the text format for protocol buffers. | ||||
| // This package has no semantic understanding for protocol buffers and is only | ||||
| // a parser and composer for the format. | ||||
| // | ||||
| // There is no formal specification for the protobuf text format, as such the | ||||
| // C++ implementation (see google::protobuf::TextFormat) is the reference | ||||
| // implementation of the text format. | ||||
| // | ||||
| // This package is neither a superset nor a subset of the C++ implementation. | ||||
| // This implementation permits a more liberal grammar in some cases to be | ||||
| // backwards compatible with the historical Go implementation. | ||||
| // Future parsings unique to Go should not be added. | ||||
| // Some grammars allowed by the C++ implementation are deliberately | ||||
| // not implemented here because they are considered a bug by the protobuf team | ||||
| // and should not be replicated. | ||||
| // | ||||
| // The Go implementation should implement a sufficient amount of the C++ | ||||
| // grammar such that the default text serialization by C++ can be parsed by Go. | ||||
| // However, just because the C++ parser accepts some input does not mean that | ||||
| // the Go implementation should as well. | ||||
| // | ||||
| // The text format is almost a superset of JSON except: | ||||
| //	* message keys are not quoted strings, but identifiers | ||||
| //	* the top-level value must be a message without the delimiters | ||||
| package text | ||||
							
								
								
									
										270
									
								
								vendor/google.golang.org/protobuf/internal/encoding/text/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								vendor/google.golang.org/protobuf/internal/encoding/text/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,270 @@ | ||||
| // 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 text | ||||
|  | ||||
| import ( | ||||
| 	"math" | ||||
| 	"math/bits" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/detrand" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| ) | ||||
|  | ||||
| // encType represents an encoding type. | ||||
| type encType uint8 | ||||
|  | ||||
| const ( | ||||
| 	_ encType = (1 << iota) / 2 | ||||
| 	name | ||||
| 	scalar | ||||
| 	messageOpen | ||||
| 	messageClose | ||||
| ) | ||||
|  | ||||
| // Encoder provides methods to write out textproto constructs and values. The user is | ||||
| // responsible for producing valid sequences of constructs and values. | ||||
| type Encoder struct { | ||||
| 	encoderState | ||||
|  | ||||
| 	indent      string | ||||
| 	delims      [2]byte | ||||
| 	outputASCII bool | ||||
| } | ||||
|  | ||||
| type encoderState struct { | ||||
| 	lastType encType | ||||
| 	indents  []byte | ||||
| 	out      []byte | ||||
| } | ||||
|  | ||||
| // NewEncoder returns an Encoder. | ||||
| // | ||||
| // If indent is a non-empty string, it causes every entry in a List or Message | ||||
| // to be preceded by the indent and trailed by a newline. | ||||
| // | ||||
| // If delims is not the zero value, it controls the delimiter characters used | ||||
| // for messages (e.g., "{}" vs "<>"). | ||||
| // | ||||
| // If outputASCII is true, strings will be serialized in such a way that | ||||
| // multi-byte UTF-8 sequences are escaped. This property ensures that the | ||||
| // overall output is ASCII (as opposed to UTF-8). | ||||
| func NewEncoder(indent string, delims [2]byte, outputASCII bool) (*Encoder, error) { | ||||
| 	e := &Encoder{} | ||||
| 	if len(indent) > 0 { | ||||
| 		if strings.Trim(indent, " \t") != "" { | ||||
| 			return nil, errors.New("indent may only be composed of space and tab characters") | ||||
| 		} | ||||
| 		e.indent = indent | ||||
| 	} | ||||
| 	switch delims { | ||||
| 	case [2]byte{0, 0}: | ||||
| 		e.delims = [2]byte{'{', '}'} | ||||
| 	case [2]byte{'{', '}'}, [2]byte{'<', '>'}: | ||||
| 		e.delims = delims | ||||
| 	default: | ||||
| 		return nil, errors.New("delimiters may only be \"{}\" or \"<>\"") | ||||
| 	} | ||||
| 	e.outputASCII = outputASCII | ||||
|  | ||||
| 	return e, nil | ||||
| } | ||||
|  | ||||
| // Bytes returns the content of the written bytes. | ||||
| func (e *Encoder) Bytes() []byte { | ||||
| 	return e.out | ||||
| } | ||||
|  | ||||
| // StartMessage writes out the '{' or '<' symbol. | ||||
| func (e *Encoder) StartMessage() { | ||||
| 	e.prepareNext(messageOpen) | ||||
| 	e.out = append(e.out, e.delims[0]) | ||||
| } | ||||
|  | ||||
| // EndMessage writes out the '}' or '>' symbol. | ||||
| func (e *Encoder) EndMessage() { | ||||
| 	e.prepareNext(messageClose) | ||||
| 	e.out = append(e.out, e.delims[1]) | ||||
| } | ||||
|  | ||||
| // WriteName writes out the field name and the separator ':'. | ||||
| func (e *Encoder) WriteName(s string) { | ||||
| 	e.prepareNext(name) | ||||
| 	e.out = append(e.out, s...) | ||||
| 	e.out = append(e.out, ':') | ||||
| } | ||||
|  | ||||
| // WriteBool writes out the given boolean value. | ||||
| func (e *Encoder) WriteBool(b bool) { | ||||
| 	if b { | ||||
| 		e.WriteLiteral("true") | ||||
| 	} else { | ||||
| 		e.WriteLiteral("false") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // WriteString writes out the given string value. | ||||
| func (e *Encoder) WriteString(s string) { | ||||
| 	e.prepareNext(scalar) | ||||
| 	e.out = appendString(e.out, s, e.outputASCII) | ||||
| } | ||||
|  | ||||
| func appendString(out []byte, in string, outputASCII bool) []byte { | ||||
| 	out = append(out, '"') | ||||
| 	i := indexNeedEscapeInString(in) | ||||
| 	in, out = in[i:], append(out, in[:i]...) | ||||
| 	for len(in) > 0 { | ||||
| 		switch r, n := utf8.DecodeRuneInString(in); { | ||||
| 		case r == utf8.RuneError && n == 1: | ||||
| 			// We do not report invalid UTF-8 because strings in the text format | ||||
| 			// are used to represent both the proto string and bytes type. | ||||
| 			r = rune(in[0]) | ||||
| 			fallthrough | ||||
| 		case r < ' ' || r == '"' || r == '\\' || r == 0x7f: | ||||
| 			out = append(out, '\\') | ||||
| 			switch r { | ||||
| 			case '"', '\\': | ||||
| 				out = append(out, byte(r)) | ||||
| 			case '\n': | ||||
| 				out = append(out, 'n') | ||||
| 			case '\r': | ||||
| 				out = append(out, 'r') | ||||
| 			case '\t': | ||||
| 				out = append(out, 't') | ||||
| 			default: | ||||
| 				out = append(out, 'x') | ||||
| 				out = append(out, "00"[1+(bits.Len32(uint32(r))-1)/4:]...) | ||||
| 				out = strconv.AppendUint(out, uint64(r), 16) | ||||
| 			} | ||||
| 			in = in[n:] | ||||
| 		case r >= utf8.RuneSelf && (outputASCII || r <= 0x009f): | ||||
| 			out = append(out, '\\') | ||||
| 			if r <= math.MaxUint16 { | ||||
| 				out = append(out, 'u') | ||||
| 				out = append(out, "0000"[1+(bits.Len32(uint32(r))-1)/4:]...) | ||||
| 				out = strconv.AppendUint(out, uint64(r), 16) | ||||
| 			} else { | ||||
| 				out = append(out, 'U') | ||||
| 				out = append(out, "00000000"[1+(bits.Len32(uint32(r))-1)/4:]...) | ||||
| 				out = strconv.AppendUint(out, uint64(r), 16) | ||||
| 			} | ||||
| 			in = in[n:] | ||||
| 		default: | ||||
| 			i := indexNeedEscapeInString(in[n:]) | ||||
| 			in, out = in[n+i:], append(out, in[:n+i]...) | ||||
| 		} | ||||
| 	} | ||||
| 	out = append(out, '"') | ||||
| 	return out | ||||
| } | ||||
|  | ||||
| // indexNeedEscapeInString returns the index of the character that needs | ||||
| // escaping. If no characters need escaping, this returns the input length. | ||||
| func indexNeedEscapeInString(s string) int { | ||||
| 	for i := 0; i < len(s); i++ { | ||||
| 		if c := s[i]; c < ' ' || c == '"' || c == '\'' || c == '\\' || c >= 0x7f { | ||||
| 			return i | ||||
| 		} | ||||
| 	} | ||||
| 	return len(s) | ||||
| } | ||||
|  | ||||
| // WriteFloat writes out the given float value for given bitSize. | ||||
| func (e *Encoder) WriteFloat(n float64, bitSize int) { | ||||
| 	e.prepareNext(scalar) | ||||
| 	e.out = appendFloat(e.out, n, bitSize) | ||||
| } | ||||
|  | ||||
| func appendFloat(out []byte, n float64, bitSize int) []byte { | ||||
| 	switch { | ||||
| 	case math.IsNaN(n): | ||||
| 		return append(out, "nan"...) | ||||
| 	case math.IsInf(n, +1): | ||||
| 		return append(out, "inf"...) | ||||
| 	case math.IsInf(n, -1): | ||||
| 		return append(out, "-inf"...) | ||||
| 	default: | ||||
| 		return strconv.AppendFloat(out, n, 'g', -1, bitSize) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // WriteInt writes out the given signed integer value. | ||||
| func (e *Encoder) WriteInt(n int64) { | ||||
| 	e.prepareNext(scalar) | ||||
| 	e.out = append(e.out, strconv.FormatInt(n, 10)...) | ||||
| } | ||||
|  | ||||
| // WriteUint writes out the given unsigned integer value. | ||||
| func (e *Encoder) WriteUint(n uint64) { | ||||
| 	e.prepareNext(scalar) | ||||
| 	e.out = append(e.out, strconv.FormatUint(n, 10)...) | ||||
| } | ||||
|  | ||||
| // WriteLiteral writes out the given string as a literal value without quotes. | ||||
| // This is used for writing enum literal strings. | ||||
| func (e *Encoder) WriteLiteral(s string) { | ||||
| 	e.prepareNext(scalar) | ||||
| 	e.out = append(e.out, s...) | ||||
| } | ||||
|  | ||||
| // prepareNext adds possible space and indentation for the next value based | ||||
| // on last encType and indent option. It also updates e.lastType to next. | ||||
| func (e *Encoder) prepareNext(next encType) { | ||||
| 	defer func() { | ||||
| 		e.lastType = next | ||||
| 	}() | ||||
|  | ||||
| 	// Single line. | ||||
| 	if len(e.indent) == 0 { | ||||
| 		// Add space after each field before the next one. | ||||
| 		if e.lastType&(scalar|messageClose) != 0 && next == name { | ||||
| 			e.out = append(e.out, ' ') | ||||
| 			// Add a random extra space to make output unstable. | ||||
| 			if detrand.Bool() { | ||||
| 				e.out = append(e.out, ' ') | ||||
| 			} | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// Multi-line. | ||||
| 	switch { | ||||
| 	case e.lastType == name: | ||||
| 		e.out = append(e.out, ' ') | ||||
| 		// Add a random extra space after name: to make output unstable. | ||||
| 		if detrand.Bool() { | ||||
| 			e.out = append(e.out, ' ') | ||||
| 		} | ||||
|  | ||||
| 	case e.lastType == messageOpen && next != messageClose: | ||||
| 		e.indents = append(e.indents, e.indent...) | ||||
| 		e.out = append(e.out, '\n') | ||||
| 		e.out = append(e.out, e.indents...) | ||||
|  | ||||
| 	case e.lastType&(scalar|messageClose) != 0: | ||||
| 		if next == messageClose { | ||||
| 			e.indents = e.indents[:len(e.indents)-len(e.indent)] | ||||
| 		} | ||||
| 		e.out = append(e.out, '\n') | ||||
| 		e.out = append(e.out, e.indents...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Snapshot returns the current snapshot for use in Reset. | ||||
| func (e *Encoder) Snapshot() encoderState { | ||||
| 	return e.encoderState | ||||
| } | ||||
|  | ||||
| // Reset resets the Encoder to the given encoderState from a Snapshot. | ||||
| func (e *Encoder) Reset(es encoderState) { | ||||
| 	e.encoderState = es | ||||
| } | ||||
|  | ||||
| // AppendString appends the escaped form of the input string to b. | ||||
| func AppendString(b []byte, s string) []byte { | ||||
| 	return appendString(b, s, false) | ||||
| } | ||||
							
								
								
									
										89
									
								
								vendor/google.golang.org/protobuf/internal/errors/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								vendor/google.golang.org/protobuf/internal/errors/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| // 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 errors implements functions to manipulate errors. | ||||
| package errors | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/detrand" | ||||
| ) | ||||
|  | ||||
| // Error is a sentinel matching all errors produced by this package. | ||||
| var Error = errors.New("protobuf error") | ||||
|  | ||||
| // New formats a string according to the format specifier and arguments and | ||||
| // returns an error that has a "proto" prefix. | ||||
| func New(f string, x ...interface{}) error { | ||||
| 	return &prefixError{s: format(f, x...)} | ||||
| } | ||||
|  | ||||
| type prefixError struct{ s string } | ||||
|  | ||||
| var prefix = func() string { | ||||
| 	// Deliberately introduce instability into the error message string to | ||||
| 	// discourage users from performing error string comparisons. | ||||
| 	if detrand.Bool() { | ||||
| 		return "proto: " // use non-breaking spaces (U+00a0) | ||||
| 	} else { | ||||
| 		return "proto: " // use regular spaces (U+0020) | ||||
| 	} | ||||
| }() | ||||
|  | ||||
| func (e *prefixError) Error() string { | ||||
| 	return prefix + e.s | ||||
| } | ||||
|  | ||||
| func (e *prefixError) Unwrap() error { | ||||
| 	return Error | ||||
| } | ||||
|  | ||||
| // Wrap returns an error that has a "proto" prefix, the formatted string described | ||||
| // by the format specifier and arguments, and a suffix of err. The error wraps err. | ||||
| func Wrap(err error, f string, x ...interface{}) error { | ||||
| 	return &wrapError{ | ||||
| 		s:   format(f, x...), | ||||
| 		err: err, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type wrapError struct { | ||||
| 	s   string | ||||
| 	err error | ||||
| } | ||||
|  | ||||
| func (e *wrapError) Error() string { | ||||
| 	return format("%v%v: %v", prefix, e.s, e.err) | ||||
| } | ||||
|  | ||||
| func (e *wrapError) Unwrap() error { | ||||
| 	return e.err | ||||
| } | ||||
|  | ||||
| func (e *wrapError) Is(target error) bool { | ||||
| 	return target == Error | ||||
| } | ||||
|  | ||||
| func format(f string, x ...interface{}) string { | ||||
| 	// avoid "proto: " prefix when chaining | ||||
| 	for i := 0; i < len(x); i++ { | ||||
| 		switch e := x[i].(type) { | ||||
| 		case *prefixError: | ||||
| 			x[i] = e.s | ||||
| 		case *wrapError: | ||||
| 			x[i] = format("%v: %v", e.s, e.err) | ||||
| 		} | ||||
| 	} | ||||
| 	return fmt.Sprintf(f, x...) | ||||
| } | ||||
|  | ||||
| func InvalidUTF8(name string) error { | ||||
| 	return New("field %v contains invalid UTF-8", name) | ||||
| } | ||||
|  | ||||
| func RequiredNotSet(name string) error { | ||||
| 	return New("required field %v not set", name) | ||||
| } | ||||
							
								
								
									
										40
									
								
								vendor/google.golang.org/protobuf/internal/errors/is_go112.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								vendor/google.golang.org/protobuf/internal/errors/is_go112.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| // Copyright 2020 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. | ||||
|  | ||||
| //go:build !go1.13 | ||||
| // +build !go1.13 | ||||
|  | ||||
| package errors | ||||
|  | ||||
| import "reflect" | ||||
|  | ||||
| // Is is a copy of Go 1.13's errors.Is for use with older Go versions. | ||||
| func Is(err, target error) bool { | ||||
| 	if target == nil { | ||||
| 		return err == target | ||||
| 	} | ||||
|  | ||||
| 	isComparable := reflect.TypeOf(target).Comparable() | ||||
| 	for { | ||||
| 		if isComparable && err == target { | ||||
| 			return true | ||||
| 		} | ||||
| 		if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) { | ||||
| 			return true | ||||
| 		} | ||||
| 		if err = unwrap(err); err == nil { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func unwrap(err error) error { | ||||
| 	u, ok := err.(interface { | ||||
| 		Unwrap() error | ||||
| 	}) | ||||
| 	if !ok { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return u.Unwrap() | ||||
| } | ||||
							
								
								
									
										13
									
								
								vendor/google.golang.org/protobuf/internal/errors/is_go113.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/google.golang.org/protobuf/internal/errors/is_go113.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| // Copyright 2020 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. | ||||
|  | ||||
| //go:build go1.13 | ||||
| // +build go1.13 | ||||
|  | ||||
| package errors | ||||
|  | ||||
| import "errors" | ||||
|  | ||||
| // Is is errors.Is. | ||||
| func Is(err, target error) bool { return errors.Is(err, target) } | ||||
							
								
								
									
										158
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/build.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/build.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,158 @@ | ||||
| // 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 filedesc provides functionality for constructing descriptors. | ||||
| // | ||||
| // The types in this package implement interfaces in the protoreflect package | ||||
| // related to protobuf descripriptors. | ||||
| package filedesc | ||||
|  | ||||
| import ( | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	preg "google.golang.org/protobuf/reflect/protoregistry" | ||||
| ) | ||||
|  | ||||
| // Builder construct a protoreflect.FileDescriptor from the raw descriptor. | ||||
| type Builder struct { | ||||
| 	// GoPackagePath is the Go package path that is invoking this builder. | ||||
| 	GoPackagePath string | ||||
|  | ||||
| 	// RawDescriptor is the wire-encoded bytes of FileDescriptorProto | ||||
| 	// and must be populated. | ||||
| 	RawDescriptor []byte | ||||
|  | ||||
| 	// NumEnums is the total number of enums declared in the file. | ||||
| 	NumEnums int32 | ||||
| 	// NumMessages is the total number of messages declared in the file. | ||||
| 	// It includes the implicit message declarations for map entries. | ||||
| 	NumMessages int32 | ||||
| 	// NumExtensions is the total number of extensions declared in the file. | ||||
| 	NumExtensions int32 | ||||
| 	// NumServices is the total number of services declared in the file. | ||||
| 	NumServices int32 | ||||
|  | ||||
| 	// TypeResolver resolves extension field types for descriptor options. | ||||
| 	// If nil, it uses protoregistry.GlobalTypes. | ||||
| 	TypeResolver interface { | ||||
| 		preg.ExtensionTypeResolver | ||||
| 	} | ||||
|  | ||||
| 	// FileRegistry is use to lookup file, enum, and message dependencies. | ||||
| 	// Once constructed, the file descriptor is registered here. | ||||
| 	// If nil, it uses protoregistry.GlobalFiles. | ||||
| 	FileRegistry interface { | ||||
| 		FindFileByPath(string) (protoreflect.FileDescriptor, error) | ||||
| 		FindDescriptorByName(pref.FullName) (pref.Descriptor, error) | ||||
| 		RegisterFile(pref.FileDescriptor) error | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // resolverByIndex is an interface Builder.FileRegistry may implement. | ||||
| // If so, it permits looking up an enum or message dependency based on the | ||||
| // sub-list and element index into filetype.Builder.DependencyIndexes. | ||||
| type resolverByIndex interface { | ||||
| 	FindEnumByIndex(int32, int32, []Enum, []Message) pref.EnumDescriptor | ||||
| 	FindMessageByIndex(int32, int32, []Enum, []Message) pref.MessageDescriptor | ||||
| } | ||||
|  | ||||
| // Indexes of each sub-list in filetype.Builder.DependencyIndexes. | ||||
| const ( | ||||
| 	listFieldDeps int32 = iota | ||||
| 	listExtTargets | ||||
| 	listExtDeps | ||||
| 	listMethInDeps | ||||
| 	listMethOutDeps | ||||
| ) | ||||
|  | ||||
| // Out is the output of the Builder. | ||||
| type Out struct { | ||||
| 	File pref.FileDescriptor | ||||
|  | ||||
| 	// Enums is all enum descriptors in "flattened ordering". | ||||
| 	Enums []Enum | ||||
| 	// Messages is all message descriptors in "flattened ordering". | ||||
| 	// It includes the implicit message declarations for map entries. | ||||
| 	Messages []Message | ||||
| 	// Extensions is all extension descriptors in "flattened ordering". | ||||
| 	Extensions []Extension | ||||
| 	// Service is all service descriptors in "flattened ordering". | ||||
| 	Services []Service | ||||
| } | ||||
|  | ||||
| // Build constructs a FileDescriptor given the parameters set in Builder. | ||||
| // It assumes that the inputs are well-formed and panics if any inconsistencies | ||||
| // are encountered. | ||||
| // | ||||
| // If NumEnums+NumMessages+NumExtensions+NumServices is zero, | ||||
| // then Build automatically derives them from the raw descriptor. | ||||
| func (db Builder) Build() (out Out) { | ||||
| 	// Populate the counts if uninitialized. | ||||
| 	if db.NumEnums+db.NumMessages+db.NumExtensions+db.NumServices == 0 { | ||||
| 		db.unmarshalCounts(db.RawDescriptor, true) | ||||
| 	} | ||||
|  | ||||
| 	// Initialize resolvers and registries if unpopulated. | ||||
| 	if db.TypeResolver == nil { | ||||
| 		db.TypeResolver = preg.GlobalTypes | ||||
| 	} | ||||
| 	if db.FileRegistry == nil { | ||||
| 		db.FileRegistry = preg.GlobalFiles | ||||
| 	} | ||||
|  | ||||
| 	fd := newRawFile(db) | ||||
| 	out.File = fd | ||||
| 	out.Enums = fd.allEnums | ||||
| 	out.Messages = fd.allMessages | ||||
| 	out.Extensions = fd.allExtensions | ||||
| 	out.Services = fd.allServices | ||||
|  | ||||
| 	if err := db.FileRegistry.RegisterFile(fd); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return out | ||||
| } | ||||
|  | ||||
| // unmarshalCounts counts the number of enum, message, extension, and service | ||||
| // declarations in the raw message, which is either a FileDescriptorProto | ||||
| // or a MessageDescriptorProto depending on whether isFile is set. | ||||
| func (db *Builder) unmarshalCounts(b []byte, isFile bool) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			if isFile { | ||||
| 				switch num { | ||||
| 				case genid.FileDescriptorProto_EnumType_field_number: | ||||
| 					db.NumEnums++ | ||||
| 				case genid.FileDescriptorProto_MessageType_field_number: | ||||
| 					db.unmarshalCounts(v, false) | ||||
| 					db.NumMessages++ | ||||
| 				case genid.FileDescriptorProto_Extension_field_number: | ||||
| 					db.NumExtensions++ | ||||
| 				case genid.FileDescriptorProto_Service_field_number: | ||||
| 					db.NumServices++ | ||||
| 				} | ||||
| 			} else { | ||||
| 				switch num { | ||||
| 				case genid.DescriptorProto_EnumType_field_number: | ||||
| 					db.NumEnums++ | ||||
| 				case genid.DescriptorProto_NestedType_field_number: | ||||
| 					db.unmarshalCounts(v, false) | ||||
| 					db.NumMessages++ | ||||
| 				case genid.DescriptorProto_Extension_field_number: | ||||
| 					db.NumExtensions++ | ||||
| 				} | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										631
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										631
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,631 @@ | ||||
| // 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 filedesc | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"sync" | ||||
| 	"sync/atomic" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/descfmt" | ||||
| 	"google.golang.org/protobuf/internal/descopts" | ||||
| 	"google.golang.org/protobuf/internal/encoding/defval" | ||||
| 	"google.golang.org/protobuf/internal/encoding/messageset" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	"google.golang.org/protobuf/reflect/protoregistry" | ||||
| ) | ||||
|  | ||||
| // The types in this file may have a suffix: | ||||
| //	• L0: Contains fields common to all descriptors (except File) and | ||||
| //	must be initialized up front. | ||||
| //	• L1: Contains fields specific to a descriptor and | ||||
| //	must be initialized up front. | ||||
| //	• L2: Contains fields that are lazily initialized when constructing | ||||
| //	from the raw file descriptor. When constructing as a literal, the L2 | ||||
| //	fields must be initialized up front. | ||||
| // | ||||
| // The types are exported so that packages like reflect/protodesc can | ||||
| // directly construct descriptors. | ||||
|  | ||||
| type ( | ||||
| 	File struct { | ||||
| 		fileRaw | ||||
| 		L1 FileL1 | ||||
|  | ||||
| 		once uint32     // atomically set if L2 is valid | ||||
| 		mu   sync.Mutex // protects L2 | ||||
| 		L2   *FileL2 | ||||
| 	} | ||||
| 	FileL1 struct { | ||||
| 		Syntax  pref.Syntax | ||||
| 		Path    string | ||||
| 		Package pref.FullName | ||||
|  | ||||
| 		Enums      Enums | ||||
| 		Messages   Messages | ||||
| 		Extensions Extensions | ||||
| 		Services   Services | ||||
| 	} | ||||
| 	FileL2 struct { | ||||
| 		Options   func() pref.ProtoMessage | ||||
| 		Imports   FileImports | ||||
| 		Locations SourceLocations | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (fd *File) ParentFile() pref.FileDescriptor { return fd } | ||||
| func (fd *File) Parent() pref.Descriptor         { return nil } | ||||
| func (fd *File) Index() int                      { return 0 } | ||||
| func (fd *File) Syntax() pref.Syntax             { return fd.L1.Syntax } | ||||
| func (fd *File) Name() pref.Name                 { return fd.L1.Package.Name() } | ||||
| func (fd *File) FullName() pref.FullName         { return fd.L1.Package } | ||||
| func (fd *File) IsPlaceholder() bool             { return false } | ||||
| func (fd *File) Options() pref.ProtoMessage { | ||||
| 	if f := fd.lazyInit().Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.File | ||||
| } | ||||
| func (fd *File) Path() string                          { return fd.L1.Path } | ||||
| func (fd *File) Package() pref.FullName                { return fd.L1.Package } | ||||
| func (fd *File) Imports() pref.FileImports             { return &fd.lazyInit().Imports } | ||||
| func (fd *File) Enums() pref.EnumDescriptors           { return &fd.L1.Enums } | ||||
| func (fd *File) Messages() pref.MessageDescriptors     { return &fd.L1.Messages } | ||||
| func (fd *File) Extensions() pref.ExtensionDescriptors { return &fd.L1.Extensions } | ||||
| func (fd *File) Services() pref.ServiceDescriptors     { return &fd.L1.Services } | ||||
| func (fd *File) SourceLocations() pref.SourceLocations { return &fd.lazyInit().Locations } | ||||
| func (fd *File) Format(s fmt.State, r rune)            { descfmt.FormatDesc(s, r, fd) } | ||||
| func (fd *File) ProtoType(pref.FileDescriptor)         {} | ||||
| func (fd *File) ProtoInternal(pragma.DoNotImplement)   {} | ||||
|  | ||||
| func (fd *File) lazyInit() *FileL2 { | ||||
| 	if atomic.LoadUint32(&fd.once) == 0 { | ||||
| 		fd.lazyInitOnce() | ||||
| 	} | ||||
| 	return fd.L2 | ||||
| } | ||||
|  | ||||
| func (fd *File) lazyInitOnce() { | ||||
| 	fd.mu.Lock() | ||||
| 	if fd.L2 == nil { | ||||
| 		fd.lazyRawInit() // recursively initializes all L2 structures | ||||
| 	} | ||||
| 	atomic.StoreUint32(&fd.once, 1) | ||||
| 	fd.mu.Unlock() | ||||
| } | ||||
|  | ||||
| // GoPackagePath is a pseudo-internal API for determining the Go package path | ||||
| // that this file descriptor is declared in. | ||||
| // | ||||
| // WARNING: This method is exempt from the compatibility promise and may be | ||||
| // removed in the future without warning. | ||||
| func (fd *File) GoPackagePath() string { | ||||
| 	return fd.builder.GoPackagePath | ||||
| } | ||||
|  | ||||
| type ( | ||||
| 	Enum struct { | ||||
| 		Base | ||||
| 		L1 EnumL1 | ||||
| 		L2 *EnumL2 // protected by fileDesc.once | ||||
| 	} | ||||
| 	EnumL1 struct { | ||||
| 		eagerValues bool // controls whether EnumL2.Values is already populated | ||||
| 	} | ||||
| 	EnumL2 struct { | ||||
| 		Options        func() pref.ProtoMessage | ||||
| 		Values         EnumValues | ||||
| 		ReservedNames  Names | ||||
| 		ReservedRanges EnumRanges | ||||
| 	} | ||||
|  | ||||
| 	EnumValue struct { | ||||
| 		Base | ||||
| 		L1 EnumValueL1 | ||||
| 	} | ||||
| 	EnumValueL1 struct { | ||||
| 		Options func() pref.ProtoMessage | ||||
| 		Number  pref.EnumNumber | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (ed *Enum) Options() pref.ProtoMessage { | ||||
| 	if f := ed.lazyInit().Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Enum | ||||
| } | ||||
| func (ed *Enum) Values() pref.EnumValueDescriptors { | ||||
| 	if ed.L1.eagerValues { | ||||
| 		return &ed.L2.Values | ||||
| 	} | ||||
| 	return &ed.lazyInit().Values | ||||
| } | ||||
| func (ed *Enum) ReservedNames() pref.Names       { return &ed.lazyInit().ReservedNames } | ||||
| func (ed *Enum) ReservedRanges() pref.EnumRanges { return &ed.lazyInit().ReservedRanges } | ||||
| func (ed *Enum) Format(s fmt.State, r rune)      { descfmt.FormatDesc(s, r, ed) } | ||||
| func (ed *Enum) ProtoType(pref.EnumDescriptor)   {} | ||||
| func (ed *Enum) lazyInit() *EnumL2 { | ||||
| 	ed.L0.ParentFile.lazyInit() // implicitly initializes L2 | ||||
| 	return ed.L2 | ||||
| } | ||||
|  | ||||
| func (ed *EnumValue) Options() pref.ProtoMessage { | ||||
| 	if f := ed.L1.Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.EnumValue | ||||
| } | ||||
| func (ed *EnumValue) Number() pref.EnumNumber            { return ed.L1.Number } | ||||
| func (ed *EnumValue) Format(s fmt.State, r rune)         { descfmt.FormatDesc(s, r, ed) } | ||||
| func (ed *EnumValue) ProtoType(pref.EnumValueDescriptor) {} | ||||
|  | ||||
| type ( | ||||
| 	Message struct { | ||||
| 		Base | ||||
| 		L1 MessageL1 | ||||
| 		L2 *MessageL2 // protected by fileDesc.once | ||||
| 	} | ||||
| 	MessageL1 struct { | ||||
| 		Enums        Enums | ||||
| 		Messages     Messages | ||||
| 		Extensions   Extensions | ||||
| 		IsMapEntry   bool // promoted from google.protobuf.MessageOptions | ||||
| 		IsMessageSet bool // promoted from google.protobuf.MessageOptions | ||||
| 	} | ||||
| 	MessageL2 struct { | ||||
| 		Options               func() pref.ProtoMessage | ||||
| 		Fields                Fields | ||||
| 		Oneofs                Oneofs | ||||
| 		ReservedNames         Names | ||||
| 		ReservedRanges        FieldRanges | ||||
| 		RequiredNumbers       FieldNumbers // must be consistent with Fields.Cardinality | ||||
| 		ExtensionRanges       FieldRanges | ||||
| 		ExtensionRangeOptions []func() pref.ProtoMessage // must be same length as ExtensionRanges | ||||
| 	} | ||||
|  | ||||
| 	Field struct { | ||||
| 		Base | ||||
| 		L1 FieldL1 | ||||
| 	} | ||||
| 	FieldL1 struct { | ||||
| 		Options          func() pref.ProtoMessage | ||||
| 		Number           pref.FieldNumber | ||||
| 		Cardinality      pref.Cardinality // must be consistent with Message.RequiredNumbers | ||||
| 		Kind             pref.Kind | ||||
| 		StringName       stringName | ||||
| 		IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto | ||||
| 		IsWeak           bool // promoted from google.protobuf.FieldOptions | ||||
| 		HasPacked        bool // promoted from google.protobuf.FieldOptions | ||||
| 		IsPacked         bool // promoted from google.protobuf.FieldOptions | ||||
| 		HasEnforceUTF8   bool // promoted from google.protobuf.FieldOptions | ||||
| 		EnforceUTF8      bool // promoted from google.protobuf.FieldOptions | ||||
| 		Default          defaultValue | ||||
| 		ContainingOneof  pref.OneofDescriptor // must be consistent with Message.Oneofs.Fields | ||||
| 		Enum             pref.EnumDescriptor | ||||
| 		Message          pref.MessageDescriptor | ||||
| 	} | ||||
|  | ||||
| 	Oneof struct { | ||||
| 		Base | ||||
| 		L1 OneofL1 | ||||
| 	} | ||||
| 	OneofL1 struct { | ||||
| 		Options func() pref.ProtoMessage | ||||
| 		Fields  OneofFields // must be consistent with Message.Fields.ContainingOneof | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (md *Message) Options() pref.ProtoMessage { | ||||
| 	if f := md.lazyInit().Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Message | ||||
| } | ||||
| func (md *Message) IsMapEntry() bool                   { return md.L1.IsMapEntry } | ||||
| func (md *Message) Fields() pref.FieldDescriptors      { return &md.lazyInit().Fields } | ||||
| func (md *Message) Oneofs() pref.OneofDescriptors      { return &md.lazyInit().Oneofs } | ||||
| func (md *Message) ReservedNames() pref.Names          { return &md.lazyInit().ReservedNames } | ||||
| func (md *Message) ReservedRanges() pref.FieldRanges   { return &md.lazyInit().ReservedRanges } | ||||
| func (md *Message) RequiredNumbers() pref.FieldNumbers { return &md.lazyInit().RequiredNumbers } | ||||
| func (md *Message) ExtensionRanges() pref.FieldRanges  { return &md.lazyInit().ExtensionRanges } | ||||
| func (md *Message) ExtensionRangeOptions(i int) pref.ProtoMessage { | ||||
| 	if f := md.lazyInit().ExtensionRangeOptions[i]; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.ExtensionRange | ||||
| } | ||||
| func (md *Message) Enums() pref.EnumDescriptors           { return &md.L1.Enums } | ||||
| func (md *Message) Messages() pref.MessageDescriptors     { return &md.L1.Messages } | ||||
| func (md *Message) Extensions() pref.ExtensionDescriptors { return &md.L1.Extensions } | ||||
| func (md *Message) ProtoType(pref.MessageDescriptor)      {} | ||||
| func (md *Message) Format(s fmt.State, r rune)            { descfmt.FormatDesc(s, r, md) } | ||||
| func (md *Message) lazyInit() *MessageL2 { | ||||
| 	md.L0.ParentFile.lazyInit() // implicitly initializes L2 | ||||
| 	return md.L2 | ||||
| } | ||||
|  | ||||
| // IsMessageSet is a pseudo-internal API for checking whether a message | ||||
| // should serialize in the proto1 message format. | ||||
| // | ||||
| // WARNING: This method is exempt from the compatibility promise and may be | ||||
| // removed in the future without warning. | ||||
| func (md *Message) IsMessageSet() bool { | ||||
| 	return md.L1.IsMessageSet | ||||
| } | ||||
|  | ||||
| func (fd *Field) Options() pref.ProtoMessage { | ||||
| 	if f := fd.L1.Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Field | ||||
| } | ||||
| func (fd *Field) Number() pref.FieldNumber      { return fd.L1.Number } | ||||
| func (fd *Field) Cardinality() pref.Cardinality { return fd.L1.Cardinality } | ||||
| func (fd *Field) Kind() pref.Kind               { return fd.L1.Kind } | ||||
| func (fd *Field) HasJSONName() bool             { return fd.L1.StringName.hasJSON } | ||||
| func (fd *Field) JSONName() string              { return fd.L1.StringName.getJSON(fd) } | ||||
| func (fd *Field) TextName() string              { return fd.L1.StringName.getText(fd) } | ||||
| func (fd *Field) HasPresence() bool { | ||||
| 	return fd.L1.Cardinality != pref.Repeated && (fd.L0.ParentFile.L1.Syntax == pref.Proto2 || fd.L1.Message != nil || fd.L1.ContainingOneof != nil) | ||||
| } | ||||
| func (fd *Field) HasOptionalKeyword() bool { | ||||
| 	return (fd.L0.ParentFile.L1.Syntax == pref.Proto2 && fd.L1.Cardinality == pref.Optional && fd.L1.ContainingOneof == nil) || fd.L1.IsProto3Optional | ||||
| } | ||||
| func (fd *Field) IsPacked() bool { | ||||
| 	if !fd.L1.HasPacked && fd.L0.ParentFile.L1.Syntax != pref.Proto2 && fd.L1.Cardinality == pref.Repeated { | ||||
| 		switch fd.L1.Kind { | ||||
| 		case pref.StringKind, pref.BytesKind, pref.MessageKind, pref.GroupKind: | ||||
| 		default: | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return fd.L1.IsPacked | ||||
| } | ||||
| func (fd *Field) IsExtension() bool { return false } | ||||
| func (fd *Field) IsWeak() bool      { return fd.L1.IsWeak } | ||||
| func (fd *Field) IsList() bool      { return fd.Cardinality() == pref.Repeated && !fd.IsMap() } | ||||
| func (fd *Field) IsMap() bool       { return fd.Message() != nil && fd.Message().IsMapEntry() } | ||||
| func (fd *Field) MapKey() pref.FieldDescriptor { | ||||
| 	if !fd.IsMap() { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return fd.Message().Fields().ByNumber(genid.MapEntry_Key_field_number) | ||||
| } | ||||
| func (fd *Field) MapValue() pref.FieldDescriptor { | ||||
| 	if !fd.IsMap() { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return fd.Message().Fields().ByNumber(genid.MapEntry_Value_field_number) | ||||
| } | ||||
| func (fd *Field) HasDefault() bool                           { return fd.L1.Default.has } | ||||
| func (fd *Field) Default() pref.Value                        { return fd.L1.Default.get(fd) } | ||||
| func (fd *Field) DefaultEnumValue() pref.EnumValueDescriptor { return fd.L1.Default.enum } | ||||
| func (fd *Field) ContainingOneof() pref.OneofDescriptor      { return fd.L1.ContainingOneof } | ||||
| func (fd *Field) ContainingMessage() pref.MessageDescriptor { | ||||
| 	return fd.L0.Parent.(pref.MessageDescriptor) | ||||
| } | ||||
| func (fd *Field) Enum() pref.EnumDescriptor { | ||||
| 	return fd.L1.Enum | ||||
| } | ||||
| func (fd *Field) Message() pref.MessageDescriptor { | ||||
| 	if fd.L1.IsWeak { | ||||
| 		if d, _ := protoregistry.GlobalFiles.FindDescriptorByName(fd.L1.Message.FullName()); d != nil { | ||||
| 			return d.(pref.MessageDescriptor) | ||||
| 		} | ||||
| 	} | ||||
| 	return fd.L1.Message | ||||
| } | ||||
| func (fd *Field) Format(s fmt.State, r rune)     { descfmt.FormatDesc(s, r, fd) } | ||||
| func (fd *Field) ProtoType(pref.FieldDescriptor) {} | ||||
|  | ||||
| // EnforceUTF8 is a pseudo-internal API to determine whether to enforce UTF-8 | ||||
| // validation for the string field. This exists for Google-internal use only | ||||
| // since proto3 did not enforce UTF-8 validity prior to the open-source release. | ||||
| // If this method does not exist, the default is to enforce valid UTF-8. | ||||
| // | ||||
| // WARNING: This method is exempt from the compatibility promise and may be | ||||
| // removed in the future without warning. | ||||
| func (fd *Field) EnforceUTF8() bool { | ||||
| 	if fd.L1.HasEnforceUTF8 { | ||||
| 		return fd.L1.EnforceUTF8 | ||||
| 	} | ||||
| 	return fd.L0.ParentFile.L1.Syntax == pref.Proto3 | ||||
| } | ||||
|  | ||||
| func (od *Oneof) IsSynthetic() bool { | ||||
| 	return od.L0.ParentFile.L1.Syntax == pref.Proto3 && len(od.L1.Fields.List) == 1 && od.L1.Fields.List[0].HasOptionalKeyword() | ||||
| } | ||||
| func (od *Oneof) Options() pref.ProtoMessage { | ||||
| 	if f := od.L1.Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Oneof | ||||
| } | ||||
| func (od *Oneof) Fields() pref.FieldDescriptors  { return &od.L1.Fields } | ||||
| func (od *Oneof) Format(s fmt.State, r rune)     { descfmt.FormatDesc(s, r, od) } | ||||
| func (od *Oneof) ProtoType(pref.OneofDescriptor) {} | ||||
|  | ||||
| type ( | ||||
| 	Extension struct { | ||||
| 		Base | ||||
| 		L1 ExtensionL1 | ||||
| 		L2 *ExtensionL2 // protected by fileDesc.once | ||||
| 	} | ||||
| 	ExtensionL1 struct { | ||||
| 		Number      pref.FieldNumber | ||||
| 		Extendee    pref.MessageDescriptor | ||||
| 		Cardinality pref.Cardinality | ||||
| 		Kind        pref.Kind | ||||
| 	} | ||||
| 	ExtensionL2 struct { | ||||
| 		Options          func() pref.ProtoMessage | ||||
| 		StringName       stringName | ||||
| 		IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto | ||||
| 		IsPacked         bool // promoted from google.protobuf.FieldOptions | ||||
| 		Default          defaultValue | ||||
| 		Enum             pref.EnumDescriptor | ||||
| 		Message          pref.MessageDescriptor | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (xd *Extension) Options() pref.ProtoMessage { | ||||
| 	if f := xd.lazyInit().Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Field | ||||
| } | ||||
| func (xd *Extension) Number() pref.FieldNumber      { return xd.L1.Number } | ||||
| func (xd *Extension) Cardinality() pref.Cardinality { return xd.L1.Cardinality } | ||||
| func (xd *Extension) Kind() pref.Kind               { return xd.L1.Kind } | ||||
| func (xd *Extension) HasJSONName() bool             { return xd.lazyInit().StringName.hasJSON } | ||||
| func (xd *Extension) JSONName() string              { return xd.lazyInit().StringName.getJSON(xd) } | ||||
| func (xd *Extension) TextName() string              { return xd.lazyInit().StringName.getText(xd) } | ||||
| func (xd *Extension) HasPresence() bool             { return xd.L1.Cardinality != pref.Repeated } | ||||
| func (xd *Extension) HasOptionalKeyword() bool { | ||||
| 	return (xd.L0.ParentFile.L1.Syntax == pref.Proto2 && xd.L1.Cardinality == pref.Optional) || xd.lazyInit().IsProto3Optional | ||||
| } | ||||
| func (xd *Extension) IsPacked() bool                             { return xd.lazyInit().IsPacked } | ||||
| func (xd *Extension) IsExtension() bool                          { return true } | ||||
| func (xd *Extension) IsWeak() bool                               { return false } | ||||
| func (xd *Extension) IsList() bool                               { return xd.Cardinality() == pref.Repeated } | ||||
| func (xd *Extension) IsMap() bool                                { return false } | ||||
| func (xd *Extension) MapKey() pref.FieldDescriptor               { return nil } | ||||
| func (xd *Extension) MapValue() pref.FieldDescriptor             { return nil } | ||||
| func (xd *Extension) HasDefault() bool                           { return xd.lazyInit().Default.has } | ||||
| func (xd *Extension) Default() pref.Value                        { return xd.lazyInit().Default.get(xd) } | ||||
| func (xd *Extension) DefaultEnumValue() pref.EnumValueDescriptor { return xd.lazyInit().Default.enum } | ||||
| func (xd *Extension) ContainingOneof() pref.OneofDescriptor      { return nil } | ||||
| func (xd *Extension) ContainingMessage() pref.MessageDescriptor  { return xd.L1.Extendee } | ||||
| func (xd *Extension) Enum() pref.EnumDescriptor                  { return xd.lazyInit().Enum } | ||||
| func (xd *Extension) Message() pref.MessageDescriptor            { return xd.lazyInit().Message } | ||||
| func (xd *Extension) Format(s fmt.State, r rune)                 { descfmt.FormatDesc(s, r, xd) } | ||||
| func (xd *Extension) ProtoType(pref.FieldDescriptor)             {} | ||||
| func (xd *Extension) ProtoInternal(pragma.DoNotImplement)        {} | ||||
| func (xd *Extension) lazyInit() *ExtensionL2 { | ||||
| 	xd.L0.ParentFile.lazyInit() // implicitly initializes L2 | ||||
| 	return xd.L2 | ||||
| } | ||||
|  | ||||
| type ( | ||||
| 	Service struct { | ||||
| 		Base | ||||
| 		L1 ServiceL1 | ||||
| 		L2 *ServiceL2 // protected by fileDesc.once | ||||
| 	} | ||||
| 	ServiceL1 struct{} | ||||
| 	ServiceL2 struct { | ||||
| 		Options func() pref.ProtoMessage | ||||
| 		Methods Methods | ||||
| 	} | ||||
|  | ||||
| 	Method struct { | ||||
| 		Base | ||||
| 		L1 MethodL1 | ||||
| 	} | ||||
| 	MethodL1 struct { | ||||
| 		Options           func() pref.ProtoMessage | ||||
| 		Input             pref.MessageDescriptor | ||||
| 		Output            pref.MessageDescriptor | ||||
| 		IsStreamingClient bool | ||||
| 		IsStreamingServer bool | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (sd *Service) Options() pref.ProtoMessage { | ||||
| 	if f := sd.lazyInit().Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Service | ||||
| } | ||||
| func (sd *Service) Methods() pref.MethodDescriptors     { return &sd.lazyInit().Methods } | ||||
| func (sd *Service) Format(s fmt.State, r rune)          { descfmt.FormatDesc(s, r, sd) } | ||||
| func (sd *Service) ProtoType(pref.ServiceDescriptor)    {} | ||||
| func (sd *Service) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (sd *Service) lazyInit() *ServiceL2 { | ||||
| 	sd.L0.ParentFile.lazyInit() // implicitly initializes L2 | ||||
| 	return sd.L2 | ||||
| } | ||||
|  | ||||
| func (md *Method) Options() pref.ProtoMessage { | ||||
| 	if f := md.L1.Options; f != nil { | ||||
| 		return f() | ||||
| 	} | ||||
| 	return descopts.Method | ||||
| } | ||||
| func (md *Method) Input() pref.MessageDescriptor       { return md.L1.Input } | ||||
| func (md *Method) Output() pref.MessageDescriptor      { return md.L1.Output } | ||||
| func (md *Method) IsStreamingClient() bool             { return md.L1.IsStreamingClient } | ||||
| func (md *Method) IsStreamingServer() bool             { return md.L1.IsStreamingServer } | ||||
| func (md *Method) Format(s fmt.State, r rune)          { descfmt.FormatDesc(s, r, md) } | ||||
| func (md *Method) ProtoType(pref.MethodDescriptor)     {} | ||||
| func (md *Method) ProtoInternal(pragma.DoNotImplement) {} | ||||
|  | ||||
| // Surrogate files are can be used to create standalone descriptors | ||||
| // where the syntax is only information derived from the parent file. | ||||
| var ( | ||||
| 	SurrogateProto2 = &File{L1: FileL1{Syntax: pref.Proto2}, L2: &FileL2{}} | ||||
| 	SurrogateProto3 = &File{L1: FileL1{Syntax: pref.Proto3}, L2: &FileL2{}} | ||||
| ) | ||||
|  | ||||
| type ( | ||||
| 	Base struct { | ||||
| 		L0 BaseL0 | ||||
| 	} | ||||
| 	BaseL0 struct { | ||||
| 		FullName   pref.FullName // must be populated | ||||
| 		ParentFile *File         // must be populated | ||||
| 		Parent     pref.Descriptor | ||||
| 		Index      int | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (d *Base) Name() pref.Name         { return d.L0.FullName.Name() } | ||||
| func (d *Base) FullName() pref.FullName { return d.L0.FullName } | ||||
| func (d *Base) ParentFile() pref.FileDescriptor { | ||||
| 	if d.L0.ParentFile == SurrogateProto2 || d.L0.ParentFile == SurrogateProto3 { | ||||
| 		return nil // surrogate files are not real parents | ||||
| 	} | ||||
| 	return d.L0.ParentFile | ||||
| } | ||||
| func (d *Base) Parent() pref.Descriptor             { return d.L0.Parent } | ||||
| func (d *Base) Index() int                          { return d.L0.Index } | ||||
| func (d *Base) Syntax() pref.Syntax                 { return d.L0.ParentFile.Syntax() } | ||||
| func (d *Base) IsPlaceholder() bool                 { return false } | ||||
| func (d *Base) ProtoInternal(pragma.DoNotImplement) {} | ||||
|  | ||||
| type stringName struct { | ||||
| 	hasJSON  bool | ||||
| 	once     sync.Once | ||||
| 	nameJSON string | ||||
| 	nameText string | ||||
| } | ||||
|  | ||||
| // InitJSON initializes the name. It is exported for use by other internal packages. | ||||
| func (s *stringName) InitJSON(name string) { | ||||
| 	s.hasJSON = true | ||||
| 	s.nameJSON = name | ||||
| } | ||||
|  | ||||
| func (s *stringName) lazyInit(fd pref.FieldDescriptor) *stringName { | ||||
| 	s.once.Do(func() { | ||||
| 		if fd.IsExtension() { | ||||
| 			// For extensions, JSON and text are formatted the same way. | ||||
| 			var name string | ||||
| 			if messageset.IsMessageSetExtension(fd) { | ||||
| 				name = string("[" + fd.FullName().Parent() + "]") | ||||
| 			} else { | ||||
| 				name = string("[" + fd.FullName() + "]") | ||||
| 			} | ||||
| 			s.nameJSON = name | ||||
| 			s.nameText = name | ||||
| 		} else { | ||||
| 			// Format the JSON name. | ||||
| 			if !s.hasJSON { | ||||
| 				s.nameJSON = strs.JSONCamelCase(string(fd.Name())) | ||||
| 			} | ||||
|  | ||||
| 			// Format the text name. | ||||
| 			s.nameText = string(fd.Name()) | ||||
| 			if fd.Kind() == pref.GroupKind { | ||||
| 				s.nameText = string(fd.Message().Name()) | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| func (s *stringName) getJSON(fd pref.FieldDescriptor) string { return s.lazyInit(fd).nameJSON } | ||||
| func (s *stringName) getText(fd pref.FieldDescriptor) string { return s.lazyInit(fd).nameText } | ||||
|  | ||||
| func DefaultValue(v pref.Value, ev pref.EnumValueDescriptor) defaultValue { | ||||
| 	dv := defaultValue{has: v.IsValid(), val: v, enum: ev} | ||||
| 	if b, ok := v.Interface().([]byte); ok { | ||||
| 		// Store a copy of the default bytes, so that we can detect | ||||
| 		// accidental mutations of the original value. | ||||
| 		dv.bytes = append([]byte(nil), b...) | ||||
| 	} | ||||
| 	return dv | ||||
| } | ||||
|  | ||||
| func unmarshalDefault(b []byte, k pref.Kind, pf *File, ed pref.EnumDescriptor) defaultValue { | ||||
| 	var evs pref.EnumValueDescriptors | ||||
| 	if k == pref.EnumKind { | ||||
| 		// If the enum is declared within the same file, be careful not to | ||||
| 		// blindly call the Values method, lest we bind ourselves in a deadlock. | ||||
| 		if e, ok := ed.(*Enum); ok && e.L0.ParentFile == pf { | ||||
| 			evs = &e.L2.Values | ||||
| 		} else { | ||||
| 			evs = ed.Values() | ||||
| 		} | ||||
|  | ||||
| 		// If we are unable to resolve the enum dependency, use a placeholder | ||||
| 		// enum value since we will not be able to parse the default value. | ||||
| 		if ed.IsPlaceholder() && pref.Name(b).IsValid() { | ||||
| 			v := pref.ValueOfEnum(0) | ||||
| 			ev := PlaceholderEnumValue(ed.FullName().Parent().Append(pref.Name(b))) | ||||
| 			return DefaultValue(v, ev) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	v, ev, err := defval.Unmarshal(string(b), k, evs, defval.Descriptor) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return DefaultValue(v, ev) | ||||
| } | ||||
|  | ||||
| type defaultValue struct { | ||||
| 	has   bool | ||||
| 	val   pref.Value | ||||
| 	enum  pref.EnumValueDescriptor | ||||
| 	bytes []byte | ||||
| } | ||||
|  | ||||
| func (dv *defaultValue) get(fd pref.FieldDescriptor) pref.Value { | ||||
| 	// Return the zero value as the default if unpopulated. | ||||
| 	if !dv.has { | ||||
| 		if fd.Cardinality() == pref.Repeated { | ||||
| 			return pref.Value{} | ||||
| 		} | ||||
| 		switch fd.Kind() { | ||||
| 		case pref.BoolKind: | ||||
| 			return pref.ValueOfBool(false) | ||||
| 		case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: | ||||
| 			return pref.ValueOfInt32(0) | ||||
| 		case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: | ||||
| 			return pref.ValueOfInt64(0) | ||||
| 		case pref.Uint32Kind, pref.Fixed32Kind: | ||||
| 			return pref.ValueOfUint32(0) | ||||
| 		case pref.Uint64Kind, pref.Fixed64Kind: | ||||
| 			return pref.ValueOfUint64(0) | ||||
| 		case pref.FloatKind: | ||||
| 			return pref.ValueOfFloat32(0) | ||||
| 		case pref.DoubleKind: | ||||
| 			return pref.ValueOfFloat64(0) | ||||
| 		case pref.StringKind: | ||||
| 			return pref.ValueOfString("") | ||||
| 		case pref.BytesKind: | ||||
| 			return pref.ValueOfBytes(nil) | ||||
| 		case pref.EnumKind: | ||||
| 			if evs := fd.Enum().Values(); evs.Len() > 0 { | ||||
| 				return pref.ValueOfEnum(evs.Get(0).Number()) | ||||
| 			} | ||||
| 			return pref.ValueOfEnum(0) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if len(dv.bytes) > 0 && !bytes.Equal(dv.bytes, dv.val.Bytes()) { | ||||
| 		// TODO: Avoid panic if we're running with the race detector | ||||
| 		// and instead spawn a goroutine that periodically resets | ||||
| 		// this value back to the original to induce a race. | ||||
| 		panic(fmt.Sprintf("detected mutation on the default bytes for %v", fd.FullName())) | ||||
| 	} | ||||
| 	return dv.val | ||||
| } | ||||
							
								
								
									
										471
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										471
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,471 @@ | ||||
| // 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 filedesc | ||||
|  | ||||
| import ( | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| // fileRaw is a data struct used when initializing a file descriptor from | ||||
| // a raw FileDescriptorProto. | ||||
| type fileRaw struct { | ||||
| 	builder       Builder | ||||
| 	allEnums      []Enum | ||||
| 	allMessages   []Message | ||||
| 	allExtensions []Extension | ||||
| 	allServices   []Service | ||||
| } | ||||
|  | ||||
| func newRawFile(db Builder) *File { | ||||
| 	fd := &File{fileRaw: fileRaw{builder: db}} | ||||
| 	fd.initDecls(db.NumEnums, db.NumMessages, db.NumExtensions, db.NumServices) | ||||
| 	fd.unmarshalSeed(db.RawDescriptor) | ||||
|  | ||||
| 	// Extended message targets are eagerly resolved since registration | ||||
| 	// needs this information at program init time. | ||||
| 	for i := range fd.allExtensions { | ||||
| 		xd := &fd.allExtensions[i] | ||||
| 		xd.L1.Extendee = fd.resolveMessageDependency(xd.L1.Extendee, listExtTargets, int32(i)) | ||||
| 	} | ||||
|  | ||||
| 	fd.checkDecls() | ||||
| 	return fd | ||||
| } | ||||
|  | ||||
| // initDecls pre-allocates slices for the exact number of enums, messages | ||||
| // (including map entries), extensions, and services declared in the proto file. | ||||
| // This is done to avoid regrowing the slice, which would change the address | ||||
| // for any previously seen declaration. | ||||
| // | ||||
| // The alloc methods "allocates" slices by pulling from the capacity. | ||||
| func (fd *File) initDecls(numEnums, numMessages, numExtensions, numServices int32) { | ||||
| 	fd.allEnums = make([]Enum, 0, numEnums) | ||||
| 	fd.allMessages = make([]Message, 0, numMessages) | ||||
| 	fd.allExtensions = make([]Extension, 0, numExtensions) | ||||
| 	fd.allServices = make([]Service, 0, numServices) | ||||
| } | ||||
|  | ||||
| func (fd *File) allocEnums(n int) []Enum { | ||||
| 	total := len(fd.allEnums) | ||||
| 	es := fd.allEnums[total : total+n] | ||||
| 	fd.allEnums = fd.allEnums[:total+n] | ||||
| 	return es | ||||
| } | ||||
| func (fd *File) allocMessages(n int) []Message { | ||||
| 	total := len(fd.allMessages) | ||||
| 	ms := fd.allMessages[total : total+n] | ||||
| 	fd.allMessages = fd.allMessages[:total+n] | ||||
| 	return ms | ||||
| } | ||||
| func (fd *File) allocExtensions(n int) []Extension { | ||||
| 	total := len(fd.allExtensions) | ||||
| 	xs := fd.allExtensions[total : total+n] | ||||
| 	fd.allExtensions = fd.allExtensions[:total+n] | ||||
| 	return xs | ||||
| } | ||||
| func (fd *File) allocServices(n int) []Service { | ||||
| 	total := len(fd.allServices) | ||||
| 	xs := fd.allServices[total : total+n] | ||||
| 	fd.allServices = fd.allServices[:total+n] | ||||
| 	return xs | ||||
| } | ||||
|  | ||||
| // checkDecls performs a sanity check that the expected number of expected | ||||
| // declarations matches the number that were found in the descriptor proto. | ||||
| func (fd *File) checkDecls() { | ||||
| 	switch { | ||||
| 	case len(fd.allEnums) != cap(fd.allEnums): | ||||
| 	case len(fd.allMessages) != cap(fd.allMessages): | ||||
| 	case len(fd.allExtensions) != cap(fd.allExtensions): | ||||
| 	case len(fd.allServices) != cap(fd.allServices): | ||||
| 	default: | ||||
| 		return | ||||
| 	} | ||||
| 	panic("mismatching cardinality") | ||||
| } | ||||
|  | ||||
| func (fd *File) unmarshalSeed(b []byte) { | ||||
| 	sb := getBuilder() | ||||
| 	defer putBuilder(sb) | ||||
|  | ||||
| 	var prevField pref.FieldNumber | ||||
| 	var numEnums, numMessages, numExtensions, numServices int | ||||
| 	var posEnums, posMessages, posExtensions, posServices int | ||||
| 	b0 := b | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FileDescriptorProto_Syntax_field_number: | ||||
| 				switch string(v) { | ||||
| 				case "proto2": | ||||
| 					fd.L1.Syntax = pref.Proto2 | ||||
| 				case "proto3": | ||||
| 					fd.L1.Syntax = pref.Proto3 | ||||
| 				default: | ||||
| 					panic("invalid syntax") | ||||
| 				} | ||||
| 			case genid.FileDescriptorProto_Name_field_number: | ||||
| 				fd.L1.Path = sb.MakeString(v) | ||||
| 			case genid.FileDescriptorProto_Package_field_number: | ||||
| 				fd.L1.Package = pref.FullName(sb.MakeString(v)) | ||||
| 			case genid.FileDescriptorProto_EnumType_field_number: | ||||
| 				if prevField != genid.FileDescriptorProto_EnumType_field_number { | ||||
| 					if numEnums > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posEnums = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numEnums++ | ||||
| 			case genid.FileDescriptorProto_MessageType_field_number: | ||||
| 				if prevField != genid.FileDescriptorProto_MessageType_field_number { | ||||
| 					if numMessages > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posMessages = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numMessages++ | ||||
| 			case genid.FileDescriptorProto_Extension_field_number: | ||||
| 				if prevField != genid.FileDescriptorProto_Extension_field_number { | ||||
| 					if numExtensions > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posExtensions = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numExtensions++ | ||||
| 			case genid.FileDescriptorProto_Service_field_number: | ||||
| 				if prevField != genid.FileDescriptorProto_Service_field_number { | ||||
| 					if numServices > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posServices = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numServices++ | ||||
| 			} | ||||
| 			prevField = num | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 			prevField = -1 // ignore known field numbers of unknown wire type | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// If syntax is missing, it is assumed to be proto2. | ||||
| 	if fd.L1.Syntax == 0 { | ||||
| 		fd.L1.Syntax = pref.Proto2 | ||||
| 	} | ||||
|  | ||||
| 	// Must allocate all declarations before parsing each descriptor type | ||||
| 	// to ensure we handled all descriptors in "flattened ordering". | ||||
| 	if numEnums > 0 { | ||||
| 		fd.L1.Enums.List = fd.allocEnums(numEnums) | ||||
| 	} | ||||
| 	if numMessages > 0 { | ||||
| 		fd.L1.Messages.List = fd.allocMessages(numMessages) | ||||
| 	} | ||||
| 	if numExtensions > 0 { | ||||
| 		fd.L1.Extensions.List = fd.allocExtensions(numExtensions) | ||||
| 	} | ||||
| 	if numServices > 0 { | ||||
| 		fd.L1.Services.List = fd.allocServices(numServices) | ||||
| 	} | ||||
|  | ||||
| 	if numEnums > 0 { | ||||
| 		b := b0[posEnums:] | ||||
| 		for i := range fd.L1.Enums.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			fd.L1.Enums.List[i].unmarshalSeed(v, sb, fd, fd, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if numMessages > 0 { | ||||
| 		b := b0[posMessages:] | ||||
| 		for i := range fd.L1.Messages.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			fd.L1.Messages.List[i].unmarshalSeed(v, sb, fd, fd, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if numExtensions > 0 { | ||||
| 		b := b0[posExtensions:] | ||||
| 		for i := range fd.L1.Extensions.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			fd.L1.Extensions.List[i].unmarshalSeed(v, sb, fd, fd, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if numServices > 0 { | ||||
| 		b := b0[posServices:] | ||||
| 		for i := range fd.L1.Services.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			fd.L1.Services.List[i].unmarshalSeed(v, sb, fd, fd, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { | ||||
| 	ed.L0.ParentFile = pf | ||||
| 	ed.L0.Parent = pd | ||||
| 	ed.L0.Index = i | ||||
|  | ||||
| 	var numValues int | ||||
| 	for b := b; len(b) > 0; { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.EnumDescriptorProto_Name_field_number: | ||||
| 				ed.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			case genid.EnumDescriptorProto_Value_field_number: | ||||
| 				numValues++ | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Only construct enum value descriptors for top-level enums since | ||||
| 	// they are needed for registration. | ||||
| 	if pd != pf { | ||||
| 		return | ||||
| 	} | ||||
| 	ed.L1.eagerValues = true | ||||
| 	ed.L2 = new(EnumL2) | ||||
| 	ed.L2.Values.List = make([]EnumValue, numValues) | ||||
| 	for i := 0; len(b) > 0; { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.EnumDescriptorProto_Value_field_number: | ||||
| 				ed.L2.Values.List[i].unmarshalFull(v, sb, pf, ed, i) | ||||
| 				i++ | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (md *Message) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { | ||||
| 	md.L0.ParentFile = pf | ||||
| 	md.L0.Parent = pd | ||||
| 	md.L0.Index = i | ||||
|  | ||||
| 	var prevField pref.FieldNumber | ||||
| 	var numEnums, numMessages, numExtensions int | ||||
| 	var posEnums, posMessages, posExtensions int | ||||
| 	b0 := b | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.DescriptorProto_Name_field_number: | ||||
| 				md.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			case genid.DescriptorProto_EnumType_field_number: | ||||
| 				if prevField != genid.DescriptorProto_EnumType_field_number { | ||||
| 					if numEnums > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posEnums = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numEnums++ | ||||
| 			case genid.DescriptorProto_NestedType_field_number: | ||||
| 				if prevField != genid.DescriptorProto_NestedType_field_number { | ||||
| 					if numMessages > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posMessages = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numMessages++ | ||||
| 			case genid.DescriptorProto_Extension_field_number: | ||||
| 				if prevField != genid.DescriptorProto_Extension_field_number { | ||||
| 					if numExtensions > 0 { | ||||
| 						panic("non-contiguous repeated field") | ||||
| 					} | ||||
| 					posExtensions = len(b0) - len(b) - n - m | ||||
| 				} | ||||
| 				numExtensions++ | ||||
| 			case genid.DescriptorProto_Options_field_number: | ||||
| 				md.unmarshalSeedOptions(v) | ||||
| 			} | ||||
| 			prevField = num | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 			prevField = -1 // ignore known field numbers of unknown wire type | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Must allocate all declarations before parsing each descriptor type | ||||
| 	// to ensure we handled all descriptors in "flattened ordering". | ||||
| 	if numEnums > 0 { | ||||
| 		md.L1.Enums.List = pf.allocEnums(numEnums) | ||||
| 	} | ||||
| 	if numMessages > 0 { | ||||
| 		md.L1.Messages.List = pf.allocMessages(numMessages) | ||||
| 	} | ||||
| 	if numExtensions > 0 { | ||||
| 		md.L1.Extensions.List = pf.allocExtensions(numExtensions) | ||||
| 	} | ||||
|  | ||||
| 	if numEnums > 0 { | ||||
| 		b := b0[posEnums:] | ||||
| 		for i := range md.L1.Enums.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			md.L1.Enums.List[i].unmarshalSeed(v, sb, pf, md, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if numMessages > 0 { | ||||
| 		b := b0[posMessages:] | ||||
| 		for i := range md.L1.Messages.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			md.L1.Messages.List[i].unmarshalSeed(v, sb, pf, md, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if numExtensions > 0 { | ||||
| 		b := b0[posExtensions:] | ||||
| 		for i := range md.L1.Extensions.List { | ||||
| 			_, n := protowire.ConsumeVarint(b) | ||||
| 			v, m := protowire.ConsumeBytes(b[n:]) | ||||
| 			md.L1.Extensions.List[i].unmarshalSeed(v, sb, pf, md, i) | ||||
| 			b = b[n+m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (md *Message) unmarshalSeedOptions(b []byte) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.MessageOptions_MapEntry_field_number: | ||||
| 				md.L1.IsMapEntry = protowire.DecodeBool(v) | ||||
| 			case genid.MessageOptions_MessageSetWireFormat_field_number: | ||||
| 				md.L1.IsMessageSet = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { | ||||
| 	xd.L0.ParentFile = pf | ||||
| 	xd.L0.Parent = pd | ||||
| 	xd.L0.Index = i | ||||
|  | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldDescriptorProto_Number_field_number: | ||||
| 				xd.L1.Number = pref.FieldNumber(v) | ||||
| 			case genid.FieldDescriptorProto_Label_field_number: | ||||
| 				xd.L1.Cardinality = pref.Cardinality(v) | ||||
| 			case genid.FieldDescriptorProto_Type_field_number: | ||||
| 				xd.L1.Kind = pref.Kind(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldDescriptorProto_Name_field_number: | ||||
| 				xd.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			case genid.FieldDescriptorProto_Extendee_field_number: | ||||
| 				xd.L1.Extendee = PlaceholderMessage(makeFullName(sb, v)) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (sd *Service) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { | ||||
| 	sd.L0.ParentFile = pf | ||||
| 	sd.L0.Parent = pd | ||||
| 	sd.L0.Index = i | ||||
|  | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.ServiceDescriptorProto_Name_field_number: | ||||
| 				sd.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var nameBuilderPool = sync.Pool{ | ||||
| 	New: func() interface{} { return new(strs.Builder) }, | ||||
| } | ||||
|  | ||||
| func getBuilder() *strs.Builder { | ||||
| 	return nameBuilderPool.Get().(*strs.Builder) | ||||
| } | ||||
| func putBuilder(b *strs.Builder) { | ||||
| 	nameBuilderPool.Put(b) | ||||
| } | ||||
|  | ||||
| // makeFullName converts b to a protoreflect.FullName, | ||||
| // where b must start with a leading dot. | ||||
| func makeFullName(sb *strs.Builder, b []byte) pref.FullName { | ||||
| 	if len(b) == 0 || b[0] != '.' { | ||||
| 		panic("name reference must be fully qualified") | ||||
| 	} | ||||
| 	return pref.FullName(sb.MakeString(b[1:])) | ||||
| } | ||||
|  | ||||
| func appendFullName(sb *strs.Builder, prefix pref.FullName, suffix []byte) pref.FullName { | ||||
| 	return sb.AppendFullName(prefix, pref.Name(strs.UnsafeString(suffix))) | ||||
| } | ||||
							
								
								
									
										704
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										704
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,704 @@ | ||||
| // 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 filedesc | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/descopts" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| func (fd *File) lazyRawInit() { | ||||
| 	fd.unmarshalFull(fd.builder.RawDescriptor) | ||||
| 	fd.resolveMessages() | ||||
| 	fd.resolveExtensions() | ||||
| 	fd.resolveServices() | ||||
| } | ||||
|  | ||||
| func (file *File) resolveMessages() { | ||||
| 	var depIdx int32 | ||||
| 	for i := range file.allMessages { | ||||
| 		md := &file.allMessages[i] | ||||
|  | ||||
| 		// Resolve message field dependencies. | ||||
| 		for j := range md.L2.Fields.List { | ||||
| 			fd := &md.L2.Fields.List[j] | ||||
|  | ||||
| 			// Weak fields are resolved upon actual use. | ||||
| 			if fd.L1.IsWeak { | ||||
| 				continue | ||||
| 			} | ||||
|  | ||||
| 			// Resolve message field dependency. | ||||
| 			switch fd.L1.Kind { | ||||
| 			case pref.EnumKind: | ||||
| 				fd.L1.Enum = file.resolveEnumDependency(fd.L1.Enum, listFieldDeps, depIdx) | ||||
| 				depIdx++ | ||||
| 			case pref.MessageKind, pref.GroupKind: | ||||
| 				fd.L1.Message = file.resolveMessageDependency(fd.L1.Message, listFieldDeps, depIdx) | ||||
| 				depIdx++ | ||||
| 			} | ||||
|  | ||||
| 			// Default is resolved here since it depends on Enum being resolved. | ||||
| 			if v := fd.L1.Default.val; v.IsValid() { | ||||
| 				fd.L1.Default = unmarshalDefault(v.Bytes(), fd.L1.Kind, file, fd.L1.Enum) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (file *File) resolveExtensions() { | ||||
| 	var depIdx int32 | ||||
| 	for i := range file.allExtensions { | ||||
| 		xd := &file.allExtensions[i] | ||||
|  | ||||
| 		// Resolve extension field dependency. | ||||
| 		switch xd.L1.Kind { | ||||
| 		case pref.EnumKind: | ||||
| 			xd.L2.Enum = file.resolveEnumDependency(xd.L2.Enum, listExtDeps, depIdx) | ||||
| 			depIdx++ | ||||
| 		case pref.MessageKind, pref.GroupKind: | ||||
| 			xd.L2.Message = file.resolveMessageDependency(xd.L2.Message, listExtDeps, depIdx) | ||||
| 			depIdx++ | ||||
| 		} | ||||
|  | ||||
| 		// Default is resolved here since it depends on Enum being resolved. | ||||
| 		if v := xd.L2.Default.val; v.IsValid() { | ||||
| 			xd.L2.Default = unmarshalDefault(v.Bytes(), xd.L1.Kind, file, xd.L2.Enum) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (file *File) resolveServices() { | ||||
| 	var depIdx int32 | ||||
| 	for i := range file.allServices { | ||||
| 		sd := &file.allServices[i] | ||||
|  | ||||
| 		// Resolve method dependencies. | ||||
| 		for j := range sd.L2.Methods.List { | ||||
| 			md := &sd.L2.Methods.List[j] | ||||
| 			md.L1.Input = file.resolveMessageDependency(md.L1.Input, listMethInDeps, depIdx) | ||||
| 			md.L1.Output = file.resolveMessageDependency(md.L1.Output, listMethOutDeps, depIdx) | ||||
| 			depIdx++ | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (file *File) resolveEnumDependency(ed pref.EnumDescriptor, i, j int32) pref.EnumDescriptor { | ||||
| 	r := file.builder.FileRegistry | ||||
| 	if r, ok := r.(resolverByIndex); ok { | ||||
| 		if ed2 := r.FindEnumByIndex(i, j, file.allEnums, file.allMessages); ed2 != nil { | ||||
| 			return ed2 | ||||
| 		} | ||||
| 	} | ||||
| 	for i := range file.allEnums { | ||||
| 		if ed2 := &file.allEnums[i]; ed2.L0.FullName == ed.FullName() { | ||||
| 			return ed2 | ||||
| 		} | ||||
| 	} | ||||
| 	if d, _ := r.FindDescriptorByName(ed.FullName()); d != nil { | ||||
| 		return d.(pref.EnumDescriptor) | ||||
| 	} | ||||
| 	return ed | ||||
| } | ||||
|  | ||||
| func (file *File) resolveMessageDependency(md pref.MessageDescriptor, i, j int32) pref.MessageDescriptor { | ||||
| 	r := file.builder.FileRegistry | ||||
| 	if r, ok := r.(resolverByIndex); ok { | ||||
| 		if md2 := r.FindMessageByIndex(i, j, file.allEnums, file.allMessages); md2 != nil { | ||||
| 			return md2 | ||||
| 		} | ||||
| 	} | ||||
| 	for i := range file.allMessages { | ||||
| 		if md2 := &file.allMessages[i]; md2.L0.FullName == md.FullName() { | ||||
| 			return md2 | ||||
| 		} | ||||
| 	} | ||||
| 	if d, _ := r.FindDescriptorByName(md.FullName()); d != nil { | ||||
| 		return d.(pref.MessageDescriptor) | ||||
| 	} | ||||
| 	return md | ||||
| } | ||||
|  | ||||
| func (fd *File) unmarshalFull(b []byte) { | ||||
| 	sb := getBuilder() | ||||
| 	defer putBuilder(sb) | ||||
|  | ||||
| 	var enumIdx, messageIdx, extensionIdx, serviceIdx int | ||||
| 	var rawOptions []byte | ||||
| 	fd.L2 = new(FileL2) | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FileDescriptorProto_PublicDependency_field_number: | ||||
| 				fd.L2.Imports[v].IsPublic = true | ||||
| 			case genid.FileDescriptorProto_WeakDependency_field_number: | ||||
| 				fd.L2.Imports[v].IsWeak = true | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FileDescriptorProto_Dependency_field_number: | ||||
| 				path := sb.MakeString(v) | ||||
| 				imp, _ := fd.builder.FileRegistry.FindFileByPath(path) | ||||
| 				if imp == nil { | ||||
| 					imp = PlaceholderFile(path) | ||||
| 				} | ||||
| 				fd.L2.Imports = append(fd.L2.Imports, pref.FileImport{FileDescriptor: imp}) | ||||
| 			case genid.FileDescriptorProto_EnumType_field_number: | ||||
| 				fd.L1.Enums.List[enumIdx].unmarshalFull(v, sb) | ||||
| 				enumIdx++ | ||||
| 			case genid.FileDescriptorProto_MessageType_field_number: | ||||
| 				fd.L1.Messages.List[messageIdx].unmarshalFull(v, sb) | ||||
| 				messageIdx++ | ||||
| 			case genid.FileDescriptorProto_Extension_field_number: | ||||
| 				fd.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb) | ||||
| 				extensionIdx++ | ||||
| 			case genid.FileDescriptorProto_Service_field_number: | ||||
| 				fd.L1.Services.List[serviceIdx].unmarshalFull(v, sb) | ||||
| 				serviceIdx++ | ||||
| 			case genid.FileDescriptorProto_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	fd.L2.Options = fd.builder.optionsUnmarshaler(&descopts.File, rawOptions) | ||||
| } | ||||
|  | ||||
| func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) { | ||||
| 	var rawValues [][]byte | ||||
| 	var rawOptions []byte | ||||
| 	if !ed.L1.eagerValues { | ||||
| 		ed.L2 = new(EnumL2) | ||||
| 	} | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.EnumDescriptorProto_Value_field_number: | ||||
| 				rawValues = append(rawValues, v) | ||||
| 			case genid.EnumDescriptorProto_ReservedName_field_number: | ||||
| 				ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, pref.Name(sb.MakeString(v))) | ||||
| 			case genid.EnumDescriptorProto_ReservedRange_field_number: | ||||
| 				ed.L2.ReservedRanges.List = append(ed.L2.ReservedRanges.List, unmarshalEnumReservedRange(v)) | ||||
| 			case genid.EnumDescriptorProto_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if !ed.L1.eagerValues && len(rawValues) > 0 { | ||||
| 		ed.L2.Values.List = make([]EnumValue, len(rawValues)) | ||||
| 		for i, b := range rawValues { | ||||
| 			ed.L2.Values.List[i].unmarshalFull(b, sb, ed.L0.ParentFile, ed, i) | ||||
| 		} | ||||
| 	} | ||||
| 	ed.L2.Options = ed.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Enum, rawOptions) | ||||
| } | ||||
|  | ||||
| func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.EnumDescriptorProto_EnumReservedRange_Start_field_number: | ||||
| 				r[0] = pref.EnumNumber(v) | ||||
| 			case genid.EnumDescriptorProto_EnumReservedRange_End_field_number: | ||||
| 				r[1] = pref.EnumNumber(v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	return r | ||||
| } | ||||
|  | ||||
| func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { | ||||
| 	vd.L0.ParentFile = pf | ||||
| 	vd.L0.Parent = pd | ||||
| 	vd.L0.Index = i | ||||
|  | ||||
| 	var rawOptions []byte | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.EnumValueDescriptorProto_Number_field_number: | ||||
| 				vd.L1.Number = pref.EnumNumber(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.EnumValueDescriptorProto_Name_field_number: | ||||
| 				// NOTE: Enum values are in the same scope as the enum parent. | ||||
| 				vd.L0.FullName = appendFullName(sb, pd.Parent().FullName(), v) | ||||
| 			case genid.EnumValueDescriptorProto_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	vd.L1.Options = pf.builder.optionsUnmarshaler(&descopts.EnumValue, rawOptions) | ||||
| } | ||||
|  | ||||
| func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) { | ||||
| 	var rawFields, rawOneofs [][]byte | ||||
| 	var enumIdx, messageIdx, extensionIdx int | ||||
| 	var rawOptions []byte | ||||
| 	md.L2 = new(MessageL2) | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.DescriptorProto_Field_field_number: | ||||
| 				rawFields = append(rawFields, v) | ||||
| 			case genid.DescriptorProto_OneofDecl_field_number: | ||||
| 				rawOneofs = append(rawOneofs, v) | ||||
| 			case genid.DescriptorProto_ReservedName_field_number: | ||||
| 				md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, pref.Name(sb.MakeString(v))) | ||||
| 			case genid.DescriptorProto_ReservedRange_field_number: | ||||
| 				md.L2.ReservedRanges.List = append(md.L2.ReservedRanges.List, unmarshalMessageReservedRange(v)) | ||||
| 			case genid.DescriptorProto_ExtensionRange_field_number: | ||||
| 				r, rawOptions := unmarshalMessageExtensionRange(v) | ||||
| 				opts := md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.ExtensionRange, rawOptions) | ||||
| 				md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, r) | ||||
| 				md.L2.ExtensionRangeOptions = append(md.L2.ExtensionRangeOptions, opts) | ||||
| 			case genid.DescriptorProto_EnumType_field_number: | ||||
| 				md.L1.Enums.List[enumIdx].unmarshalFull(v, sb) | ||||
| 				enumIdx++ | ||||
| 			case genid.DescriptorProto_NestedType_field_number: | ||||
| 				md.L1.Messages.List[messageIdx].unmarshalFull(v, sb) | ||||
| 				messageIdx++ | ||||
| 			case genid.DescriptorProto_Extension_field_number: | ||||
| 				md.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb) | ||||
| 				extensionIdx++ | ||||
| 			case genid.DescriptorProto_Options_field_number: | ||||
| 				md.unmarshalOptions(v) | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if len(rawFields) > 0 || len(rawOneofs) > 0 { | ||||
| 		md.L2.Fields.List = make([]Field, len(rawFields)) | ||||
| 		md.L2.Oneofs.List = make([]Oneof, len(rawOneofs)) | ||||
| 		for i, b := range rawFields { | ||||
| 			fd := &md.L2.Fields.List[i] | ||||
| 			fd.unmarshalFull(b, sb, md.L0.ParentFile, md, i) | ||||
| 			if fd.L1.Cardinality == pref.Required { | ||||
| 				md.L2.RequiredNumbers.List = append(md.L2.RequiredNumbers.List, fd.L1.Number) | ||||
| 			} | ||||
| 		} | ||||
| 		for i, b := range rawOneofs { | ||||
| 			od := &md.L2.Oneofs.List[i] | ||||
| 			od.unmarshalFull(b, sb, md.L0.ParentFile, md, i) | ||||
| 		} | ||||
| 	} | ||||
| 	md.L2.Options = md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Message, rawOptions) | ||||
| } | ||||
|  | ||||
| func (md *Message) unmarshalOptions(b []byte) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.MessageOptions_MapEntry_field_number: | ||||
| 				md.L1.IsMapEntry = protowire.DecodeBool(v) | ||||
| 			case genid.MessageOptions_MessageSetWireFormat_field_number: | ||||
| 				md.L1.IsMessageSet = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.DescriptorProto_ReservedRange_Start_field_number: | ||||
| 				r[0] = pref.FieldNumber(v) | ||||
| 			case genid.DescriptorProto_ReservedRange_End_field_number: | ||||
| 				r[1] = pref.FieldNumber(v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	return r | ||||
| } | ||||
|  | ||||
| func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions []byte) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.DescriptorProto_ExtensionRange_Start_field_number: | ||||
| 				r[0] = pref.FieldNumber(v) | ||||
| 			case genid.DescriptorProto_ExtensionRange_End_field_number: | ||||
| 				r[1] = pref.FieldNumber(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.DescriptorProto_ExtensionRange_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	return r, rawOptions | ||||
| } | ||||
|  | ||||
| func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { | ||||
| 	fd.L0.ParentFile = pf | ||||
| 	fd.L0.Parent = pd | ||||
| 	fd.L0.Index = i | ||||
|  | ||||
| 	var rawTypeName []byte | ||||
| 	var rawOptions []byte | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldDescriptorProto_Number_field_number: | ||||
| 				fd.L1.Number = pref.FieldNumber(v) | ||||
| 			case genid.FieldDescriptorProto_Label_field_number: | ||||
| 				fd.L1.Cardinality = pref.Cardinality(v) | ||||
| 			case genid.FieldDescriptorProto_Type_field_number: | ||||
| 				fd.L1.Kind = pref.Kind(v) | ||||
| 			case genid.FieldDescriptorProto_OneofIndex_field_number: | ||||
| 				// In Message.unmarshalFull, we allocate slices for both | ||||
| 				// the field and oneof descriptors before unmarshaling either | ||||
| 				// of them. This ensures pointers to slice elements are stable. | ||||
| 				od := &pd.(*Message).L2.Oneofs.List[v] | ||||
| 				od.L1.Fields.List = append(od.L1.Fields.List, fd) | ||||
| 				if fd.L1.ContainingOneof != nil { | ||||
| 					panic("oneof type already set") | ||||
| 				} | ||||
| 				fd.L1.ContainingOneof = od | ||||
| 			case genid.FieldDescriptorProto_Proto3Optional_field_number: | ||||
| 				fd.L1.IsProto3Optional = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldDescriptorProto_Name_field_number: | ||||
| 				fd.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			case genid.FieldDescriptorProto_JsonName_field_number: | ||||
| 				fd.L1.StringName.InitJSON(sb.MakeString(v)) | ||||
| 			case genid.FieldDescriptorProto_DefaultValue_field_number: | ||||
| 				fd.L1.Default.val = pref.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages | ||||
| 			case genid.FieldDescriptorProto_TypeName_field_number: | ||||
| 				rawTypeName = v | ||||
| 			case genid.FieldDescriptorProto_Options_field_number: | ||||
| 				fd.unmarshalOptions(v) | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if rawTypeName != nil { | ||||
| 		name := makeFullName(sb, rawTypeName) | ||||
| 		switch fd.L1.Kind { | ||||
| 		case pref.EnumKind: | ||||
| 			fd.L1.Enum = PlaceholderEnum(name) | ||||
| 		case pref.MessageKind, pref.GroupKind: | ||||
| 			fd.L1.Message = PlaceholderMessage(name) | ||||
| 		} | ||||
| 	} | ||||
| 	fd.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Field, rawOptions) | ||||
| } | ||||
|  | ||||
| func (fd *Field) unmarshalOptions(b []byte) { | ||||
| 	const FieldOptions_EnforceUTF8 = 13 | ||||
|  | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldOptions_Packed_field_number: | ||||
| 				fd.L1.HasPacked = true | ||||
| 				fd.L1.IsPacked = protowire.DecodeBool(v) | ||||
| 			case genid.FieldOptions_Weak_field_number: | ||||
| 				fd.L1.IsWeak = protowire.DecodeBool(v) | ||||
| 			case FieldOptions_EnforceUTF8: | ||||
| 				fd.L1.HasEnforceUTF8 = true | ||||
| 				fd.L1.EnforceUTF8 = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { | ||||
| 	od.L0.ParentFile = pf | ||||
| 	od.L0.Parent = pd | ||||
| 	od.L0.Index = i | ||||
|  | ||||
| 	var rawOptions []byte | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.OneofDescriptorProto_Name_field_number: | ||||
| 				od.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			case genid.OneofDescriptorProto_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	od.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Oneof, rawOptions) | ||||
| } | ||||
|  | ||||
| func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) { | ||||
| 	var rawTypeName []byte | ||||
| 	var rawOptions []byte | ||||
| 	xd.L2 = new(ExtensionL2) | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldDescriptorProto_Proto3Optional_field_number: | ||||
| 				xd.L2.IsProto3Optional = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldDescriptorProto_JsonName_field_number: | ||||
| 				xd.L2.StringName.InitJSON(sb.MakeString(v)) | ||||
| 			case genid.FieldDescriptorProto_DefaultValue_field_number: | ||||
| 				xd.L2.Default.val = pref.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions | ||||
| 			case genid.FieldDescriptorProto_TypeName_field_number: | ||||
| 				rawTypeName = v | ||||
| 			case genid.FieldDescriptorProto_Options_field_number: | ||||
| 				xd.unmarshalOptions(v) | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if rawTypeName != nil { | ||||
| 		name := makeFullName(sb, rawTypeName) | ||||
| 		switch xd.L1.Kind { | ||||
| 		case pref.EnumKind: | ||||
| 			xd.L2.Enum = PlaceholderEnum(name) | ||||
| 		case pref.MessageKind, pref.GroupKind: | ||||
| 			xd.L2.Message = PlaceholderMessage(name) | ||||
| 		} | ||||
| 	} | ||||
| 	xd.L2.Options = xd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Field, rawOptions) | ||||
| } | ||||
|  | ||||
| func (xd *Extension) unmarshalOptions(b []byte) { | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.FieldOptions_Packed_field_number: | ||||
| 				xd.L2.IsPacked = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (sd *Service) unmarshalFull(b []byte, sb *strs.Builder) { | ||||
| 	var rawMethods [][]byte | ||||
| 	var rawOptions []byte | ||||
| 	sd.L2 = new(ServiceL2) | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.ServiceDescriptorProto_Method_field_number: | ||||
| 				rawMethods = append(rawMethods, v) | ||||
| 			case genid.ServiceDescriptorProto_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	if len(rawMethods) > 0 { | ||||
| 		sd.L2.Methods.List = make([]Method, len(rawMethods)) | ||||
| 		for i, b := range rawMethods { | ||||
| 			sd.L2.Methods.List[i].unmarshalFull(b, sb, sd.L0.ParentFile, sd, i) | ||||
| 		} | ||||
| 	} | ||||
| 	sd.L2.Options = sd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Service, rawOptions) | ||||
| } | ||||
|  | ||||
| func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Descriptor, i int) { | ||||
| 	md.L0.ParentFile = pf | ||||
| 	md.L0.Parent = pd | ||||
| 	md.L0.Index = i | ||||
|  | ||||
| 	var rawOptions []byte | ||||
| 	for len(b) > 0 { | ||||
| 		num, typ, n := protowire.ConsumeTag(b) | ||||
| 		b = b[n:] | ||||
| 		switch typ { | ||||
| 		case protowire.VarintType: | ||||
| 			v, m := protowire.ConsumeVarint(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.MethodDescriptorProto_ClientStreaming_field_number: | ||||
| 				md.L1.IsStreamingClient = protowire.DecodeBool(v) | ||||
| 			case genid.MethodDescriptorProto_ServerStreaming_field_number: | ||||
| 				md.L1.IsStreamingServer = protowire.DecodeBool(v) | ||||
| 			} | ||||
| 		case protowire.BytesType: | ||||
| 			v, m := protowire.ConsumeBytes(b) | ||||
| 			b = b[m:] | ||||
| 			switch num { | ||||
| 			case genid.MethodDescriptorProto_Name_field_number: | ||||
| 				md.L0.FullName = appendFullName(sb, pd.FullName(), v) | ||||
| 			case genid.MethodDescriptorProto_InputType_field_number: | ||||
| 				md.L1.Input = PlaceholderMessage(makeFullName(sb, v)) | ||||
| 			case genid.MethodDescriptorProto_OutputType_field_number: | ||||
| 				md.L1.Output = PlaceholderMessage(makeFullName(sb, v)) | ||||
| 			case genid.MethodDescriptorProto_Options_field_number: | ||||
| 				rawOptions = appendOptions(rawOptions, v) | ||||
| 			} | ||||
| 		default: | ||||
| 			m := protowire.ConsumeFieldValue(num, typ, b) | ||||
| 			b = b[m:] | ||||
| 		} | ||||
| 	} | ||||
| 	md.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Method, rawOptions) | ||||
| } | ||||
|  | ||||
| // appendOptions appends src to dst, where the returned slice is never nil. | ||||
| // This is necessary to distinguish between empty and unpopulated options. | ||||
| func appendOptions(dst, src []byte) []byte { | ||||
| 	if dst == nil { | ||||
| 		dst = []byte{} | ||||
| 	} | ||||
| 	return append(dst, src...) | ||||
| } | ||||
|  | ||||
| // optionsUnmarshaler constructs a lazy unmarshal function for an options message. | ||||
| // | ||||
| // The type of message to unmarshal to is passed as a pointer since the | ||||
| // vars in descopts may not yet be populated at the time this function is called. | ||||
| func (db *Builder) optionsUnmarshaler(p *pref.ProtoMessage, b []byte) func() pref.ProtoMessage { | ||||
| 	if b == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	var opts pref.ProtoMessage | ||||
| 	var once sync.Once | ||||
| 	return func() pref.ProtoMessage { | ||||
| 		once.Do(func() { | ||||
| 			if *p == nil { | ||||
| 				panic("Descriptor.Options called without importing the descriptor package") | ||||
| 			} | ||||
| 			opts = reflect.New(reflect.TypeOf(*p).Elem()).Interface().(pref.ProtoMessage) | ||||
| 			if err := (proto.UnmarshalOptions{ | ||||
| 				AllowPartial: true, | ||||
| 				Resolver:     db.TypeResolver, | ||||
| 			}).Unmarshal(b, opts); err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 		}) | ||||
| 		return opts | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										450
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										450
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,450 @@ | ||||
| // 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 filedesc | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"math" | ||||
| 	"sort" | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/descfmt" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| type FileImports []pref.FileImport | ||||
|  | ||||
| func (p *FileImports) Len() int                            { return len(*p) } | ||||
| func (p *FileImports) Get(i int) pref.FileImport           { return (*p)[i] } | ||||
| func (p *FileImports) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) } | ||||
| func (p *FileImports) ProtoInternal(pragma.DoNotImplement) {} | ||||
|  | ||||
| type Names struct { | ||||
| 	List []pref.Name | ||||
| 	once sync.Once | ||||
| 	has  map[pref.Name]int // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Names) Len() int                            { return len(p.List) } | ||||
| func (p *Names) Get(i int) pref.Name                 { return p.List[i] } | ||||
| func (p *Names) Has(s pref.Name) bool                { return p.lazyInit().has[s] > 0 } | ||||
| func (p *Names) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) } | ||||
| func (p *Names) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Names) lazyInit() *Names { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.has = make(map[pref.Name]int, len(p.List)) | ||||
| 			for _, s := range p.List { | ||||
| 				p.has[s] = p.has[s] + 1 | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| // CheckValid reports any errors with the set of names with an error message | ||||
| // that completes the sentence: "ranges is invalid because it has ..." | ||||
| func (p *Names) CheckValid() error { | ||||
| 	for s, n := range p.lazyInit().has { | ||||
| 		switch { | ||||
| 		case n > 1: | ||||
| 			return errors.New("duplicate name: %q", s) | ||||
| 		case false && !s.IsValid(): | ||||
| 			// NOTE: The C++ implementation does not validate the identifier. | ||||
| 			// See https://github.com/protocolbuffers/protobuf/issues/6335. | ||||
| 			return errors.New("invalid name: %q", s) | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type EnumRanges struct { | ||||
| 	List   [][2]pref.EnumNumber // start inclusive; end inclusive | ||||
| 	once   sync.Once | ||||
| 	sorted [][2]pref.EnumNumber // protected by once | ||||
| } | ||||
|  | ||||
| func (p *EnumRanges) Len() int                     { return len(p.List) } | ||||
| func (p *EnumRanges) Get(i int) [2]pref.EnumNumber { return p.List[i] } | ||||
| func (p *EnumRanges) Has(n pref.EnumNumber) bool { | ||||
| 	for ls := p.lazyInit().sorted; len(ls) > 0; { | ||||
| 		i := len(ls) / 2 | ||||
| 		switch r := enumRange(ls[i]); { | ||||
| 		case n < r.Start(): | ||||
| 			ls = ls[:i] // search lower | ||||
| 		case n > r.End(): | ||||
| 			ls = ls[i+1:] // search upper | ||||
| 		default: | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| func (p *EnumRanges) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) } | ||||
| func (p *EnumRanges) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *EnumRanges) lazyInit() *EnumRanges { | ||||
| 	p.once.Do(func() { | ||||
| 		p.sorted = append(p.sorted, p.List...) | ||||
| 		sort.Slice(p.sorted, func(i, j int) bool { | ||||
| 			return p.sorted[i][0] < p.sorted[j][0] | ||||
| 		}) | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| // CheckValid reports any errors with the set of names with an error message | ||||
| // that completes the sentence: "ranges is invalid because it has ..." | ||||
| func (p *EnumRanges) CheckValid() error { | ||||
| 	var rp enumRange | ||||
| 	for i, r := range p.lazyInit().sorted { | ||||
| 		r := enumRange(r) | ||||
| 		switch { | ||||
| 		case !(r.Start() <= r.End()): | ||||
| 			return errors.New("invalid range: %v", r) | ||||
| 		case !(rp.End() < r.Start()) && i > 0: | ||||
| 			return errors.New("overlapping ranges: %v with %v", rp, r) | ||||
| 		} | ||||
| 		rp = r | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type enumRange [2]protoreflect.EnumNumber | ||||
|  | ||||
| func (r enumRange) Start() protoreflect.EnumNumber { return r[0] } // inclusive | ||||
| func (r enumRange) End() protoreflect.EnumNumber   { return r[1] } // inclusive | ||||
| func (r enumRange) String() string { | ||||
| 	if r.Start() == r.End() { | ||||
| 		return fmt.Sprintf("%d", r.Start()) | ||||
| 	} | ||||
| 	return fmt.Sprintf("%d to %d", r.Start(), r.End()) | ||||
| } | ||||
|  | ||||
| type FieldRanges struct { | ||||
| 	List   [][2]pref.FieldNumber // start inclusive; end exclusive | ||||
| 	once   sync.Once | ||||
| 	sorted [][2]pref.FieldNumber // protected by once | ||||
| } | ||||
|  | ||||
| func (p *FieldRanges) Len() int                      { return len(p.List) } | ||||
| func (p *FieldRanges) Get(i int) [2]pref.FieldNumber { return p.List[i] } | ||||
| func (p *FieldRanges) Has(n pref.FieldNumber) bool { | ||||
| 	for ls := p.lazyInit().sorted; len(ls) > 0; { | ||||
| 		i := len(ls) / 2 | ||||
| 		switch r := fieldRange(ls[i]); { | ||||
| 		case n < r.Start(): | ||||
| 			ls = ls[:i] // search lower | ||||
| 		case n > r.End(): | ||||
| 			ls = ls[i+1:] // search upper | ||||
| 		default: | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| func (p *FieldRanges) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) } | ||||
| func (p *FieldRanges) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *FieldRanges) lazyInit() *FieldRanges { | ||||
| 	p.once.Do(func() { | ||||
| 		p.sorted = append(p.sorted, p.List...) | ||||
| 		sort.Slice(p.sorted, func(i, j int) bool { | ||||
| 			return p.sorted[i][0] < p.sorted[j][0] | ||||
| 		}) | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| // CheckValid reports any errors with the set of ranges with an error message | ||||
| // that completes the sentence: "ranges is invalid because it has ..." | ||||
| func (p *FieldRanges) CheckValid(isMessageSet bool) error { | ||||
| 	var rp fieldRange | ||||
| 	for i, r := range p.lazyInit().sorted { | ||||
| 		r := fieldRange(r) | ||||
| 		switch { | ||||
| 		case !isValidFieldNumber(r.Start(), isMessageSet): | ||||
| 			return errors.New("invalid field number: %d", r.Start()) | ||||
| 		case !isValidFieldNumber(r.End(), isMessageSet): | ||||
| 			return errors.New("invalid field number: %d", r.End()) | ||||
| 		case !(r.Start() <= r.End()): | ||||
| 			return errors.New("invalid range: %v", r) | ||||
| 		case !(rp.End() < r.Start()) && i > 0: | ||||
| 			return errors.New("overlapping ranges: %v with %v", rp, r) | ||||
| 		} | ||||
| 		rp = r | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // isValidFieldNumber reports whether the field number is valid. | ||||
| // Unlike the FieldNumber.IsValid method, it allows ranges that cover the | ||||
| // reserved number range. | ||||
| func isValidFieldNumber(n protoreflect.FieldNumber, isMessageSet bool) bool { | ||||
| 	return protowire.MinValidNumber <= n && (n <= protowire.MaxValidNumber || isMessageSet) | ||||
| } | ||||
|  | ||||
| // CheckOverlap reports an error if p and q overlap. | ||||
| func (p *FieldRanges) CheckOverlap(q *FieldRanges) error { | ||||
| 	rps := p.lazyInit().sorted | ||||
| 	rqs := q.lazyInit().sorted | ||||
| 	for pi, qi := 0, 0; pi < len(rps) && qi < len(rqs); { | ||||
| 		rp := fieldRange(rps[pi]) | ||||
| 		rq := fieldRange(rqs[qi]) | ||||
| 		if !(rp.End() < rq.Start() || rq.End() < rp.Start()) { | ||||
| 			return errors.New("overlapping ranges: %v with %v", rp, rq) | ||||
| 		} | ||||
| 		if rp.Start() < rq.Start() { | ||||
| 			pi++ | ||||
| 		} else { | ||||
| 			qi++ | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type fieldRange [2]protoreflect.FieldNumber | ||||
|  | ||||
| func (r fieldRange) Start() protoreflect.FieldNumber { return r[0] }     // inclusive | ||||
| func (r fieldRange) End() protoreflect.FieldNumber   { return r[1] - 1 } // inclusive | ||||
| func (r fieldRange) String() string { | ||||
| 	if r.Start() == r.End() { | ||||
| 		return fmt.Sprintf("%d", r.Start()) | ||||
| 	} | ||||
| 	return fmt.Sprintf("%d to %d", r.Start(), r.End()) | ||||
| } | ||||
|  | ||||
| type FieldNumbers struct { | ||||
| 	List []pref.FieldNumber | ||||
| 	once sync.Once | ||||
| 	has  map[pref.FieldNumber]struct{} // protected by once | ||||
| } | ||||
|  | ||||
| func (p *FieldNumbers) Len() int                   { return len(p.List) } | ||||
| func (p *FieldNumbers) Get(i int) pref.FieldNumber { return p.List[i] } | ||||
| func (p *FieldNumbers) Has(n pref.FieldNumber) bool { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.has = make(map[pref.FieldNumber]struct{}, len(p.List)) | ||||
| 			for _, n := range p.List { | ||||
| 				p.has[n] = struct{}{} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	_, ok := p.has[n] | ||||
| 	return ok | ||||
| } | ||||
| func (p *FieldNumbers) Format(s fmt.State, r rune)          { descfmt.FormatList(s, r, p) } | ||||
| func (p *FieldNumbers) ProtoInternal(pragma.DoNotImplement) {} | ||||
|  | ||||
| type OneofFields struct { | ||||
| 	List   []pref.FieldDescriptor | ||||
| 	once   sync.Once | ||||
| 	byName map[pref.Name]pref.FieldDescriptor        // protected by once | ||||
| 	byJSON map[string]pref.FieldDescriptor           // protected by once | ||||
| 	byText map[string]pref.FieldDescriptor           // protected by once | ||||
| 	byNum  map[pref.FieldNumber]pref.FieldDescriptor // protected by once | ||||
| } | ||||
|  | ||||
| func (p *OneofFields) Len() int                                         { return len(p.List) } | ||||
| func (p *OneofFields) Get(i int) pref.FieldDescriptor                   { return p.List[i] } | ||||
| func (p *OneofFields) ByName(s pref.Name) pref.FieldDescriptor          { return p.lazyInit().byName[s] } | ||||
| func (p *OneofFields) ByJSONName(s string) pref.FieldDescriptor         { return p.lazyInit().byJSON[s] } | ||||
| func (p *OneofFields) ByTextName(s string) pref.FieldDescriptor         { return p.lazyInit().byText[s] } | ||||
| func (p *OneofFields) ByNumber(n pref.FieldNumber) pref.FieldDescriptor { return p.lazyInit().byNum[n] } | ||||
| func (p *OneofFields) Format(s fmt.State, r rune)                       { descfmt.FormatList(s, r, p) } | ||||
| func (p *OneofFields) ProtoInternal(pragma.DoNotImplement)              {} | ||||
|  | ||||
| func (p *OneofFields) lazyInit() *OneofFields { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[pref.Name]pref.FieldDescriptor, len(p.List)) | ||||
| 			p.byJSON = make(map[string]pref.FieldDescriptor, len(p.List)) | ||||
| 			p.byText = make(map[string]pref.FieldDescriptor, len(p.List)) | ||||
| 			p.byNum = make(map[pref.FieldNumber]pref.FieldDescriptor, len(p.List)) | ||||
| 			for _, f := range p.List { | ||||
| 				// Field names and numbers are guaranteed to be unique. | ||||
| 				p.byName[f.Name()] = f | ||||
| 				p.byJSON[f.JSONName()] = f | ||||
| 				p.byText[f.TextName()] = f | ||||
| 				p.byNum[f.Number()] = f | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type SourceLocations struct { | ||||
| 	// List is a list of SourceLocations. | ||||
| 	// The SourceLocation.Next field does not need to be populated | ||||
| 	// as it will be lazily populated upon first need. | ||||
| 	List []pref.SourceLocation | ||||
|  | ||||
| 	// File is the parent file descriptor that these locations are relative to. | ||||
| 	// If non-nil, ByDescriptor verifies that the provided descriptor | ||||
| 	// is a child of this file descriptor. | ||||
| 	File pref.FileDescriptor | ||||
|  | ||||
| 	once   sync.Once | ||||
| 	byPath map[pathKey]int | ||||
| } | ||||
|  | ||||
| func (p *SourceLocations) Len() int                      { return len(p.List) } | ||||
| func (p *SourceLocations) Get(i int) pref.SourceLocation { return p.lazyInit().List[i] } | ||||
| func (p *SourceLocations) byKey(k pathKey) pref.SourceLocation { | ||||
| 	if i, ok := p.lazyInit().byPath[k]; ok { | ||||
| 		return p.List[i] | ||||
| 	} | ||||
| 	return pref.SourceLocation{} | ||||
| } | ||||
| func (p *SourceLocations) ByPath(path pref.SourcePath) pref.SourceLocation { | ||||
| 	return p.byKey(newPathKey(path)) | ||||
| } | ||||
| func (p *SourceLocations) ByDescriptor(desc pref.Descriptor) pref.SourceLocation { | ||||
| 	if p.File != nil && desc != nil && p.File != desc.ParentFile() { | ||||
| 		return pref.SourceLocation{} // mismatching parent files | ||||
| 	} | ||||
| 	var pathArr [16]int32 | ||||
| 	path := pathArr[:0] | ||||
| 	for { | ||||
| 		switch desc.(type) { | ||||
| 		case pref.FileDescriptor: | ||||
| 			// Reverse the path since it was constructed in reverse. | ||||
| 			for i, j := 0, len(path)-1; i < j; i, j = i+1, j-1 { | ||||
| 				path[i], path[j] = path[j], path[i] | ||||
| 			} | ||||
| 			return p.byKey(newPathKey(path)) | ||||
| 		case pref.MessageDescriptor: | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			switch desc.(type) { | ||||
| 			case pref.FileDescriptor: | ||||
| 				path = append(path, int32(genid.FileDescriptorProto_MessageType_field_number)) | ||||
| 			case pref.MessageDescriptor: | ||||
| 				path = append(path, int32(genid.DescriptorProto_NestedType_field_number)) | ||||
| 			default: | ||||
| 				return pref.SourceLocation{} | ||||
| 			} | ||||
| 		case pref.FieldDescriptor: | ||||
| 			isExtension := desc.(pref.FieldDescriptor).IsExtension() | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			if isExtension { | ||||
| 				switch desc.(type) { | ||||
| 				case pref.FileDescriptor: | ||||
| 					path = append(path, int32(genid.FileDescriptorProto_Extension_field_number)) | ||||
| 				case pref.MessageDescriptor: | ||||
| 					path = append(path, int32(genid.DescriptorProto_Extension_field_number)) | ||||
| 				default: | ||||
| 					return pref.SourceLocation{} | ||||
| 				} | ||||
| 			} else { | ||||
| 				switch desc.(type) { | ||||
| 				case pref.MessageDescriptor: | ||||
| 					path = append(path, int32(genid.DescriptorProto_Field_field_number)) | ||||
| 				default: | ||||
| 					return pref.SourceLocation{} | ||||
| 				} | ||||
| 			} | ||||
| 		case pref.OneofDescriptor: | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			switch desc.(type) { | ||||
| 			case pref.MessageDescriptor: | ||||
| 				path = append(path, int32(genid.DescriptorProto_OneofDecl_field_number)) | ||||
| 			default: | ||||
| 				return pref.SourceLocation{} | ||||
| 			} | ||||
| 		case pref.EnumDescriptor: | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			switch desc.(type) { | ||||
| 			case pref.FileDescriptor: | ||||
| 				path = append(path, int32(genid.FileDescriptorProto_EnumType_field_number)) | ||||
| 			case pref.MessageDescriptor: | ||||
| 				path = append(path, int32(genid.DescriptorProto_EnumType_field_number)) | ||||
| 			default: | ||||
| 				return pref.SourceLocation{} | ||||
| 			} | ||||
| 		case pref.EnumValueDescriptor: | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			switch desc.(type) { | ||||
| 			case pref.EnumDescriptor: | ||||
| 				path = append(path, int32(genid.EnumDescriptorProto_Value_field_number)) | ||||
| 			default: | ||||
| 				return pref.SourceLocation{} | ||||
| 			} | ||||
| 		case pref.ServiceDescriptor: | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			switch desc.(type) { | ||||
| 			case pref.FileDescriptor: | ||||
| 				path = append(path, int32(genid.FileDescriptorProto_Service_field_number)) | ||||
| 			default: | ||||
| 				return pref.SourceLocation{} | ||||
| 			} | ||||
| 		case pref.MethodDescriptor: | ||||
| 			path = append(path, int32(desc.Index())) | ||||
| 			desc = desc.Parent() | ||||
| 			switch desc.(type) { | ||||
| 			case pref.ServiceDescriptor: | ||||
| 				path = append(path, int32(genid.ServiceDescriptorProto_Method_field_number)) | ||||
| 			default: | ||||
| 				return pref.SourceLocation{} | ||||
| 			} | ||||
| 		default: | ||||
| 			return pref.SourceLocation{} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| func (p *SourceLocations) lazyInit() *SourceLocations { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			// Collect all the indexes for a given path. | ||||
| 			pathIdxs := make(map[pathKey][]int, len(p.List)) | ||||
| 			for i, l := range p.List { | ||||
| 				k := newPathKey(l.Path) | ||||
| 				pathIdxs[k] = append(pathIdxs[k], i) | ||||
| 			} | ||||
|  | ||||
| 			// Update the next index for all locations. | ||||
| 			p.byPath = make(map[pathKey]int, len(p.List)) | ||||
| 			for k, idxs := range pathIdxs { | ||||
| 				for i := 0; i < len(idxs)-1; i++ { | ||||
| 					p.List[idxs[i]].Next = idxs[i+1] | ||||
| 				} | ||||
| 				p.List[idxs[len(idxs)-1]].Next = 0 | ||||
| 				p.byPath[k] = idxs[0] // record the first location for this path | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
| func (p *SourceLocations) ProtoInternal(pragma.DoNotImplement) {} | ||||
|  | ||||
| // pathKey is a comparable representation of protoreflect.SourcePath. | ||||
| type pathKey struct { | ||||
| 	arr [16]uint8 // first n-1 path segments; last element is the length | ||||
| 	str string    // used if the path does not fit in arr | ||||
| } | ||||
|  | ||||
| func newPathKey(p pref.SourcePath) (k pathKey) { | ||||
| 	if len(p) < len(k.arr) { | ||||
| 		for i, ps := range p { | ||||
| 			if ps < 0 || math.MaxUint8 <= ps { | ||||
| 				return pathKey{str: p.String()} | ||||
| 			} | ||||
| 			k.arr[i] = uint8(ps) | ||||
| 		} | ||||
| 		k.arr[len(k.arr)-1] = uint8(len(p)) | ||||
| 		return k | ||||
| 	} | ||||
| 	return pathKey{str: p.String()} | ||||
| } | ||||
							
								
								
									
										356
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										356
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,356 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-types. DO NOT EDIT. | ||||
|  | ||||
| package filedesc | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/descfmt" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| type Enums struct { | ||||
| 	List   []Enum | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Enum // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Enums) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Enums) Get(i int) protoreflect.EnumDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Enums) ByName(s protoreflect.Name) protoreflect.EnumDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Enums) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Enums) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Enums) lazyInit() *Enums { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Enum, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type EnumValues struct { | ||||
| 	List   []EnumValue | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*EnumValue       // protected by once | ||||
| 	byNum  map[protoreflect.EnumNumber]*EnumValue // protected by once | ||||
| } | ||||
|  | ||||
| func (p *EnumValues) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *EnumValues) Get(i int) protoreflect.EnumValueDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *EnumValues) ByName(s protoreflect.Name) protoreflect.EnumValueDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *EnumValues) ByNumber(n protoreflect.EnumNumber) protoreflect.EnumValueDescriptor { | ||||
| 	if d := p.lazyInit().byNum[n]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *EnumValues) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *EnumValues) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *EnumValues) lazyInit() *EnumValues { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*EnumValue, len(p.List)) | ||||
| 			p.byNum = make(map[protoreflect.EnumNumber]*EnumValue, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 				if _, ok := p.byNum[d.Number()]; !ok { | ||||
| 					p.byNum[d.Number()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type Messages struct { | ||||
| 	List   []Message | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Message // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Messages) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Messages) Get(i int) protoreflect.MessageDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Messages) ByName(s protoreflect.Name) protoreflect.MessageDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Messages) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Messages) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Messages) lazyInit() *Messages { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Message, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type Fields struct { | ||||
| 	List   []Field | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Field        // protected by once | ||||
| 	byJSON map[string]*Field                   // protected by once | ||||
| 	byText map[string]*Field                   // protected by once | ||||
| 	byNum  map[protoreflect.FieldNumber]*Field // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Fields) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Fields) Get(i int) protoreflect.FieldDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Fields) ByName(s protoreflect.Name) protoreflect.FieldDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Fields) ByJSONName(s string) protoreflect.FieldDescriptor { | ||||
| 	if d := p.lazyInit().byJSON[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Fields) ByTextName(s string) protoreflect.FieldDescriptor { | ||||
| 	if d := p.lazyInit().byText[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Fields) ByNumber(n protoreflect.FieldNumber) protoreflect.FieldDescriptor { | ||||
| 	if d := p.lazyInit().byNum[n]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Fields) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Fields) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Fields) lazyInit() *Fields { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Field, len(p.List)) | ||||
| 			p.byJSON = make(map[string]*Field, len(p.List)) | ||||
| 			p.byText = make(map[string]*Field, len(p.List)) | ||||
| 			p.byNum = make(map[protoreflect.FieldNumber]*Field, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 				if _, ok := p.byJSON[d.JSONName()]; !ok { | ||||
| 					p.byJSON[d.JSONName()] = d | ||||
| 				} | ||||
| 				if _, ok := p.byText[d.TextName()]; !ok { | ||||
| 					p.byText[d.TextName()] = d | ||||
| 				} | ||||
| 				if _, ok := p.byNum[d.Number()]; !ok { | ||||
| 					p.byNum[d.Number()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type Oneofs struct { | ||||
| 	List   []Oneof | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Oneof // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Oneofs) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Oneofs) Get(i int) protoreflect.OneofDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Oneofs) ByName(s protoreflect.Name) protoreflect.OneofDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Oneofs) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Oneofs) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Oneofs) lazyInit() *Oneofs { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Oneof, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type Extensions struct { | ||||
| 	List   []Extension | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Extension // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Extensions) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Extensions) Get(i int) protoreflect.ExtensionDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Extensions) ByName(s protoreflect.Name) protoreflect.ExtensionDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Extensions) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Extensions) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Extensions) lazyInit() *Extensions { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Extension, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type Services struct { | ||||
| 	List   []Service | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Service // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Services) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Services) Get(i int) protoreflect.ServiceDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Services) ByName(s protoreflect.Name) protoreflect.ServiceDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Services) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Services) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Services) lazyInit() *Services { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Service, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| type Methods struct { | ||||
| 	List   []Method | ||||
| 	once   sync.Once | ||||
| 	byName map[protoreflect.Name]*Method // protected by once | ||||
| } | ||||
|  | ||||
| func (p *Methods) Len() int { | ||||
| 	return len(p.List) | ||||
| } | ||||
| func (p *Methods) Get(i int) protoreflect.MethodDescriptor { | ||||
| 	return &p.List[i] | ||||
| } | ||||
| func (p *Methods) ByName(s protoreflect.Name) protoreflect.MethodDescriptor { | ||||
| 	if d := p.lazyInit().byName[s]; d != nil { | ||||
| 		return d | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| func (p *Methods) Format(s fmt.State, r rune) { | ||||
| 	descfmt.FormatList(s, r, p) | ||||
| } | ||||
| func (p *Methods) ProtoInternal(pragma.DoNotImplement) {} | ||||
| func (p *Methods) lazyInit() *Methods { | ||||
| 	p.once.Do(func() { | ||||
| 		if len(p.List) > 0 { | ||||
| 			p.byName = make(map[protoreflect.Name]*Method, len(p.List)) | ||||
| 			for i := range p.List { | ||||
| 				d := &p.List[i] | ||||
| 				if _, ok := p.byName[d.Name()]; !ok { | ||||
| 					p.byName[d.Name()] = d | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| 	return p | ||||
| } | ||||
							
								
								
									
										107
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| // 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 filedesc | ||||
|  | ||||
| import ( | ||||
| 	"google.golang.org/protobuf/internal/descopts" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	emptyNames           = new(Names) | ||||
| 	emptyEnumRanges      = new(EnumRanges) | ||||
| 	emptyFieldRanges     = new(FieldRanges) | ||||
| 	emptyFieldNumbers    = new(FieldNumbers) | ||||
| 	emptySourceLocations = new(SourceLocations) | ||||
|  | ||||
| 	emptyFiles      = new(FileImports) | ||||
| 	emptyMessages   = new(Messages) | ||||
| 	emptyFields     = new(Fields) | ||||
| 	emptyOneofs     = new(Oneofs) | ||||
| 	emptyEnums      = new(Enums) | ||||
| 	emptyEnumValues = new(EnumValues) | ||||
| 	emptyExtensions = new(Extensions) | ||||
| 	emptyServices   = new(Services) | ||||
| ) | ||||
|  | ||||
| // PlaceholderFile is a placeholder, representing only the file path. | ||||
| type PlaceholderFile string | ||||
|  | ||||
| func (f PlaceholderFile) ParentFile() pref.FileDescriptor       { return f } | ||||
| func (f PlaceholderFile) Parent() pref.Descriptor               { return nil } | ||||
| func (f PlaceholderFile) Index() int                            { return 0 } | ||||
| func (f PlaceholderFile) Syntax() pref.Syntax                   { return 0 } | ||||
| func (f PlaceholderFile) Name() pref.Name                       { return "" } | ||||
| func (f PlaceholderFile) FullName() pref.FullName               { return "" } | ||||
| func (f PlaceholderFile) IsPlaceholder() bool                   { return true } | ||||
| func (f PlaceholderFile) Options() pref.ProtoMessage            { return descopts.File } | ||||
| func (f PlaceholderFile) Path() string                          { return string(f) } | ||||
| func (f PlaceholderFile) Package() pref.FullName                { return "" } | ||||
| func (f PlaceholderFile) Imports() pref.FileImports             { return emptyFiles } | ||||
| func (f PlaceholderFile) Messages() pref.MessageDescriptors     { return emptyMessages } | ||||
| func (f PlaceholderFile) Enums() pref.EnumDescriptors           { return emptyEnums } | ||||
| func (f PlaceholderFile) Extensions() pref.ExtensionDescriptors { return emptyExtensions } | ||||
| func (f PlaceholderFile) Services() pref.ServiceDescriptors     { return emptyServices } | ||||
| func (f PlaceholderFile) SourceLocations() pref.SourceLocations { return emptySourceLocations } | ||||
| func (f PlaceholderFile) ProtoType(pref.FileDescriptor)         { return } | ||||
| func (f PlaceholderFile) ProtoInternal(pragma.DoNotImplement)   { return } | ||||
|  | ||||
| // PlaceholderEnum is a placeholder, representing only the full name. | ||||
| type PlaceholderEnum pref.FullName | ||||
|  | ||||
| func (e PlaceholderEnum) ParentFile() pref.FileDescriptor     { return nil } | ||||
| func (e PlaceholderEnum) Parent() pref.Descriptor             { return nil } | ||||
| func (e PlaceholderEnum) Index() int                          { return 0 } | ||||
| func (e PlaceholderEnum) Syntax() pref.Syntax                 { return 0 } | ||||
| func (e PlaceholderEnum) Name() pref.Name                     { return pref.FullName(e).Name() } | ||||
| func (e PlaceholderEnum) FullName() pref.FullName             { return pref.FullName(e) } | ||||
| func (e PlaceholderEnum) IsPlaceholder() bool                 { return true } | ||||
| func (e PlaceholderEnum) Options() pref.ProtoMessage          { return descopts.Enum } | ||||
| func (e PlaceholderEnum) Values() pref.EnumValueDescriptors   { return emptyEnumValues } | ||||
| func (e PlaceholderEnum) ReservedNames() pref.Names           { return emptyNames } | ||||
| func (e PlaceholderEnum) ReservedRanges() pref.EnumRanges     { return emptyEnumRanges } | ||||
| func (e PlaceholderEnum) ProtoType(pref.EnumDescriptor)       { return } | ||||
| func (e PlaceholderEnum) ProtoInternal(pragma.DoNotImplement) { return } | ||||
|  | ||||
| // PlaceholderEnumValue is a placeholder, representing only the full name. | ||||
| type PlaceholderEnumValue pref.FullName | ||||
|  | ||||
| func (e PlaceholderEnumValue) ParentFile() pref.FileDescriptor     { return nil } | ||||
| func (e PlaceholderEnumValue) Parent() pref.Descriptor             { return nil } | ||||
| func (e PlaceholderEnumValue) Index() int                          { return 0 } | ||||
| func (e PlaceholderEnumValue) Syntax() pref.Syntax                 { return 0 } | ||||
| func (e PlaceholderEnumValue) Name() pref.Name                     { return pref.FullName(e).Name() } | ||||
| func (e PlaceholderEnumValue) FullName() pref.FullName             { return pref.FullName(e) } | ||||
| func (e PlaceholderEnumValue) IsPlaceholder() bool                 { return true } | ||||
| func (e PlaceholderEnumValue) Options() pref.ProtoMessage          { return descopts.EnumValue } | ||||
| func (e PlaceholderEnumValue) Number() pref.EnumNumber             { return 0 } | ||||
| func (e PlaceholderEnumValue) ProtoType(pref.EnumValueDescriptor)  { return } | ||||
| func (e PlaceholderEnumValue) ProtoInternal(pragma.DoNotImplement) { return } | ||||
|  | ||||
| // PlaceholderMessage is a placeholder, representing only the full name. | ||||
| type PlaceholderMessage pref.FullName | ||||
|  | ||||
| func (m PlaceholderMessage) ParentFile() pref.FileDescriptor             { return nil } | ||||
| func (m PlaceholderMessage) Parent() pref.Descriptor                     { return nil } | ||||
| func (m PlaceholderMessage) Index() int                                  { return 0 } | ||||
| func (m PlaceholderMessage) Syntax() pref.Syntax                         { return 0 } | ||||
| func (m PlaceholderMessage) Name() pref.Name                             { return pref.FullName(m).Name() } | ||||
| func (m PlaceholderMessage) FullName() pref.FullName                     { return pref.FullName(m) } | ||||
| func (m PlaceholderMessage) IsPlaceholder() bool                         { return true } | ||||
| func (m PlaceholderMessage) Options() pref.ProtoMessage                  { return descopts.Message } | ||||
| func (m PlaceholderMessage) IsMapEntry() bool                            { return false } | ||||
| func (m PlaceholderMessage) Fields() pref.FieldDescriptors               { return emptyFields } | ||||
| func (m PlaceholderMessage) Oneofs() pref.OneofDescriptors               { return emptyOneofs } | ||||
| func (m PlaceholderMessage) ReservedNames() pref.Names                   { return emptyNames } | ||||
| func (m PlaceholderMessage) ReservedRanges() pref.FieldRanges            { return emptyFieldRanges } | ||||
| func (m PlaceholderMessage) RequiredNumbers() pref.FieldNumbers          { return emptyFieldNumbers } | ||||
| func (m PlaceholderMessage) ExtensionRanges() pref.FieldRanges           { return emptyFieldRanges } | ||||
| func (m PlaceholderMessage) ExtensionRangeOptions(int) pref.ProtoMessage { panic("index out of range") } | ||||
| func (m PlaceholderMessage) Messages() pref.MessageDescriptors           { return emptyMessages } | ||||
| func (m PlaceholderMessage) Enums() pref.EnumDescriptors                 { return emptyEnums } | ||||
| func (m PlaceholderMessage) Extensions() pref.ExtensionDescriptors       { return emptyExtensions } | ||||
| func (m PlaceholderMessage) ProtoType(pref.MessageDescriptor)            { return } | ||||
| func (m PlaceholderMessage) ProtoInternal(pragma.DoNotImplement)         { return } | ||||
							
								
								
									
										297
									
								
								vendor/google.golang.org/protobuf/internal/filetype/build.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										297
									
								
								vendor/google.golang.org/protobuf/internal/filetype/build.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,297 @@ | ||||
| // 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 filetype provides functionality for wrapping descriptors | ||||
| // with Go type information. | ||||
| package filetype | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/descopts" | ||||
| 	fdesc "google.golang.org/protobuf/internal/filedesc" | ||||
| 	pimpl "google.golang.org/protobuf/internal/impl" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	preg "google.golang.org/protobuf/reflect/protoregistry" | ||||
| ) | ||||
|  | ||||
| // Builder constructs type descriptors from a raw file descriptor | ||||
| // and associated Go types for each enum and message declaration. | ||||
| // | ||||
| // | ||||
| // Flattened Ordering | ||||
| // | ||||
| // The protobuf type system represents declarations as a tree. Certain nodes in | ||||
| // the tree require us to either associate it with a concrete Go type or to | ||||
| // resolve a dependency, which is information that must be provided separately | ||||
| // since it cannot be derived from the file descriptor alone. | ||||
| // | ||||
| // However, representing a tree as Go literals is difficult to simply do in a | ||||
| // space and time efficient way. Thus, we store them as a flattened list of | ||||
| // objects where the serialization order from the tree-based form is important. | ||||
| // | ||||
| // The "flattened ordering" is defined as a tree traversal of all enum, message, | ||||
| // extension, and service declarations using the following algorithm: | ||||
| // | ||||
| //	def VisitFileDecls(fd): | ||||
| //		for e in fd.Enums:      yield e | ||||
| //		for m in fd.Messages:   yield m | ||||
| //		for x in fd.Extensions: yield x | ||||
| //		for s in fd.Services:   yield s | ||||
| //		for m in fd.Messages:   yield from VisitMessageDecls(m) | ||||
| // | ||||
| //	def VisitMessageDecls(md): | ||||
| //		for e in md.Enums:      yield e | ||||
| //		for m in md.Messages:   yield m | ||||
| //		for x in md.Extensions: yield x | ||||
| //		for m in md.Messages:   yield from VisitMessageDecls(m) | ||||
| // | ||||
| // The traversal starts at the root file descriptor and yields each direct | ||||
| // declaration within each node before traversing into sub-declarations | ||||
| // that children themselves may have. | ||||
| type Builder struct { | ||||
| 	// File is the underlying file descriptor builder. | ||||
| 	File fdesc.Builder | ||||
|  | ||||
| 	// GoTypes is a unique set of the Go types for all declarations and | ||||
| 	// dependencies. Each type is represented as a zero value of the Go type. | ||||
| 	// | ||||
| 	// Declarations are Go types generated for enums and messages directly | ||||
| 	// declared (not publicly imported) in the proto source file. | ||||
| 	// Messages for map entries are accounted for, but represented by nil. | ||||
| 	// Enum declarations in "flattened ordering" come first, followed by | ||||
| 	// message declarations in "flattened ordering". | ||||
| 	// | ||||
| 	// Dependencies are Go types for enums or messages referenced by | ||||
| 	// message fields (excluding weak fields), for parent extended messages of | ||||
| 	// extension fields, for enums or messages referenced by extension fields, | ||||
| 	// and for input and output messages referenced by service methods. | ||||
| 	// Dependencies must come after declarations, but the ordering of | ||||
| 	// dependencies themselves is unspecified. | ||||
| 	GoTypes []interface{} | ||||
|  | ||||
| 	// DependencyIndexes is an ordered list of indexes into GoTypes for the | ||||
| 	// dependencies of messages, extensions, or services. | ||||
| 	// | ||||
| 	// There are 5 sub-lists in "flattened ordering" concatenated back-to-back: | ||||
| 	//	0. Message field dependencies: list of the enum or message type | ||||
| 	//	referred to by every message field. | ||||
| 	//	1. Extension field targets: list of the extended parent message of | ||||
| 	//	every extension. | ||||
| 	//	2. Extension field dependencies: list of the enum or message type | ||||
| 	//	referred to by every extension field. | ||||
| 	//	3. Service method inputs: list of the input message type | ||||
| 	//	referred to by every service method. | ||||
| 	//	4. Service method outputs: list of the output message type | ||||
| 	//	referred to by every service method. | ||||
| 	// | ||||
| 	// The offset into DependencyIndexes for the start of each sub-list | ||||
| 	// is appended to the end in reverse order. | ||||
| 	DependencyIndexes []int32 | ||||
|  | ||||
| 	// EnumInfos is a list of enum infos in "flattened ordering". | ||||
| 	EnumInfos []pimpl.EnumInfo | ||||
|  | ||||
| 	// MessageInfos is a list of message infos in "flattened ordering". | ||||
| 	// If provided, the GoType and PBType for each element is populated. | ||||
| 	// | ||||
| 	// Requirement: len(MessageInfos) == len(Build.Messages) | ||||
| 	MessageInfos []pimpl.MessageInfo | ||||
|  | ||||
| 	// ExtensionInfos is a list of extension infos in "flattened ordering". | ||||
| 	// Each element is initialized and registered with the protoregistry package. | ||||
| 	// | ||||
| 	// Requirement: len(LegacyExtensions) == len(Build.Extensions) | ||||
| 	ExtensionInfos []pimpl.ExtensionInfo | ||||
|  | ||||
| 	// TypeRegistry is the registry to register each type descriptor. | ||||
| 	// If nil, it uses protoregistry.GlobalTypes. | ||||
| 	TypeRegistry interface { | ||||
| 		RegisterMessage(pref.MessageType) error | ||||
| 		RegisterEnum(pref.EnumType) error | ||||
| 		RegisterExtension(pref.ExtensionType) error | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Out is the output of the builder. | ||||
| type Out struct { | ||||
| 	File pref.FileDescriptor | ||||
| } | ||||
|  | ||||
| func (tb Builder) Build() (out Out) { | ||||
| 	// Replace the resolver with one that resolves dependencies by index, | ||||
| 	// which is faster and more reliable than relying on the global registry. | ||||
| 	if tb.File.FileRegistry == nil { | ||||
| 		tb.File.FileRegistry = preg.GlobalFiles | ||||
| 	} | ||||
| 	tb.File.FileRegistry = &resolverByIndex{ | ||||
| 		goTypes:      tb.GoTypes, | ||||
| 		depIdxs:      tb.DependencyIndexes, | ||||
| 		fileRegistry: tb.File.FileRegistry, | ||||
| 	} | ||||
|  | ||||
| 	// Initialize registry if unpopulated. | ||||
| 	if tb.TypeRegistry == nil { | ||||
| 		tb.TypeRegistry = preg.GlobalTypes | ||||
| 	} | ||||
|  | ||||
| 	fbOut := tb.File.Build() | ||||
| 	out.File = fbOut.File | ||||
|  | ||||
| 	// Process enums. | ||||
| 	enumGoTypes := tb.GoTypes[:len(fbOut.Enums)] | ||||
| 	if len(tb.EnumInfos) != len(fbOut.Enums) { | ||||
| 		panic("mismatching enum lengths") | ||||
| 	} | ||||
| 	if len(fbOut.Enums) > 0 { | ||||
| 		for i := range fbOut.Enums { | ||||
| 			tb.EnumInfos[i] = pimpl.EnumInfo{ | ||||
| 				GoReflectType: reflect.TypeOf(enumGoTypes[i]), | ||||
| 				Desc:          &fbOut.Enums[i], | ||||
| 			} | ||||
| 			// Register enum types. | ||||
| 			if err := tb.TypeRegistry.RegisterEnum(&tb.EnumInfos[i]); err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Process messages. | ||||
| 	messageGoTypes := tb.GoTypes[len(fbOut.Enums):][:len(fbOut.Messages)] | ||||
| 	if len(tb.MessageInfos) != len(fbOut.Messages) { | ||||
| 		panic("mismatching message lengths") | ||||
| 	} | ||||
| 	if len(fbOut.Messages) > 0 { | ||||
| 		for i := range fbOut.Messages { | ||||
| 			if messageGoTypes[i] == nil { | ||||
| 				continue // skip map entry | ||||
| 			} | ||||
|  | ||||
| 			tb.MessageInfos[i].GoReflectType = reflect.TypeOf(messageGoTypes[i]) | ||||
| 			tb.MessageInfos[i].Desc = &fbOut.Messages[i] | ||||
|  | ||||
| 			// Register message types. | ||||
| 			if err := tb.TypeRegistry.RegisterMessage(&tb.MessageInfos[i]); err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// As a special-case for descriptor.proto, | ||||
| 		// locally register concrete message type for the options. | ||||
| 		if out.File.Path() == "google/protobuf/descriptor.proto" && out.File.Package() == "google.protobuf" { | ||||
| 			for i := range fbOut.Messages { | ||||
| 				switch fbOut.Messages[i].Name() { | ||||
| 				case "FileOptions": | ||||
| 					descopts.File = messageGoTypes[i].(pref.ProtoMessage) | ||||
| 				case "EnumOptions": | ||||
| 					descopts.Enum = messageGoTypes[i].(pref.ProtoMessage) | ||||
| 				case "EnumValueOptions": | ||||
| 					descopts.EnumValue = messageGoTypes[i].(pref.ProtoMessage) | ||||
| 				case "MessageOptions": | ||||
| 					descopts.Message = messageGoTypes[i].(pref.ProtoMessage) | ||||
| 				case "FieldOptions": | ||||
| 					descopts.Field = messageGoTypes[i].(pref.ProtoMessage) | ||||
| 				case "OneofOptions": | ||||
| 					descopts.Oneof = messageGoTypes[i].(pref.ProtoMessage) | ||||
| 				case "ExtensionRangeOptions": | ||||
| 					descopts.ExtensionRange = messageGoTypes[i].(pref.ProtoMessage) | ||||
| 				case "ServiceOptions": | ||||
| 					descopts.Service = messageGoTypes[i].(pref.ProtoMessage) | ||||
| 				case "MethodOptions": | ||||
| 					descopts.Method = messageGoTypes[i].(pref.ProtoMessage) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Process extensions. | ||||
| 	if len(tb.ExtensionInfos) != len(fbOut.Extensions) { | ||||
| 		panic("mismatching extension lengths") | ||||
| 	} | ||||
| 	var depIdx int32 | ||||
| 	for i := range fbOut.Extensions { | ||||
| 		// For enum and message kinds, determine the referent Go type so | ||||
| 		// that we can construct their constructors. | ||||
| 		const listExtDeps = 2 | ||||
| 		var goType reflect.Type | ||||
| 		switch fbOut.Extensions[i].L1.Kind { | ||||
| 		case pref.EnumKind: | ||||
| 			j := depIdxs.Get(tb.DependencyIndexes, listExtDeps, depIdx) | ||||
| 			goType = reflect.TypeOf(tb.GoTypes[j]) | ||||
| 			depIdx++ | ||||
| 		case pref.MessageKind, pref.GroupKind: | ||||
| 			j := depIdxs.Get(tb.DependencyIndexes, listExtDeps, depIdx) | ||||
| 			goType = reflect.TypeOf(tb.GoTypes[j]) | ||||
| 			depIdx++ | ||||
| 		default: | ||||
| 			goType = goTypeForPBKind[fbOut.Extensions[i].L1.Kind] | ||||
| 		} | ||||
| 		if fbOut.Extensions[i].IsList() { | ||||
| 			goType = reflect.SliceOf(goType) | ||||
| 		} | ||||
|  | ||||
| 		pimpl.InitExtensionInfo(&tb.ExtensionInfos[i], &fbOut.Extensions[i], goType) | ||||
|  | ||||
| 		// Register extension types. | ||||
| 		if err := tb.TypeRegistry.RegisterExtension(&tb.ExtensionInfos[i]); err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return out | ||||
| } | ||||
|  | ||||
| var goTypeForPBKind = map[pref.Kind]reflect.Type{ | ||||
| 	pref.BoolKind:     reflect.TypeOf(bool(false)), | ||||
| 	pref.Int32Kind:    reflect.TypeOf(int32(0)), | ||||
| 	pref.Sint32Kind:   reflect.TypeOf(int32(0)), | ||||
| 	pref.Sfixed32Kind: reflect.TypeOf(int32(0)), | ||||
| 	pref.Int64Kind:    reflect.TypeOf(int64(0)), | ||||
| 	pref.Sint64Kind:   reflect.TypeOf(int64(0)), | ||||
| 	pref.Sfixed64Kind: reflect.TypeOf(int64(0)), | ||||
| 	pref.Uint32Kind:   reflect.TypeOf(uint32(0)), | ||||
| 	pref.Fixed32Kind:  reflect.TypeOf(uint32(0)), | ||||
| 	pref.Uint64Kind:   reflect.TypeOf(uint64(0)), | ||||
| 	pref.Fixed64Kind:  reflect.TypeOf(uint64(0)), | ||||
| 	pref.FloatKind:    reflect.TypeOf(float32(0)), | ||||
| 	pref.DoubleKind:   reflect.TypeOf(float64(0)), | ||||
| 	pref.StringKind:   reflect.TypeOf(string("")), | ||||
| 	pref.BytesKind:    reflect.TypeOf([]byte(nil)), | ||||
| } | ||||
|  | ||||
| type depIdxs []int32 | ||||
|  | ||||
| // Get retrieves the jth element of the ith sub-list. | ||||
| func (x depIdxs) Get(i, j int32) int32 { | ||||
| 	return x[x[int32(len(x))-i-1]+j] | ||||
| } | ||||
|  | ||||
| type ( | ||||
| 	resolverByIndex struct { | ||||
| 		goTypes []interface{} | ||||
| 		depIdxs depIdxs | ||||
| 		fileRegistry | ||||
| 	} | ||||
| 	fileRegistry interface { | ||||
| 		FindFileByPath(string) (pref.FileDescriptor, error) | ||||
| 		FindDescriptorByName(pref.FullName) (pref.Descriptor, error) | ||||
| 		RegisterFile(pref.FileDescriptor) error | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func (r *resolverByIndex) FindEnumByIndex(i, j int32, es []fdesc.Enum, ms []fdesc.Message) pref.EnumDescriptor { | ||||
| 	if depIdx := int(r.depIdxs.Get(i, j)); int(depIdx) < len(es)+len(ms) { | ||||
| 		return &es[depIdx] | ||||
| 	} else { | ||||
| 		return pimpl.Export{}.EnumDescriptorOf(r.goTypes[depIdx]) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (r *resolverByIndex) FindMessageByIndex(i, j int32, es []fdesc.Enum, ms []fdesc.Message) pref.MessageDescriptor { | ||||
| 	if depIdx := int(r.depIdxs.Get(i, j)); depIdx < len(es)+len(ms) { | ||||
| 		return &ms[depIdx-len(es)] | ||||
| 	} else { | ||||
| 		return pimpl.Export{}.MessageDescriptorOf(r.goTypes[depIdx]) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										24
									
								
								vendor/google.golang.org/protobuf/internal/flags/flags.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								vendor/google.golang.org/protobuf/internal/flags/flags.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| // 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 flags provides a set of flags controlled by build tags. | ||||
| package flags | ||||
|  | ||||
| // ProtoLegacy specifies whether to enable support for legacy functionality | ||||
| // such as MessageSets, weak fields, and various other obscure behavior | ||||
| // that is necessary to maintain backwards compatibility with proto1 or | ||||
| // the pre-release variants of proto2 and proto3. | ||||
| // | ||||
| // This is disabled by default unless built with the "protolegacy" tag. | ||||
| // | ||||
| // WARNING: The compatibility agreement covers nothing provided by this flag. | ||||
| // As such, functionality may suddenly be removed or changed at our discretion. | ||||
| const ProtoLegacy = protoLegacy | ||||
|  | ||||
| // LazyUnmarshalExtensions specifies whether to lazily unmarshal extensions. | ||||
| // | ||||
| // Lazy extension unmarshaling validates the contents of message-valued | ||||
| // extension fields at unmarshal time, but defers creating the message | ||||
| // structure until the extension is first accessed. | ||||
| const LazyUnmarshalExtensions = ProtoLegacy | ||||
							
								
								
									
										10
									
								
								vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| // 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. | ||||
|  | ||||
| //go:build !protolegacy | ||||
| // +build !protolegacy | ||||
|  | ||||
| package flags | ||||
|  | ||||
| const protoLegacy = false | ||||
							
								
								
									
										10
									
								
								vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| // 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. | ||||
|  | ||||
| //go:build protolegacy | ||||
| // +build protolegacy | ||||
|  | ||||
| package flags | ||||
|  | ||||
| const protoLegacy = true | ||||
							
								
								
									
										34
									
								
								vendor/google.golang.org/protobuf/internal/genid/any_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/google.golang.org/protobuf/internal/genid/any_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-protos. DO NOT EDIT. | ||||
|  | ||||
| package genid | ||||
|  | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| const File_google_protobuf_any_proto = "google/protobuf/any.proto" | ||||
|  | ||||
| // Names for google.protobuf.Any. | ||||
| const ( | ||||
| 	Any_message_name     protoreflect.Name     = "Any" | ||||
| 	Any_message_fullname protoreflect.FullName = "google.protobuf.Any" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Any. | ||||
| const ( | ||||
| 	Any_TypeUrl_field_name protoreflect.Name = "type_url" | ||||
| 	Any_Value_field_name   protoreflect.Name = "value" | ||||
|  | ||||
| 	Any_TypeUrl_field_fullname protoreflect.FullName = "google.protobuf.Any.type_url" | ||||
| 	Any_Value_field_fullname   protoreflect.FullName = "google.protobuf.Any.value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Any. | ||||
| const ( | ||||
| 	Any_TypeUrl_field_number protoreflect.FieldNumber = 1 | ||||
| 	Any_Value_field_number   protoreflect.FieldNumber = 2 | ||||
| ) | ||||
							
								
								
									
										106
									
								
								vendor/google.golang.org/protobuf/internal/genid/api_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								vendor/google.golang.org/protobuf/internal/genid/api_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-protos. DO NOT EDIT. | ||||
|  | ||||
| package genid | ||||
|  | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| const File_google_protobuf_api_proto = "google/protobuf/api.proto" | ||||
|  | ||||
| // Names for google.protobuf.Api. | ||||
| const ( | ||||
| 	Api_message_name     protoreflect.Name     = "Api" | ||||
| 	Api_message_fullname protoreflect.FullName = "google.protobuf.Api" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Api. | ||||
| const ( | ||||
| 	Api_Name_field_name          protoreflect.Name = "name" | ||||
| 	Api_Methods_field_name       protoreflect.Name = "methods" | ||||
| 	Api_Options_field_name       protoreflect.Name = "options" | ||||
| 	Api_Version_field_name       protoreflect.Name = "version" | ||||
| 	Api_SourceContext_field_name protoreflect.Name = "source_context" | ||||
| 	Api_Mixins_field_name        protoreflect.Name = "mixins" | ||||
| 	Api_Syntax_field_name        protoreflect.Name = "syntax" | ||||
|  | ||||
| 	Api_Name_field_fullname          protoreflect.FullName = "google.protobuf.Api.name" | ||||
| 	Api_Methods_field_fullname       protoreflect.FullName = "google.protobuf.Api.methods" | ||||
| 	Api_Options_field_fullname       protoreflect.FullName = "google.protobuf.Api.options" | ||||
| 	Api_Version_field_fullname       protoreflect.FullName = "google.protobuf.Api.version" | ||||
| 	Api_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Api.source_context" | ||||
| 	Api_Mixins_field_fullname        protoreflect.FullName = "google.protobuf.Api.mixins" | ||||
| 	Api_Syntax_field_fullname        protoreflect.FullName = "google.protobuf.Api.syntax" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Api. | ||||
| const ( | ||||
| 	Api_Name_field_number          protoreflect.FieldNumber = 1 | ||||
| 	Api_Methods_field_number       protoreflect.FieldNumber = 2 | ||||
| 	Api_Options_field_number       protoreflect.FieldNumber = 3 | ||||
| 	Api_Version_field_number       protoreflect.FieldNumber = 4 | ||||
| 	Api_SourceContext_field_number protoreflect.FieldNumber = 5 | ||||
| 	Api_Mixins_field_number        protoreflect.FieldNumber = 6 | ||||
| 	Api_Syntax_field_number        protoreflect.FieldNumber = 7 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.Method. | ||||
| const ( | ||||
| 	Method_message_name     protoreflect.Name     = "Method" | ||||
| 	Method_message_fullname protoreflect.FullName = "google.protobuf.Method" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Method. | ||||
| const ( | ||||
| 	Method_Name_field_name              protoreflect.Name = "name" | ||||
| 	Method_RequestTypeUrl_field_name    protoreflect.Name = "request_type_url" | ||||
| 	Method_RequestStreaming_field_name  protoreflect.Name = "request_streaming" | ||||
| 	Method_ResponseTypeUrl_field_name   protoreflect.Name = "response_type_url" | ||||
| 	Method_ResponseStreaming_field_name protoreflect.Name = "response_streaming" | ||||
| 	Method_Options_field_name           protoreflect.Name = "options" | ||||
| 	Method_Syntax_field_name            protoreflect.Name = "syntax" | ||||
|  | ||||
| 	Method_Name_field_fullname              protoreflect.FullName = "google.protobuf.Method.name" | ||||
| 	Method_RequestTypeUrl_field_fullname    protoreflect.FullName = "google.protobuf.Method.request_type_url" | ||||
| 	Method_RequestStreaming_field_fullname  protoreflect.FullName = "google.protobuf.Method.request_streaming" | ||||
| 	Method_ResponseTypeUrl_field_fullname   protoreflect.FullName = "google.protobuf.Method.response_type_url" | ||||
| 	Method_ResponseStreaming_field_fullname protoreflect.FullName = "google.protobuf.Method.response_streaming" | ||||
| 	Method_Options_field_fullname           protoreflect.FullName = "google.protobuf.Method.options" | ||||
| 	Method_Syntax_field_fullname            protoreflect.FullName = "google.protobuf.Method.syntax" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Method. | ||||
| const ( | ||||
| 	Method_Name_field_number              protoreflect.FieldNumber = 1 | ||||
| 	Method_RequestTypeUrl_field_number    protoreflect.FieldNumber = 2 | ||||
| 	Method_RequestStreaming_field_number  protoreflect.FieldNumber = 3 | ||||
| 	Method_ResponseTypeUrl_field_number   protoreflect.FieldNumber = 4 | ||||
| 	Method_ResponseStreaming_field_number protoreflect.FieldNumber = 5 | ||||
| 	Method_Options_field_number           protoreflect.FieldNumber = 6 | ||||
| 	Method_Syntax_field_number            protoreflect.FieldNumber = 7 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.Mixin. | ||||
| const ( | ||||
| 	Mixin_message_name     protoreflect.Name     = "Mixin" | ||||
| 	Mixin_message_fullname protoreflect.FullName = "google.protobuf.Mixin" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Mixin. | ||||
| const ( | ||||
| 	Mixin_Name_field_name protoreflect.Name = "name" | ||||
| 	Mixin_Root_field_name protoreflect.Name = "root" | ||||
|  | ||||
| 	Mixin_Name_field_fullname protoreflect.FullName = "google.protobuf.Mixin.name" | ||||
| 	Mixin_Root_field_fullname protoreflect.FullName = "google.protobuf.Mixin.root" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Mixin. | ||||
| const ( | ||||
| 	Mixin_Name_field_number protoreflect.FieldNumber = 1 | ||||
| 	Mixin_Root_field_number protoreflect.FieldNumber = 2 | ||||
| ) | ||||
							
								
								
									
										829
									
								
								vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										829
									
								
								vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,829 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-protos. DO NOT EDIT. | ||||
|  | ||||
| package genid | ||||
|  | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| const File_google_protobuf_descriptor_proto = "google/protobuf/descriptor.proto" | ||||
|  | ||||
| // Names for google.protobuf.FileDescriptorSet. | ||||
| const ( | ||||
| 	FileDescriptorSet_message_name     protoreflect.Name     = "FileDescriptorSet" | ||||
| 	FileDescriptorSet_message_fullname protoreflect.FullName = "google.protobuf.FileDescriptorSet" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.FileDescriptorSet. | ||||
| const ( | ||||
| 	FileDescriptorSet_File_field_name protoreflect.Name = "file" | ||||
|  | ||||
| 	FileDescriptorSet_File_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorSet.file" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.FileDescriptorSet. | ||||
| const ( | ||||
| 	FileDescriptorSet_File_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.FileDescriptorProto. | ||||
| const ( | ||||
| 	FileDescriptorProto_message_name     protoreflect.Name     = "FileDescriptorProto" | ||||
| 	FileDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.FileDescriptorProto. | ||||
| const ( | ||||
| 	FileDescriptorProto_Name_field_name             protoreflect.Name = "name" | ||||
| 	FileDescriptorProto_Package_field_name          protoreflect.Name = "package" | ||||
| 	FileDescriptorProto_Dependency_field_name       protoreflect.Name = "dependency" | ||||
| 	FileDescriptorProto_PublicDependency_field_name protoreflect.Name = "public_dependency" | ||||
| 	FileDescriptorProto_WeakDependency_field_name   protoreflect.Name = "weak_dependency" | ||||
| 	FileDescriptorProto_MessageType_field_name      protoreflect.Name = "message_type" | ||||
| 	FileDescriptorProto_EnumType_field_name         protoreflect.Name = "enum_type" | ||||
| 	FileDescriptorProto_Service_field_name          protoreflect.Name = "service" | ||||
| 	FileDescriptorProto_Extension_field_name        protoreflect.Name = "extension" | ||||
| 	FileDescriptorProto_Options_field_name          protoreflect.Name = "options" | ||||
| 	FileDescriptorProto_SourceCodeInfo_field_name   protoreflect.Name = "source_code_info" | ||||
| 	FileDescriptorProto_Syntax_field_name           protoreflect.Name = "syntax" | ||||
|  | ||||
| 	FileDescriptorProto_Name_field_fullname             protoreflect.FullName = "google.protobuf.FileDescriptorProto.name" | ||||
| 	FileDescriptorProto_Package_field_fullname          protoreflect.FullName = "google.protobuf.FileDescriptorProto.package" | ||||
| 	FileDescriptorProto_Dependency_field_fullname       protoreflect.FullName = "google.protobuf.FileDescriptorProto.dependency" | ||||
| 	FileDescriptorProto_PublicDependency_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.public_dependency" | ||||
| 	FileDescriptorProto_WeakDependency_field_fullname   protoreflect.FullName = "google.protobuf.FileDescriptorProto.weak_dependency" | ||||
| 	FileDescriptorProto_MessageType_field_fullname      protoreflect.FullName = "google.protobuf.FileDescriptorProto.message_type" | ||||
| 	FileDescriptorProto_EnumType_field_fullname         protoreflect.FullName = "google.protobuf.FileDescriptorProto.enum_type" | ||||
| 	FileDescriptorProto_Service_field_fullname          protoreflect.FullName = "google.protobuf.FileDescriptorProto.service" | ||||
| 	FileDescriptorProto_Extension_field_fullname        protoreflect.FullName = "google.protobuf.FileDescriptorProto.extension" | ||||
| 	FileDescriptorProto_Options_field_fullname          protoreflect.FullName = "google.protobuf.FileDescriptorProto.options" | ||||
| 	FileDescriptorProto_SourceCodeInfo_field_fullname   protoreflect.FullName = "google.protobuf.FileDescriptorProto.source_code_info" | ||||
| 	FileDescriptorProto_Syntax_field_fullname           protoreflect.FullName = "google.protobuf.FileDescriptorProto.syntax" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.FileDescriptorProto. | ||||
| const ( | ||||
| 	FileDescriptorProto_Name_field_number             protoreflect.FieldNumber = 1 | ||||
| 	FileDescriptorProto_Package_field_number          protoreflect.FieldNumber = 2 | ||||
| 	FileDescriptorProto_Dependency_field_number       protoreflect.FieldNumber = 3 | ||||
| 	FileDescriptorProto_PublicDependency_field_number protoreflect.FieldNumber = 10 | ||||
| 	FileDescriptorProto_WeakDependency_field_number   protoreflect.FieldNumber = 11 | ||||
| 	FileDescriptorProto_MessageType_field_number      protoreflect.FieldNumber = 4 | ||||
| 	FileDescriptorProto_EnumType_field_number         protoreflect.FieldNumber = 5 | ||||
| 	FileDescriptorProto_Service_field_number          protoreflect.FieldNumber = 6 | ||||
| 	FileDescriptorProto_Extension_field_number        protoreflect.FieldNumber = 7 | ||||
| 	FileDescriptorProto_Options_field_number          protoreflect.FieldNumber = 8 | ||||
| 	FileDescriptorProto_SourceCodeInfo_field_number   protoreflect.FieldNumber = 9 | ||||
| 	FileDescriptorProto_Syntax_field_number           protoreflect.FieldNumber = 12 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.DescriptorProto. | ||||
| const ( | ||||
| 	DescriptorProto_message_name     protoreflect.Name     = "DescriptorProto" | ||||
| 	DescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.DescriptorProto" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.DescriptorProto. | ||||
| const ( | ||||
| 	DescriptorProto_Name_field_name           protoreflect.Name = "name" | ||||
| 	DescriptorProto_Field_field_name          protoreflect.Name = "field" | ||||
| 	DescriptorProto_Extension_field_name      protoreflect.Name = "extension" | ||||
| 	DescriptorProto_NestedType_field_name     protoreflect.Name = "nested_type" | ||||
| 	DescriptorProto_EnumType_field_name       protoreflect.Name = "enum_type" | ||||
| 	DescriptorProto_ExtensionRange_field_name protoreflect.Name = "extension_range" | ||||
| 	DescriptorProto_OneofDecl_field_name      protoreflect.Name = "oneof_decl" | ||||
| 	DescriptorProto_Options_field_name        protoreflect.Name = "options" | ||||
| 	DescriptorProto_ReservedRange_field_name  protoreflect.Name = "reserved_range" | ||||
| 	DescriptorProto_ReservedName_field_name   protoreflect.Name = "reserved_name" | ||||
|  | ||||
| 	DescriptorProto_Name_field_fullname           protoreflect.FullName = "google.protobuf.DescriptorProto.name" | ||||
| 	DescriptorProto_Field_field_fullname          protoreflect.FullName = "google.protobuf.DescriptorProto.field" | ||||
| 	DescriptorProto_Extension_field_fullname      protoreflect.FullName = "google.protobuf.DescriptorProto.extension" | ||||
| 	DescriptorProto_NestedType_field_fullname     protoreflect.FullName = "google.protobuf.DescriptorProto.nested_type" | ||||
| 	DescriptorProto_EnumType_field_fullname       protoreflect.FullName = "google.protobuf.DescriptorProto.enum_type" | ||||
| 	DescriptorProto_ExtensionRange_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.extension_range" | ||||
| 	DescriptorProto_OneofDecl_field_fullname      protoreflect.FullName = "google.protobuf.DescriptorProto.oneof_decl" | ||||
| 	DescriptorProto_Options_field_fullname        protoreflect.FullName = "google.protobuf.DescriptorProto.options" | ||||
| 	DescriptorProto_ReservedRange_field_fullname  protoreflect.FullName = "google.protobuf.DescriptorProto.reserved_range" | ||||
| 	DescriptorProto_ReservedName_field_fullname   protoreflect.FullName = "google.protobuf.DescriptorProto.reserved_name" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.DescriptorProto. | ||||
| const ( | ||||
| 	DescriptorProto_Name_field_number           protoreflect.FieldNumber = 1 | ||||
| 	DescriptorProto_Field_field_number          protoreflect.FieldNumber = 2 | ||||
| 	DescriptorProto_Extension_field_number      protoreflect.FieldNumber = 6 | ||||
| 	DescriptorProto_NestedType_field_number     protoreflect.FieldNumber = 3 | ||||
| 	DescriptorProto_EnumType_field_number       protoreflect.FieldNumber = 4 | ||||
| 	DescriptorProto_ExtensionRange_field_number protoreflect.FieldNumber = 5 | ||||
| 	DescriptorProto_OneofDecl_field_number      protoreflect.FieldNumber = 8 | ||||
| 	DescriptorProto_Options_field_number        protoreflect.FieldNumber = 7 | ||||
| 	DescriptorProto_ReservedRange_field_number  protoreflect.FieldNumber = 9 | ||||
| 	DescriptorProto_ReservedName_field_number   protoreflect.FieldNumber = 10 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.DescriptorProto.ExtensionRange. | ||||
| const ( | ||||
| 	DescriptorProto_ExtensionRange_message_name     protoreflect.Name     = "ExtensionRange" | ||||
| 	DescriptorProto_ExtensionRange_message_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ExtensionRange" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.DescriptorProto.ExtensionRange. | ||||
| const ( | ||||
| 	DescriptorProto_ExtensionRange_Start_field_name   protoreflect.Name = "start" | ||||
| 	DescriptorProto_ExtensionRange_End_field_name     protoreflect.Name = "end" | ||||
| 	DescriptorProto_ExtensionRange_Options_field_name protoreflect.Name = "options" | ||||
|  | ||||
| 	DescriptorProto_ExtensionRange_Start_field_fullname   protoreflect.FullName = "google.protobuf.DescriptorProto.ExtensionRange.start" | ||||
| 	DescriptorProto_ExtensionRange_End_field_fullname     protoreflect.FullName = "google.protobuf.DescriptorProto.ExtensionRange.end" | ||||
| 	DescriptorProto_ExtensionRange_Options_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ExtensionRange.options" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.DescriptorProto.ExtensionRange. | ||||
| const ( | ||||
| 	DescriptorProto_ExtensionRange_Start_field_number   protoreflect.FieldNumber = 1 | ||||
| 	DescriptorProto_ExtensionRange_End_field_number     protoreflect.FieldNumber = 2 | ||||
| 	DescriptorProto_ExtensionRange_Options_field_number protoreflect.FieldNumber = 3 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.DescriptorProto.ReservedRange. | ||||
| const ( | ||||
| 	DescriptorProto_ReservedRange_message_name     protoreflect.Name     = "ReservedRange" | ||||
| 	DescriptorProto_ReservedRange_message_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ReservedRange" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.DescriptorProto.ReservedRange. | ||||
| const ( | ||||
| 	DescriptorProto_ReservedRange_Start_field_name protoreflect.Name = "start" | ||||
| 	DescriptorProto_ReservedRange_End_field_name   protoreflect.Name = "end" | ||||
|  | ||||
| 	DescriptorProto_ReservedRange_Start_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ReservedRange.start" | ||||
| 	DescriptorProto_ReservedRange_End_field_fullname   protoreflect.FullName = "google.protobuf.DescriptorProto.ReservedRange.end" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.DescriptorProto.ReservedRange. | ||||
| const ( | ||||
| 	DescriptorProto_ReservedRange_Start_field_number protoreflect.FieldNumber = 1 | ||||
| 	DescriptorProto_ReservedRange_End_field_number   protoreflect.FieldNumber = 2 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.ExtensionRangeOptions. | ||||
| const ( | ||||
| 	ExtensionRangeOptions_message_name     protoreflect.Name     = "ExtensionRangeOptions" | ||||
| 	ExtensionRangeOptions_message_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.ExtensionRangeOptions. | ||||
| const ( | ||||
| 	ExtensionRangeOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" | ||||
|  | ||||
| 	ExtensionRangeOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.uninterpreted_option" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.ExtensionRangeOptions. | ||||
| const ( | ||||
| 	ExtensionRangeOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.FieldDescriptorProto. | ||||
| const ( | ||||
| 	FieldDescriptorProto_message_name     protoreflect.Name     = "FieldDescriptorProto" | ||||
| 	FieldDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.FieldDescriptorProto. | ||||
| const ( | ||||
| 	FieldDescriptorProto_Name_field_name           protoreflect.Name = "name" | ||||
| 	FieldDescriptorProto_Number_field_name         protoreflect.Name = "number" | ||||
| 	FieldDescriptorProto_Label_field_name          protoreflect.Name = "label" | ||||
| 	FieldDescriptorProto_Type_field_name           protoreflect.Name = "type" | ||||
| 	FieldDescriptorProto_TypeName_field_name       protoreflect.Name = "type_name" | ||||
| 	FieldDescriptorProto_Extendee_field_name       protoreflect.Name = "extendee" | ||||
| 	FieldDescriptorProto_DefaultValue_field_name   protoreflect.Name = "default_value" | ||||
| 	FieldDescriptorProto_OneofIndex_field_name     protoreflect.Name = "oneof_index" | ||||
| 	FieldDescriptorProto_JsonName_field_name       protoreflect.Name = "json_name" | ||||
| 	FieldDescriptorProto_Options_field_name        protoreflect.Name = "options" | ||||
| 	FieldDescriptorProto_Proto3Optional_field_name protoreflect.Name = "proto3_optional" | ||||
|  | ||||
| 	FieldDescriptorProto_Name_field_fullname           protoreflect.FullName = "google.protobuf.FieldDescriptorProto.name" | ||||
| 	FieldDescriptorProto_Number_field_fullname         protoreflect.FullName = "google.protobuf.FieldDescriptorProto.number" | ||||
| 	FieldDescriptorProto_Label_field_fullname          protoreflect.FullName = "google.protobuf.FieldDescriptorProto.label" | ||||
| 	FieldDescriptorProto_Type_field_fullname           protoreflect.FullName = "google.protobuf.FieldDescriptorProto.type" | ||||
| 	FieldDescriptorProto_TypeName_field_fullname       protoreflect.FullName = "google.protobuf.FieldDescriptorProto.type_name" | ||||
| 	FieldDescriptorProto_Extendee_field_fullname       protoreflect.FullName = "google.protobuf.FieldDescriptorProto.extendee" | ||||
| 	FieldDescriptorProto_DefaultValue_field_fullname   protoreflect.FullName = "google.protobuf.FieldDescriptorProto.default_value" | ||||
| 	FieldDescriptorProto_OneofIndex_field_fullname     protoreflect.FullName = "google.protobuf.FieldDescriptorProto.oneof_index" | ||||
| 	FieldDescriptorProto_JsonName_field_fullname       protoreflect.FullName = "google.protobuf.FieldDescriptorProto.json_name" | ||||
| 	FieldDescriptorProto_Options_field_fullname        protoreflect.FullName = "google.protobuf.FieldDescriptorProto.options" | ||||
| 	FieldDescriptorProto_Proto3Optional_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.proto3_optional" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.FieldDescriptorProto. | ||||
| const ( | ||||
| 	FieldDescriptorProto_Name_field_number           protoreflect.FieldNumber = 1 | ||||
| 	FieldDescriptorProto_Number_field_number         protoreflect.FieldNumber = 3 | ||||
| 	FieldDescriptorProto_Label_field_number          protoreflect.FieldNumber = 4 | ||||
| 	FieldDescriptorProto_Type_field_number           protoreflect.FieldNumber = 5 | ||||
| 	FieldDescriptorProto_TypeName_field_number       protoreflect.FieldNumber = 6 | ||||
| 	FieldDescriptorProto_Extendee_field_number       protoreflect.FieldNumber = 2 | ||||
| 	FieldDescriptorProto_DefaultValue_field_number   protoreflect.FieldNumber = 7 | ||||
| 	FieldDescriptorProto_OneofIndex_field_number     protoreflect.FieldNumber = 9 | ||||
| 	FieldDescriptorProto_JsonName_field_number       protoreflect.FieldNumber = 10 | ||||
| 	FieldDescriptorProto_Options_field_number        protoreflect.FieldNumber = 8 | ||||
| 	FieldDescriptorProto_Proto3Optional_field_number protoreflect.FieldNumber = 17 | ||||
| ) | ||||
|  | ||||
| // Full and short names for google.protobuf.FieldDescriptorProto.Type. | ||||
| const ( | ||||
| 	FieldDescriptorProto_Type_enum_fullname = "google.protobuf.FieldDescriptorProto.Type" | ||||
| 	FieldDescriptorProto_Type_enum_name     = "Type" | ||||
| ) | ||||
|  | ||||
| // Full and short names for google.protobuf.FieldDescriptorProto.Label. | ||||
| const ( | ||||
| 	FieldDescriptorProto_Label_enum_fullname = "google.protobuf.FieldDescriptorProto.Label" | ||||
| 	FieldDescriptorProto_Label_enum_name     = "Label" | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.OneofDescriptorProto. | ||||
| const ( | ||||
| 	OneofDescriptorProto_message_name     protoreflect.Name     = "OneofDescriptorProto" | ||||
| 	OneofDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.OneofDescriptorProto" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.OneofDescriptorProto. | ||||
| const ( | ||||
| 	OneofDescriptorProto_Name_field_name    protoreflect.Name = "name" | ||||
| 	OneofDescriptorProto_Options_field_name protoreflect.Name = "options" | ||||
|  | ||||
| 	OneofDescriptorProto_Name_field_fullname    protoreflect.FullName = "google.protobuf.OneofDescriptorProto.name" | ||||
| 	OneofDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.OneofDescriptorProto.options" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.OneofDescriptorProto. | ||||
| const ( | ||||
| 	OneofDescriptorProto_Name_field_number    protoreflect.FieldNumber = 1 | ||||
| 	OneofDescriptorProto_Options_field_number protoreflect.FieldNumber = 2 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.EnumDescriptorProto. | ||||
| const ( | ||||
| 	EnumDescriptorProto_message_name     protoreflect.Name     = "EnumDescriptorProto" | ||||
| 	EnumDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.EnumDescriptorProto. | ||||
| const ( | ||||
| 	EnumDescriptorProto_Name_field_name          protoreflect.Name = "name" | ||||
| 	EnumDescriptorProto_Value_field_name         protoreflect.Name = "value" | ||||
| 	EnumDescriptorProto_Options_field_name       protoreflect.Name = "options" | ||||
| 	EnumDescriptorProto_ReservedRange_field_name protoreflect.Name = "reserved_range" | ||||
| 	EnumDescriptorProto_ReservedName_field_name  protoreflect.Name = "reserved_name" | ||||
|  | ||||
| 	EnumDescriptorProto_Name_field_fullname          protoreflect.FullName = "google.protobuf.EnumDescriptorProto.name" | ||||
| 	EnumDescriptorProto_Value_field_fullname         protoreflect.FullName = "google.protobuf.EnumDescriptorProto.value" | ||||
| 	EnumDescriptorProto_Options_field_fullname       protoreflect.FullName = "google.protobuf.EnumDescriptorProto.options" | ||||
| 	EnumDescriptorProto_ReservedRange_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.reserved_range" | ||||
| 	EnumDescriptorProto_ReservedName_field_fullname  protoreflect.FullName = "google.protobuf.EnumDescriptorProto.reserved_name" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.EnumDescriptorProto. | ||||
| const ( | ||||
| 	EnumDescriptorProto_Name_field_number          protoreflect.FieldNumber = 1 | ||||
| 	EnumDescriptorProto_Value_field_number         protoreflect.FieldNumber = 2 | ||||
| 	EnumDescriptorProto_Options_field_number       protoreflect.FieldNumber = 3 | ||||
| 	EnumDescriptorProto_ReservedRange_field_number protoreflect.FieldNumber = 4 | ||||
| 	EnumDescriptorProto_ReservedName_field_number  protoreflect.FieldNumber = 5 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.EnumDescriptorProto.EnumReservedRange. | ||||
| const ( | ||||
| 	EnumDescriptorProto_EnumReservedRange_message_name     protoreflect.Name     = "EnumReservedRange" | ||||
| 	EnumDescriptorProto_EnumReservedRange_message_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.EnumReservedRange" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.EnumDescriptorProto.EnumReservedRange. | ||||
| const ( | ||||
| 	EnumDescriptorProto_EnumReservedRange_Start_field_name protoreflect.Name = "start" | ||||
| 	EnumDescriptorProto_EnumReservedRange_End_field_name   protoreflect.Name = "end" | ||||
|  | ||||
| 	EnumDescriptorProto_EnumReservedRange_Start_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.EnumReservedRange.start" | ||||
| 	EnumDescriptorProto_EnumReservedRange_End_field_fullname   protoreflect.FullName = "google.protobuf.EnumDescriptorProto.EnumReservedRange.end" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.EnumDescriptorProto.EnumReservedRange. | ||||
| const ( | ||||
| 	EnumDescriptorProto_EnumReservedRange_Start_field_number protoreflect.FieldNumber = 1 | ||||
| 	EnumDescriptorProto_EnumReservedRange_End_field_number   protoreflect.FieldNumber = 2 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.EnumValueDescriptorProto. | ||||
| const ( | ||||
| 	EnumValueDescriptorProto_message_name     protoreflect.Name     = "EnumValueDescriptorProto" | ||||
| 	EnumValueDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.EnumValueDescriptorProto" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.EnumValueDescriptorProto. | ||||
| const ( | ||||
| 	EnumValueDescriptorProto_Name_field_name    protoreflect.Name = "name" | ||||
| 	EnumValueDescriptorProto_Number_field_name  protoreflect.Name = "number" | ||||
| 	EnumValueDescriptorProto_Options_field_name protoreflect.Name = "options" | ||||
|  | ||||
| 	EnumValueDescriptorProto_Name_field_fullname    protoreflect.FullName = "google.protobuf.EnumValueDescriptorProto.name" | ||||
| 	EnumValueDescriptorProto_Number_field_fullname  protoreflect.FullName = "google.protobuf.EnumValueDescriptorProto.number" | ||||
| 	EnumValueDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.EnumValueDescriptorProto.options" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.EnumValueDescriptorProto. | ||||
| const ( | ||||
| 	EnumValueDescriptorProto_Name_field_number    protoreflect.FieldNumber = 1 | ||||
| 	EnumValueDescriptorProto_Number_field_number  protoreflect.FieldNumber = 2 | ||||
| 	EnumValueDescriptorProto_Options_field_number protoreflect.FieldNumber = 3 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.ServiceDescriptorProto. | ||||
| const ( | ||||
| 	ServiceDescriptorProto_message_name     protoreflect.Name     = "ServiceDescriptorProto" | ||||
| 	ServiceDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.ServiceDescriptorProto" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.ServiceDescriptorProto. | ||||
| const ( | ||||
| 	ServiceDescriptorProto_Name_field_name    protoreflect.Name = "name" | ||||
| 	ServiceDescriptorProto_Method_field_name  protoreflect.Name = "method" | ||||
| 	ServiceDescriptorProto_Options_field_name protoreflect.Name = "options" | ||||
|  | ||||
| 	ServiceDescriptorProto_Name_field_fullname    protoreflect.FullName = "google.protobuf.ServiceDescriptorProto.name" | ||||
| 	ServiceDescriptorProto_Method_field_fullname  protoreflect.FullName = "google.protobuf.ServiceDescriptorProto.method" | ||||
| 	ServiceDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.ServiceDescriptorProto.options" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.ServiceDescriptorProto. | ||||
| const ( | ||||
| 	ServiceDescriptorProto_Name_field_number    protoreflect.FieldNumber = 1 | ||||
| 	ServiceDescriptorProto_Method_field_number  protoreflect.FieldNumber = 2 | ||||
| 	ServiceDescriptorProto_Options_field_number protoreflect.FieldNumber = 3 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.MethodDescriptorProto. | ||||
| const ( | ||||
| 	MethodDescriptorProto_message_name     protoreflect.Name     = "MethodDescriptorProto" | ||||
| 	MethodDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.MethodDescriptorProto. | ||||
| const ( | ||||
| 	MethodDescriptorProto_Name_field_name            protoreflect.Name = "name" | ||||
| 	MethodDescriptorProto_InputType_field_name       protoreflect.Name = "input_type" | ||||
| 	MethodDescriptorProto_OutputType_field_name      protoreflect.Name = "output_type" | ||||
| 	MethodDescriptorProto_Options_field_name         protoreflect.Name = "options" | ||||
| 	MethodDescriptorProto_ClientStreaming_field_name protoreflect.Name = "client_streaming" | ||||
| 	MethodDescriptorProto_ServerStreaming_field_name protoreflect.Name = "server_streaming" | ||||
|  | ||||
| 	MethodDescriptorProto_Name_field_fullname            protoreflect.FullName = "google.protobuf.MethodDescriptorProto.name" | ||||
| 	MethodDescriptorProto_InputType_field_fullname       protoreflect.FullName = "google.protobuf.MethodDescriptorProto.input_type" | ||||
| 	MethodDescriptorProto_OutputType_field_fullname      protoreflect.FullName = "google.protobuf.MethodDescriptorProto.output_type" | ||||
| 	MethodDescriptorProto_Options_field_fullname         protoreflect.FullName = "google.protobuf.MethodDescriptorProto.options" | ||||
| 	MethodDescriptorProto_ClientStreaming_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.client_streaming" | ||||
| 	MethodDescriptorProto_ServerStreaming_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.server_streaming" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.MethodDescriptorProto. | ||||
| const ( | ||||
| 	MethodDescriptorProto_Name_field_number            protoreflect.FieldNumber = 1 | ||||
| 	MethodDescriptorProto_InputType_field_number       protoreflect.FieldNumber = 2 | ||||
| 	MethodDescriptorProto_OutputType_field_number      protoreflect.FieldNumber = 3 | ||||
| 	MethodDescriptorProto_Options_field_number         protoreflect.FieldNumber = 4 | ||||
| 	MethodDescriptorProto_ClientStreaming_field_number protoreflect.FieldNumber = 5 | ||||
| 	MethodDescriptorProto_ServerStreaming_field_number protoreflect.FieldNumber = 6 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.FileOptions. | ||||
| const ( | ||||
| 	FileOptions_message_name     protoreflect.Name     = "FileOptions" | ||||
| 	FileOptions_message_fullname protoreflect.FullName = "google.protobuf.FileOptions" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.FileOptions. | ||||
| const ( | ||||
| 	FileOptions_JavaPackage_field_name               protoreflect.Name = "java_package" | ||||
| 	FileOptions_JavaOuterClassname_field_name        protoreflect.Name = "java_outer_classname" | ||||
| 	FileOptions_JavaMultipleFiles_field_name         protoreflect.Name = "java_multiple_files" | ||||
| 	FileOptions_JavaGenerateEqualsAndHash_field_name protoreflect.Name = "java_generate_equals_and_hash" | ||||
| 	FileOptions_JavaStringCheckUtf8_field_name       protoreflect.Name = "java_string_check_utf8" | ||||
| 	FileOptions_OptimizeFor_field_name               protoreflect.Name = "optimize_for" | ||||
| 	FileOptions_GoPackage_field_name                 protoreflect.Name = "go_package" | ||||
| 	FileOptions_CcGenericServices_field_name         protoreflect.Name = "cc_generic_services" | ||||
| 	FileOptions_JavaGenericServices_field_name       protoreflect.Name = "java_generic_services" | ||||
| 	FileOptions_PyGenericServices_field_name         protoreflect.Name = "py_generic_services" | ||||
| 	FileOptions_PhpGenericServices_field_name        protoreflect.Name = "php_generic_services" | ||||
| 	FileOptions_Deprecated_field_name                protoreflect.Name = "deprecated" | ||||
| 	FileOptions_CcEnableArenas_field_name            protoreflect.Name = "cc_enable_arenas" | ||||
| 	FileOptions_ObjcClassPrefix_field_name           protoreflect.Name = "objc_class_prefix" | ||||
| 	FileOptions_CsharpNamespace_field_name           protoreflect.Name = "csharp_namespace" | ||||
| 	FileOptions_SwiftPrefix_field_name               protoreflect.Name = "swift_prefix" | ||||
| 	FileOptions_PhpClassPrefix_field_name            protoreflect.Name = "php_class_prefix" | ||||
| 	FileOptions_PhpNamespace_field_name              protoreflect.Name = "php_namespace" | ||||
| 	FileOptions_PhpMetadataNamespace_field_name      protoreflect.Name = "php_metadata_namespace" | ||||
| 	FileOptions_RubyPackage_field_name               protoreflect.Name = "ruby_package" | ||||
| 	FileOptions_UninterpretedOption_field_name       protoreflect.Name = "uninterpreted_option" | ||||
|  | ||||
| 	FileOptions_JavaPackage_field_fullname               protoreflect.FullName = "google.protobuf.FileOptions.java_package" | ||||
| 	FileOptions_JavaOuterClassname_field_fullname        protoreflect.FullName = "google.protobuf.FileOptions.java_outer_classname" | ||||
| 	FileOptions_JavaMultipleFiles_field_fullname         protoreflect.FullName = "google.protobuf.FileOptions.java_multiple_files" | ||||
| 	FileOptions_JavaGenerateEqualsAndHash_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_generate_equals_and_hash" | ||||
| 	FileOptions_JavaStringCheckUtf8_field_fullname       protoreflect.FullName = "google.protobuf.FileOptions.java_string_check_utf8" | ||||
| 	FileOptions_OptimizeFor_field_fullname               protoreflect.FullName = "google.protobuf.FileOptions.optimize_for" | ||||
| 	FileOptions_GoPackage_field_fullname                 protoreflect.FullName = "google.protobuf.FileOptions.go_package" | ||||
| 	FileOptions_CcGenericServices_field_fullname         protoreflect.FullName = "google.protobuf.FileOptions.cc_generic_services" | ||||
| 	FileOptions_JavaGenericServices_field_fullname       protoreflect.FullName = "google.protobuf.FileOptions.java_generic_services" | ||||
| 	FileOptions_PyGenericServices_field_fullname         protoreflect.FullName = "google.protobuf.FileOptions.py_generic_services" | ||||
| 	FileOptions_PhpGenericServices_field_fullname        protoreflect.FullName = "google.protobuf.FileOptions.php_generic_services" | ||||
| 	FileOptions_Deprecated_field_fullname                protoreflect.FullName = "google.protobuf.FileOptions.deprecated" | ||||
| 	FileOptions_CcEnableArenas_field_fullname            protoreflect.FullName = "google.protobuf.FileOptions.cc_enable_arenas" | ||||
| 	FileOptions_ObjcClassPrefix_field_fullname           protoreflect.FullName = "google.protobuf.FileOptions.objc_class_prefix" | ||||
| 	FileOptions_CsharpNamespace_field_fullname           protoreflect.FullName = "google.protobuf.FileOptions.csharp_namespace" | ||||
| 	FileOptions_SwiftPrefix_field_fullname               protoreflect.FullName = "google.protobuf.FileOptions.swift_prefix" | ||||
| 	FileOptions_PhpClassPrefix_field_fullname            protoreflect.FullName = "google.protobuf.FileOptions.php_class_prefix" | ||||
| 	FileOptions_PhpNamespace_field_fullname              protoreflect.FullName = "google.protobuf.FileOptions.php_namespace" | ||||
| 	FileOptions_PhpMetadataNamespace_field_fullname      protoreflect.FullName = "google.protobuf.FileOptions.php_metadata_namespace" | ||||
| 	FileOptions_RubyPackage_field_fullname               protoreflect.FullName = "google.protobuf.FileOptions.ruby_package" | ||||
| 	FileOptions_UninterpretedOption_field_fullname       protoreflect.FullName = "google.protobuf.FileOptions.uninterpreted_option" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.FileOptions. | ||||
| const ( | ||||
| 	FileOptions_JavaPackage_field_number               protoreflect.FieldNumber = 1 | ||||
| 	FileOptions_JavaOuterClassname_field_number        protoreflect.FieldNumber = 8 | ||||
| 	FileOptions_JavaMultipleFiles_field_number         protoreflect.FieldNumber = 10 | ||||
| 	FileOptions_JavaGenerateEqualsAndHash_field_number protoreflect.FieldNumber = 20 | ||||
| 	FileOptions_JavaStringCheckUtf8_field_number       protoreflect.FieldNumber = 27 | ||||
| 	FileOptions_OptimizeFor_field_number               protoreflect.FieldNumber = 9 | ||||
| 	FileOptions_GoPackage_field_number                 protoreflect.FieldNumber = 11 | ||||
| 	FileOptions_CcGenericServices_field_number         protoreflect.FieldNumber = 16 | ||||
| 	FileOptions_JavaGenericServices_field_number       protoreflect.FieldNumber = 17 | ||||
| 	FileOptions_PyGenericServices_field_number         protoreflect.FieldNumber = 18 | ||||
| 	FileOptions_PhpGenericServices_field_number        protoreflect.FieldNumber = 42 | ||||
| 	FileOptions_Deprecated_field_number                protoreflect.FieldNumber = 23 | ||||
| 	FileOptions_CcEnableArenas_field_number            protoreflect.FieldNumber = 31 | ||||
| 	FileOptions_ObjcClassPrefix_field_number           protoreflect.FieldNumber = 36 | ||||
| 	FileOptions_CsharpNamespace_field_number           protoreflect.FieldNumber = 37 | ||||
| 	FileOptions_SwiftPrefix_field_number               protoreflect.FieldNumber = 39 | ||||
| 	FileOptions_PhpClassPrefix_field_number            protoreflect.FieldNumber = 40 | ||||
| 	FileOptions_PhpNamespace_field_number              protoreflect.FieldNumber = 41 | ||||
| 	FileOptions_PhpMetadataNamespace_field_number      protoreflect.FieldNumber = 44 | ||||
| 	FileOptions_RubyPackage_field_number               protoreflect.FieldNumber = 45 | ||||
| 	FileOptions_UninterpretedOption_field_number       protoreflect.FieldNumber = 999 | ||||
| ) | ||||
|  | ||||
| // Full and short names for google.protobuf.FileOptions.OptimizeMode. | ||||
| const ( | ||||
| 	FileOptions_OptimizeMode_enum_fullname = "google.protobuf.FileOptions.OptimizeMode" | ||||
| 	FileOptions_OptimizeMode_enum_name     = "OptimizeMode" | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.MessageOptions. | ||||
| const ( | ||||
| 	MessageOptions_message_name     protoreflect.Name     = "MessageOptions" | ||||
| 	MessageOptions_message_fullname protoreflect.FullName = "google.protobuf.MessageOptions" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.MessageOptions. | ||||
| const ( | ||||
| 	MessageOptions_MessageSetWireFormat_field_name         protoreflect.Name = "message_set_wire_format" | ||||
| 	MessageOptions_NoStandardDescriptorAccessor_field_name protoreflect.Name = "no_standard_descriptor_accessor" | ||||
| 	MessageOptions_Deprecated_field_name                   protoreflect.Name = "deprecated" | ||||
| 	MessageOptions_MapEntry_field_name                     protoreflect.Name = "map_entry" | ||||
| 	MessageOptions_UninterpretedOption_field_name          protoreflect.Name = "uninterpreted_option" | ||||
|  | ||||
| 	MessageOptions_MessageSetWireFormat_field_fullname         protoreflect.FullName = "google.protobuf.MessageOptions.message_set_wire_format" | ||||
| 	MessageOptions_NoStandardDescriptorAccessor_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.no_standard_descriptor_accessor" | ||||
| 	MessageOptions_Deprecated_field_fullname                   protoreflect.FullName = "google.protobuf.MessageOptions.deprecated" | ||||
| 	MessageOptions_MapEntry_field_fullname                     protoreflect.FullName = "google.protobuf.MessageOptions.map_entry" | ||||
| 	MessageOptions_UninterpretedOption_field_fullname          protoreflect.FullName = "google.protobuf.MessageOptions.uninterpreted_option" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.MessageOptions. | ||||
| const ( | ||||
| 	MessageOptions_MessageSetWireFormat_field_number         protoreflect.FieldNumber = 1 | ||||
| 	MessageOptions_NoStandardDescriptorAccessor_field_number protoreflect.FieldNumber = 2 | ||||
| 	MessageOptions_Deprecated_field_number                   protoreflect.FieldNumber = 3 | ||||
| 	MessageOptions_MapEntry_field_number                     protoreflect.FieldNumber = 7 | ||||
| 	MessageOptions_UninterpretedOption_field_number          protoreflect.FieldNumber = 999 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.FieldOptions. | ||||
| const ( | ||||
| 	FieldOptions_message_name     protoreflect.Name     = "FieldOptions" | ||||
| 	FieldOptions_message_fullname protoreflect.FullName = "google.protobuf.FieldOptions" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.FieldOptions. | ||||
| const ( | ||||
| 	FieldOptions_Ctype_field_name               protoreflect.Name = "ctype" | ||||
| 	FieldOptions_Packed_field_name              protoreflect.Name = "packed" | ||||
| 	FieldOptions_Jstype_field_name              protoreflect.Name = "jstype" | ||||
| 	FieldOptions_Lazy_field_name                protoreflect.Name = "lazy" | ||||
| 	FieldOptions_Deprecated_field_name          protoreflect.Name = "deprecated" | ||||
| 	FieldOptions_Weak_field_name                protoreflect.Name = "weak" | ||||
| 	FieldOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" | ||||
|  | ||||
| 	FieldOptions_Ctype_field_fullname               protoreflect.FullName = "google.protobuf.FieldOptions.ctype" | ||||
| 	FieldOptions_Packed_field_fullname              protoreflect.FullName = "google.protobuf.FieldOptions.packed" | ||||
| 	FieldOptions_Jstype_field_fullname              protoreflect.FullName = "google.protobuf.FieldOptions.jstype" | ||||
| 	FieldOptions_Lazy_field_fullname                protoreflect.FullName = "google.protobuf.FieldOptions.lazy" | ||||
| 	FieldOptions_Deprecated_field_fullname          protoreflect.FullName = "google.protobuf.FieldOptions.deprecated" | ||||
| 	FieldOptions_Weak_field_fullname                protoreflect.FullName = "google.protobuf.FieldOptions.weak" | ||||
| 	FieldOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.uninterpreted_option" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.FieldOptions. | ||||
| const ( | ||||
| 	FieldOptions_Ctype_field_number               protoreflect.FieldNumber = 1 | ||||
| 	FieldOptions_Packed_field_number              protoreflect.FieldNumber = 2 | ||||
| 	FieldOptions_Jstype_field_number              protoreflect.FieldNumber = 6 | ||||
| 	FieldOptions_Lazy_field_number                protoreflect.FieldNumber = 5 | ||||
| 	FieldOptions_Deprecated_field_number          protoreflect.FieldNumber = 3 | ||||
| 	FieldOptions_Weak_field_number                protoreflect.FieldNumber = 10 | ||||
| 	FieldOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 | ||||
| ) | ||||
|  | ||||
| // Full and short names for google.protobuf.FieldOptions.CType. | ||||
| const ( | ||||
| 	FieldOptions_CType_enum_fullname = "google.protobuf.FieldOptions.CType" | ||||
| 	FieldOptions_CType_enum_name     = "CType" | ||||
| ) | ||||
|  | ||||
| // Full and short names for google.protobuf.FieldOptions.JSType. | ||||
| const ( | ||||
| 	FieldOptions_JSType_enum_fullname = "google.protobuf.FieldOptions.JSType" | ||||
| 	FieldOptions_JSType_enum_name     = "JSType" | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.OneofOptions. | ||||
| const ( | ||||
| 	OneofOptions_message_name     protoreflect.Name     = "OneofOptions" | ||||
| 	OneofOptions_message_fullname protoreflect.FullName = "google.protobuf.OneofOptions" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.OneofOptions. | ||||
| const ( | ||||
| 	OneofOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" | ||||
|  | ||||
| 	OneofOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.OneofOptions.uninterpreted_option" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.OneofOptions. | ||||
| const ( | ||||
| 	OneofOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.EnumOptions. | ||||
| const ( | ||||
| 	EnumOptions_message_name     protoreflect.Name     = "EnumOptions" | ||||
| 	EnumOptions_message_fullname protoreflect.FullName = "google.protobuf.EnumOptions" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.EnumOptions. | ||||
| const ( | ||||
| 	EnumOptions_AllowAlias_field_name          protoreflect.Name = "allow_alias" | ||||
| 	EnumOptions_Deprecated_field_name          protoreflect.Name = "deprecated" | ||||
| 	EnumOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" | ||||
|  | ||||
| 	EnumOptions_AllowAlias_field_fullname          protoreflect.FullName = "google.protobuf.EnumOptions.allow_alias" | ||||
| 	EnumOptions_Deprecated_field_fullname          protoreflect.FullName = "google.protobuf.EnumOptions.deprecated" | ||||
| 	EnumOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.uninterpreted_option" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.EnumOptions. | ||||
| const ( | ||||
| 	EnumOptions_AllowAlias_field_number          protoreflect.FieldNumber = 2 | ||||
| 	EnumOptions_Deprecated_field_number          protoreflect.FieldNumber = 3 | ||||
| 	EnumOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.EnumValueOptions. | ||||
| const ( | ||||
| 	EnumValueOptions_message_name     protoreflect.Name     = "EnumValueOptions" | ||||
| 	EnumValueOptions_message_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.EnumValueOptions. | ||||
| const ( | ||||
| 	EnumValueOptions_Deprecated_field_name          protoreflect.Name = "deprecated" | ||||
| 	EnumValueOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" | ||||
|  | ||||
| 	EnumValueOptions_Deprecated_field_fullname          protoreflect.FullName = "google.protobuf.EnumValueOptions.deprecated" | ||||
| 	EnumValueOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions.uninterpreted_option" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.EnumValueOptions. | ||||
| const ( | ||||
| 	EnumValueOptions_Deprecated_field_number          protoreflect.FieldNumber = 1 | ||||
| 	EnumValueOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.ServiceOptions. | ||||
| const ( | ||||
| 	ServiceOptions_message_name     protoreflect.Name     = "ServiceOptions" | ||||
| 	ServiceOptions_message_fullname protoreflect.FullName = "google.protobuf.ServiceOptions" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.ServiceOptions. | ||||
| const ( | ||||
| 	ServiceOptions_Deprecated_field_name          protoreflect.Name = "deprecated" | ||||
| 	ServiceOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" | ||||
|  | ||||
| 	ServiceOptions_Deprecated_field_fullname          protoreflect.FullName = "google.protobuf.ServiceOptions.deprecated" | ||||
| 	ServiceOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.ServiceOptions.uninterpreted_option" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.ServiceOptions. | ||||
| const ( | ||||
| 	ServiceOptions_Deprecated_field_number          protoreflect.FieldNumber = 33 | ||||
| 	ServiceOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.MethodOptions. | ||||
| const ( | ||||
| 	MethodOptions_message_name     protoreflect.Name     = "MethodOptions" | ||||
| 	MethodOptions_message_fullname protoreflect.FullName = "google.protobuf.MethodOptions" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.MethodOptions. | ||||
| const ( | ||||
| 	MethodOptions_Deprecated_field_name          protoreflect.Name = "deprecated" | ||||
| 	MethodOptions_IdempotencyLevel_field_name    protoreflect.Name = "idempotency_level" | ||||
| 	MethodOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" | ||||
|  | ||||
| 	MethodOptions_Deprecated_field_fullname          protoreflect.FullName = "google.protobuf.MethodOptions.deprecated" | ||||
| 	MethodOptions_IdempotencyLevel_field_fullname    protoreflect.FullName = "google.protobuf.MethodOptions.idempotency_level" | ||||
| 	MethodOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.uninterpreted_option" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.MethodOptions. | ||||
| const ( | ||||
| 	MethodOptions_Deprecated_field_number          protoreflect.FieldNumber = 33 | ||||
| 	MethodOptions_IdempotencyLevel_field_number    protoreflect.FieldNumber = 34 | ||||
| 	MethodOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 | ||||
| ) | ||||
|  | ||||
| // Full and short names for google.protobuf.MethodOptions.IdempotencyLevel. | ||||
| const ( | ||||
| 	MethodOptions_IdempotencyLevel_enum_fullname = "google.protobuf.MethodOptions.IdempotencyLevel" | ||||
| 	MethodOptions_IdempotencyLevel_enum_name     = "IdempotencyLevel" | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.UninterpretedOption. | ||||
| const ( | ||||
| 	UninterpretedOption_message_name     protoreflect.Name     = "UninterpretedOption" | ||||
| 	UninterpretedOption_message_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.UninterpretedOption. | ||||
| const ( | ||||
| 	UninterpretedOption_Name_field_name             protoreflect.Name = "name" | ||||
| 	UninterpretedOption_IdentifierValue_field_name  protoreflect.Name = "identifier_value" | ||||
| 	UninterpretedOption_PositiveIntValue_field_name protoreflect.Name = "positive_int_value" | ||||
| 	UninterpretedOption_NegativeIntValue_field_name protoreflect.Name = "negative_int_value" | ||||
| 	UninterpretedOption_DoubleValue_field_name      protoreflect.Name = "double_value" | ||||
| 	UninterpretedOption_StringValue_field_name      protoreflect.Name = "string_value" | ||||
| 	UninterpretedOption_AggregateValue_field_name   protoreflect.Name = "aggregate_value" | ||||
|  | ||||
| 	UninterpretedOption_Name_field_fullname             protoreflect.FullName = "google.protobuf.UninterpretedOption.name" | ||||
| 	UninterpretedOption_IdentifierValue_field_fullname  protoreflect.FullName = "google.protobuf.UninterpretedOption.identifier_value" | ||||
| 	UninterpretedOption_PositiveIntValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.positive_int_value" | ||||
| 	UninterpretedOption_NegativeIntValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.negative_int_value" | ||||
| 	UninterpretedOption_DoubleValue_field_fullname      protoreflect.FullName = "google.protobuf.UninterpretedOption.double_value" | ||||
| 	UninterpretedOption_StringValue_field_fullname      protoreflect.FullName = "google.protobuf.UninterpretedOption.string_value" | ||||
| 	UninterpretedOption_AggregateValue_field_fullname   protoreflect.FullName = "google.protobuf.UninterpretedOption.aggregate_value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.UninterpretedOption. | ||||
| const ( | ||||
| 	UninterpretedOption_Name_field_number             protoreflect.FieldNumber = 2 | ||||
| 	UninterpretedOption_IdentifierValue_field_number  protoreflect.FieldNumber = 3 | ||||
| 	UninterpretedOption_PositiveIntValue_field_number protoreflect.FieldNumber = 4 | ||||
| 	UninterpretedOption_NegativeIntValue_field_number protoreflect.FieldNumber = 5 | ||||
| 	UninterpretedOption_DoubleValue_field_number      protoreflect.FieldNumber = 6 | ||||
| 	UninterpretedOption_StringValue_field_number      protoreflect.FieldNumber = 7 | ||||
| 	UninterpretedOption_AggregateValue_field_number   protoreflect.FieldNumber = 8 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.UninterpretedOption.NamePart. | ||||
| const ( | ||||
| 	UninterpretedOption_NamePart_message_name     protoreflect.Name     = "NamePart" | ||||
| 	UninterpretedOption_NamePart_message_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.NamePart" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.UninterpretedOption.NamePart. | ||||
| const ( | ||||
| 	UninterpretedOption_NamePart_NamePart_field_name    protoreflect.Name = "name_part" | ||||
| 	UninterpretedOption_NamePart_IsExtension_field_name protoreflect.Name = "is_extension" | ||||
|  | ||||
| 	UninterpretedOption_NamePart_NamePart_field_fullname    protoreflect.FullName = "google.protobuf.UninterpretedOption.NamePart.name_part" | ||||
| 	UninterpretedOption_NamePart_IsExtension_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.NamePart.is_extension" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.UninterpretedOption.NamePart. | ||||
| const ( | ||||
| 	UninterpretedOption_NamePart_NamePart_field_number    protoreflect.FieldNumber = 1 | ||||
| 	UninterpretedOption_NamePart_IsExtension_field_number protoreflect.FieldNumber = 2 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.SourceCodeInfo. | ||||
| const ( | ||||
| 	SourceCodeInfo_message_name     protoreflect.Name     = "SourceCodeInfo" | ||||
| 	SourceCodeInfo_message_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.SourceCodeInfo. | ||||
| const ( | ||||
| 	SourceCodeInfo_Location_field_name protoreflect.Name = "location" | ||||
|  | ||||
| 	SourceCodeInfo_Location_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.location" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.SourceCodeInfo. | ||||
| const ( | ||||
| 	SourceCodeInfo_Location_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.SourceCodeInfo.Location. | ||||
| const ( | ||||
| 	SourceCodeInfo_Location_message_name     protoreflect.Name     = "Location" | ||||
| 	SourceCodeInfo_Location_message_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.SourceCodeInfo.Location. | ||||
| const ( | ||||
| 	SourceCodeInfo_Location_Path_field_name                    protoreflect.Name = "path" | ||||
| 	SourceCodeInfo_Location_Span_field_name                    protoreflect.Name = "span" | ||||
| 	SourceCodeInfo_Location_LeadingComments_field_name         protoreflect.Name = "leading_comments" | ||||
| 	SourceCodeInfo_Location_TrailingComments_field_name        protoreflect.Name = "trailing_comments" | ||||
| 	SourceCodeInfo_Location_LeadingDetachedComments_field_name protoreflect.Name = "leading_detached_comments" | ||||
|  | ||||
| 	SourceCodeInfo_Location_Path_field_fullname                    protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.path" | ||||
| 	SourceCodeInfo_Location_Span_field_fullname                    protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.span" | ||||
| 	SourceCodeInfo_Location_LeadingComments_field_fullname         protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.leading_comments" | ||||
| 	SourceCodeInfo_Location_TrailingComments_field_fullname        protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.trailing_comments" | ||||
| 	SourceCodeInfo_Location_LeadingDetachedComments_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.leading_detached_comments" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.SourceCodeInfo.Location. | ||||
| const ( | ||||
| 	SourceCodeInfo_Location_Path_field_number                    protoreflect.FieldNumber = 1 | ||||
| 	SourceCodeInfo_Location_Span_field_number                    protoreflect.FieldNumber = 2 | ||||
| 	SourceCodeInfo_Location_LeadingComments_field_number         protoreflect.FieldNumber = 3 | ||||
| 	SourceCodeInfo_Location_TrailingComments_field_number        protoreflect.FieldNumber = 4 | ||||
| 	SourceCodeInfo_Location_LeadingDetachedComments_field_number protoreflect.FieldNumber = 6 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.GeneratedCodeInfo. | ||||
| const ( | ||||
| 	GeneratedCodeInfo_message_name     protoreflect.Name     = "GeneratedCodeInfo" | ||||
| 	GeneratedCodeInfo_message_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.GeneratedCodeInfo. | ||||
| const ( | ||||
| 	GeneratedCodeInfo_Annotation_field_name protoreflect.Name = "annotation" | ||||
|  | ||||
| 	GeneratedCodeInfo_Annotation_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.annotation" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.GeneratedCodeInfo. | ||||
| const ( | ||||
| 	GeneratedCodeInfo_Annotation_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.GeneratedCodeInfo.Annotation. | ||||
| const ( | ||||
| 	GeneratedCodeInfo_Annotation_message_name     protoreflect.Name     = "Annotation" | ||||
| 	GeneratedCodeInfo_Annotation_message_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.GeneratedCodeInfo.Annotation. | ||||
| const ( | ||||
| 	GeneratedCodeInfo_Annotation_Path_field_name       protoreflect.Name = "path" | ||||
| 	GeneratedCodeInfo_Annotation_SourceFile_field_name protoreflect.Name = "source_file" | ||||
| 	GeneratedCodeInfo_Annotation_Begin_field_name      protoreflect.Name = "begin" | ||||
| 	GeneratedCodeInfo_Annotation_End_field_name        protoreflect.Name = "end" | ||||
|  | ||||
| 	GeneratedCodeInfo_Annotation_Path_field_fullname       protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.path" | ||||
| 	GeneratedCodeInfo_Annotation_SourceFile_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.source_file" | ||||
| 	GeneratedCodeInfo_Annotation_Begin_field_fullname      protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.begin" | ||||
| 	GeneratedCodeInfo_Annotation_End_field_fullname        protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.end" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.GeneratedCodeInfo.Annotation. | ||||
| const ( | ||||
| 	GeneratedCodeInfo_Annotation_Path_field_number       protoreflect.FieldNumber = 1 | ||||
| 	GeneratedCodeInfo_Annotation_SourceFile_field_number protoreflect.FieldNumber = 2 | ||||
| 	GeneratedCodeInfo_Annotation_Begin_field_number      protoreflect.FieldNumber = 3 | ||||
| 	GeneratedCodeInfo_Annotation_End_field_number        protoreflect.FieldNumber = 4 | ||||
| ) | ||||
							
								
								
									
										11
									
								
								vendor/google.golang.org/protobuf/internal/genid/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								vendor/google.golang.org/protobuf/internal/genid/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| // 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 genid contains constants for declarations in descriptor.proto | ||||
| // and the well-known types. | ||||
| package genid | ||||
|  | ||||
| import protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
|  | ||||
| const GoogleProtobuf_package protoreflect.FullName = "google.protobuf" | ||||
							
								
								
									
										34
									
								
								vendor/google.golang.org/protobuf/internal/genid/duration_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/google.golang.org/protobuf/internal/genid/duration_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-protos. DO NOT EDIT. | ||||
|  | ||||
| package genid | ||||
|  | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| const File_google_protobuf_duration_proto = "google/protobuf/duration.proto" | ||||
|  | ||||
| // Names for google.protobuf.Duration. | ||||
| const ( | ||||
| 	Duration_message_name     protoreflect.Name     = "Duration" | ||||
| 	Duration_message_fullname protoreflect.FullName = "google.protobuf.Duration" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Duration. | ||||
| const ( | ||||
| 	Duration_Seconds_field_name protoreflect.Name = "seconds" | ||||
| 	Duration_Nanos_field_name   protoreflect.Name = "nanos" | ||||
|  | ||||
| 	Duration_Seconds_field_fullname protoreflect.FullName = "google.protobuf.Duration.seconds" | ||||
| 	Duration_Nanos_field_fullname   protoreflect.FullName = "google.protobuf.Duration.nanos" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Duration. | ||||
| const ( | ||||
| 	Duration_Seconds_field_number protoreflect.FieldNumber = 1 | ||||
| 	Duration_Nanos_field_number   protoreflect.FieldNumber = 2 | ||||
| ) | ||||
							
								
								
									
										19
									
								
								vendor/google.golang.org/protobuf/internal/genid/empty_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								vendor/google.golang.org/protobuf/internal/genid/empty_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-protos. DO NOT EDIT. | ||||
|  | ||||
| package genid | ||||
|  | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| const File_google_protobuf_empty_proto = "google/protobuf/empty.proto" | ||||
|  | ||||
| // Names for google.protobuf.Empty. | ||||
| const ( | ||||
| 	Empty_message_name     protoreflect.Name     = "Empty" | ||||
| 	Empty_message_fullname protoreflect.FullName = "google.protobuf.Empty" | ||||
| ) | ||||
							
								
								
									
										31
									
								
								vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-protos. DO NOT EDIT. | ||||
|  | ||||
| package genid | ||||
|  | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| const File_google_protobuf_field_mask_proto = "google/protobuf/field_mask.proto" | ||||
|  | ||||
| // Names for google.protobuf.FieldMask. | ||||
| const ( | ||||
| 	FieldMask_message_name     protoreflect.Name     = "FieldMask" | ||||
| 	FieldMask_message_fullname protoreflect.FullName = "google.protobuf.FieldMask" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.FieldMask. | ||||
| const ( | ||||
| 	FieldMask_Paths_field_name protoreflect.Name = "paths" | ||||
|  | ||||
| 	FieldMask_Paths_field_fullname protoreflect.FullName = "google.protobuf.FieldMask.paths" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.FieldMask. | ||||
| const ( | ||||
| 	FieldMask_Paths_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
							
								
								
									
										25
									
								
								vendor/google.golang.org/protobuf/internal/genid/goname.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								vendor/google.golang.org/protobuf/internal/genid/goname.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| // 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 genid | ||||
|  | ||||
| // Go names of implementation-specific struct fields in generated messages. | ||||
| const ( | ||||
| 	State_goname = "state" | ||||
|  | ||||
| 	SizeCache_goname  = "sizeCache" | ||||
| 	SizeCacheA_goname = "XXX_sizecache" | ||||
|  | ||||
| 	WeakFields_goname  = "weakFields" | ||||
| 	WeakFieldsA_goname = "XXX_weak" | ||||
|  | ||||
| 	UnknownFields_goname  = "unknownFields" | ||||
| 	UnknownFieldsA_goname = "XXX_unrecognized" | ||||
|  | ||||
| 	ExtensionFields_goname  = "extensionFields" | ||||
| 	ExtensionFieldsA_goname = "XXX_InternalExtensions" | ||||
| 	ExtensionFieldsB_goname = "XXX_extensions" | ||||
|  | ||||
| 	WeakFieldPrefix_goname = "XXX_weak_" | ||||
| ) | ||||
							
								
								
									
										16
									
								
								vendor/google.golang.org/protobuf/internal/genid/map_entry.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								vendor/google.golang.org/protobuf/internal/genid/map_entry.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| // 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 genid | ||||
|  | ||||
| import protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
|  | ||||
| // Generic field names and numbers for synthetic map entry messages. | ||||
| const ( | ||||
| 	MapEntry_Key_field_name   protoreflect.Name = "key" | ||||
| 	MapEntry_Value_field_name protoreflect.Name = "value" | ||||
|  | ||||
| 	MapEntry_Key_field_number   protoreflect.FieldNumber = 1 | ||||
| 	MapEntry_Value_field_number protoreflect.FieldNumber = 2 | ||||
| ) | ||||
							
								
								
									
										31
									
								
								vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-protos. DO NOT EDIT. | ||||
|  | ||||
| package genid | ||||
|  | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| const File_google_protobuf_source_context_proto = "google/protobuf/source_context.proto" | ||||
|  | ||||
| // Names for google.protobuf.SourceContext. | ||||
| const ( | ||||
| 	SourceContext_message_name     protoreflect.Name     = "SourceContext" | ||||
| 	SourceContext_message_fullname protoreflect.FullName = "google.protobuf.SourceContext" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.SourceContext. | ||||
| const ( | ||||
| 	SourceContext_FileName_field_name protoreflect.Name = "file_name" | ||||
|  | ||||
| 	SourceContext_FileName_field_fullname protoreflect.FullName = "google.protobuf.SourceContext.file_name" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.SourceContext. | ||||
| const ( | ||||
| 	SourceContext_FileName_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
							
								
								
									
										116
									
								
								vendor/google.golang.org/protobuf/internal/genid/struct_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								vendor/google.golang.org/protobuf/internal/genid/struct_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-protos. DO NOT EDIT. | ||||
|  | ||||
| package genid | ||||
|  | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| const File_google_protobuf_struct_proto = "google/protobuf/struct.proto" | ||||
|  | ||||
| // Full and short names for google.protobuf.NullValue. | ||||
| const ( | ||||
| 	NullValue_enum_fullname = "google.protobuf.NullValue" | ||||
| 	NullValue_enum_name     = "NullValue" | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.Struct. | ||||
| const ( | ||||
| 	Struct_message_name     protoreflect.Name     = "Struct" | ||||
| 	Struct_message_fullname protoreflect.FullName = "google.protobuf.Struct" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Struct. | ||||
| const ( | ||||
| 	Struct_Fields_field_name protoreflect.Name = "fields" | ||||
|  | ||||
| 	Struct_Fields_field_fullname protoreflect.FullName = "google.protobuf.Struct.fields" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Struct. | ||||
| const ( | ||||
| 	Struct_Fields_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.Struct.FieldsEntry. | ||||
| const ( | ||||
| 	Struct_FieldsEntry_message_name     protoreflect.Name     = "FieldsEntry" | ||||
| 	Struct_FieldsEntry_message_fullname protoreflect.FullName = "google.protobuf.Struct.FieldsEntry" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Struct.FieldsEntry. | ||||
| const ( | ||||
| 	Struct_FieldsEntry_Key_field_name   protoreflect.Name = "key" | ||||
| 	Struct_FieldsEntry_Value_field_name protoreflect.Name = "value" | ||||
|  | ||||
| 	Struct_FieldsEntry_Key_field_fullname   protoreflect.FullName = "google.protobuf.Struct.FieldsEntry.key" | ||||
| 	Struct_FieldsEntry_Value_field_fullname protoreflect.FullName = "google.protobuf.Struct.FieldsEntry.value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Struct.FieldsEntry. | ||||
| const ( | ||||
| 	Struct_FieldsEntry_Key_field_number   protoreflect.FieldNumber = 1 | ||||
| 	Struct_FieldsEntry_Value_field_number protoreflect.FieldNumber = 2 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.Value. | ||||
| const ( | ||||
| 	Value_message_name     protoreflect.Name     = "Value" | ||||
| 	Value_message_fullname protoreflect.FullName = "google.protobuf.Value" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Value. | ||||
| const ( | ||||
| 	Value_NullValue_field_name   protoreflect.Name = "null_value" | ||||
| 	Value_NumberValue_field_name protoreflect.Name = "number_value" | ||||
| 	Value_StringValue_field_name protoreflect.Name = "string_value" | ||||
| 	Value_BoolValue_field_name   protoreflect.Name = "bool_value" | ||||
| 	Value_StructValue_field_name protoreflect.Name = "struct_value" | ||||
| 	Value_ListValue_field_name   protoreflect.Name = "list_value" | ||||
|  | ||||
| 	Value_NullValue_field_fullname   protoreflect.FullName = "google.protobuf.Value.null_value" | ||||
| 	Value_NumberValue_field_fullname protoreflect.FullName = "google.protobuf.Value.number_value" | ||||
| 	Value_StringValue_field_fullname protoreflect.FullName = "google.protobuf.Value.string_value" | ||||
| 	Value_BoolValue_field_fullname   protoreflect.FullName = "google.protobuf.Value.bool_value" | ||||
| 	Value_StructValue_field_fullname protoreflect.FullName = "google.protobuf.Value.struct_value" | ||||
| 	Value_ListValue_field_fullname   protoreflect.FullName = "google.protobuf.Value.list_value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Value. | ||||
| const ( | ||||
| 	Value_NullValue_field_number   protoreflect.FieldNumber = 1 | ||||
| 	Value_NumberValue_field_number protoreflect.FieldNumber = 2 | ||||
| 	Value_StringValue_field_number protoreflect.FieldNumber = 3 | ||||
| 	Value_BoolValue_field_number   protoreflect.FieldNumber = 4 | ||||
| 	Value_StructValue_field_number protoreflect.FieldNumber = 5 | ||||
| 	Value_ListValue_field_number   protoreflect.FieldNumber = 6 | ||||
| ) | ||||
|  | ||||
| // Oneof names for google.protobuf.Value. | ||||
| const ( | ||||
| 	Value_Kind_oneof_name protoreflect.Name = "kind" | ||||
|  | ||||
| 	Value_Kind_oneof_fullname protoreflect.FullName = "google.protobuf.Value.kind" | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.ListValue. | ||||
| const ( | ||||
| 	ListValue_message_name     protoreflect.Name     = "ListValue" | ||||
| 	ListValue_message_fullname protoreflect.FullName = "google.protobuf.ListValue" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.ListValue. | ||||
| const ( | ||||
| 	ListValue_Values_field_name protoreflect.Name = "values" | ||||
|  | ||||
| 	ListValue_Values_field_fullname protoreflect.FullName = "google.protobuf.ListValue.values" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.ListValue. | ||||
| const ( | ||||
| 	ListValue_Values_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
							
								
								
									
										34
									
								
								vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-protos. DO NOT EDIT. | ||||
|  | ||||
| package genid | ||||
|  | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| const File_google_protobuf_timestamp_proto = "google/protobuf/timestamp.proto" | ||||
|  | ||||
| // Names for google.protobuf.Timestamp. | ||||
| const ( | ||||
| 	Timestamp_message_name     protoreflect.Name     = "Timestamp" | ||||
| 	Timestamp_message_fullname protoreflect.FullName = "google.protobuf.Timestamp" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Timestamp. | ||||
| const ( | ||||
| 	Timestamp_Seconds_field_name protoreflect.Name = "seconds" | ||||
| 	Timestamp_Nanos_field_name   protoreflect.Name = "nanos" | ||||
|  | ||||
| 	Timestamp_Seconds_field_fullname protoreflect.FullName = "google.protobuf.Timestamp.seconds" | ||||
| 	Timestamp_Nanos_field_fullname   protoreflect.FullName = "google.protobuf.Timestamp.nanos" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Timestamp. | ||||
| const ( | ||||
| 	Timestamp_Seconds_field_number protoreflect.FieldNumber = 1 | ||||
| 	Timestamp_Nanos_field_number   protoreflect.FieldNumber = 2 | ||||
| ) | ||||
							
								
								
									
										184
									
								
								vendor/google.golang.org/protobuf/internal/genid/type_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								vendor/google.golang.org/protobuf/internal/genid/type_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,184 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-protos. DO NOT EDIT. | ||||
|  | ||||
| package genid | ||||
|  | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| const File_google_protobuf_type_proto = "google/protobuf/type.proto" | ||||
|  | ||||
| // Full and short names for google.protobuf.Syntax. | ||||
| const ( | ||||
| 	Syntax_enum_fullname = "google.protobuf.Syntax" | ||||
| 	Syntax_enum_name     = "Syntax" | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.Type. | ||||
| const ( | ||||
| 	Type_message_name     protoreflect.Name     = "Type" | ||||
| 	Type_message_fullname protoreflect.FullName = "google.protobuf.Type" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Type. | ||||
| const ( | ||||
| 	Type_Name_field_name          protoreflect.Name = "name" | ||||
| 	Type_Fields_field_name        protoreflect.Name = "fields" | ||||
| 	Type_Oneofs_field_name        protoreflect.Name = "oneofs" | ||||
| 	Type_Options_field_name       protoreflect.Name = "options" | ||||
| 	Type_SourceContext_field_name protoreflect.Name = "source_context" | ||||
| 	Type_Syntax_field_name        protoreflect.Name = "syntax" | ||||
|  | ||||
| 	Type_Name_field_fullname          protoreflect.FullName = "google.protobuf.Type.name" | ||||
| 	Type_Fields_field_fullname        protoreflect.FullName = "google.protobuf.Type.fields" | ||||
| 	Type_Oneofs_field_fullname        protoreflect.FullName = "google.protobuf.Type.oneofs" | ||||
| 	Type_Options_field_fullname       protoreflect.FullName = "google.protobuf.Type.options" | ||||
| 	Type_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Type.source_context" | ||||
| 	Type_Syntax_field_fullname        protoreflect.FullName = "google.protobuf.Type.syntax" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Type. | ||||
| const ( | ||||
| 	Type_Name_field_number          protoreflect.FieldNumber = 1 | ||||
| 	Type_Fields_field_number        protoreflect.FieldNumber = 2 | ||||
| 	Type_Oneofs_field_number        protoreflect.FieldNumber = 3 | ||||
| 	Type_Options_field_number       protoreflect.FieldNumber = 4 | ||||
| 	Type_SourceContext_field_number protoreflect.FieldNumber = 5 | ||||
| 	Type_Syntax_field_number        protoreflect.FieldNumber = 6 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.Field. | ||||
| const ( | ||||
| 	Field_message_name     protoreflect.Name     = "Field" | ||||
| 	Field_message_fullname protoreflect.FullName = "google.protobuf.Field" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Field. | ||||
| const ( | ||||
| 	Field_Kind_field_name         protoreflect.Name = "kind" | ||||
| 	Field_Cardinality_field_name  protoreflect.Name = "cardinality" | ||||
| 	Field_Number_field_name       protoreflect.Name = "number" | ||||
| 	Field_Name_field_name         protoreflect.Name = "name" | ||||
| 	Field_TypeUrl_field_name      protoreflect.Name = "type_url" | ||||
| 	Field_OneofIndex_field_name   protoreflect.Name = "oneof_index" | ||||
| 	Field_Packed_field_name       protoreflect.Name = "packed" | ||||
| 	Field_Options_field_name      protoreflect.Name = "options" | ||||
| 	Field_JsonName_field_name     protoreflect.Name = "json_name" | ||||
| 	Field_DefaultValue_field_name protoreflect.Name = "default_value" | ||||
|  | ||||
| 	Field_Kind_field_fullname         protoreflect.FullName = "google.protobuf.Field.kind" | ||||
| 	Field_Cardinality_field_fullname  protoreflect.FullName = "google.protobuf.Field.cardinality" | ||||
| 	Field_Number_field_fullname       protoreflect.FullName = "google.protobuf.Field.number" | ||||
| 	Field_Name_field_fullname         protoreflect.FullName = "google.protobuf.Field.name" | ||||
| 	Field_TypeUrl_field_fullname      protoreflect.FullName = "google.protobuf.Field.type_url" | ||||
| 	Field_OneofIndex_field_fullname   protoreflect.FullName = "google.protobuf.Field.oneof_index" | ||||
| 	Field_Packed_field_fullname       protoreflect.FullName = "google.protobuf.Field.packed" | ||||
| 	Field_Options_field_fullname      protoreflect.FullName = "google.protobuf.Field.options" | ||||
| 	Field_JsonName_field_fullname     protoreflect.FullName = "google.protobuf.Field.json_name" | ||||
| 	Field_DefaultValue_field_fullname protoreflect.FullName = "google.protobuf.Field.default_value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Field. | ||||
| const ( | ||||
| 	Field_Kind_field_number         protoreflect.FieldNumber = 1 | ||||
| 	Field_Cardinality_field_number  protoreflect.FieldNumber = 2 | ||||
| 	Field_Number_field_number       protoreflect.FieldNumber = 3 | ||||
| 	Field_Name_field_number         protoreflect.FieldNumber = 4 | ||||
| 	Field_TypeUrl_field_number      protoreflect.FieldNumber = 6 | ||||
| 	Field_OneofIndex_field_number   protoreflect.FieldNumber = 7 | ||||
| 	Field_Packed_field_number       protoreflect.FieldNumber = 8 | ||||
| 	Field_Options_field_number      protoreflect.FieldNumber = 9 | ||||
| 	Field_JsonName_field_number     protoreflect.FieldNumber = 10 | ||||
| 	Field_DefaultValue_field_number protoreflect.FieldNumber = 11 | ||||
| ) | ||||
|  | ||||
| // Full and short names for google.protobuf.Field.Kind. | ||||
| const ( | ||||
| 	Field_Kind_enum_fullname = "google.protobuf.Field.Kind" | ||||
| 	Field_Kind_enum_name     = "Kind" | ||||
| ) | ||||
|  | ||||
| // Full and short names for google.protobuf.Field.Cardinality. | ||||
| const ( | ||||
| 	Field_Cardinality_enum_fullname = "google.protobuf.Field.Cardinality" | ||||
| 	Field_Cardinality_enum_name     = "Cardinality" | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.Enum. | ||||
| const ( | ||||
| 	Enum_message_name     protoreflect.Name     = "Enum" | ||||
| 	Enum_message_fullname protoreflect.FullName = "google.protobuf.Enum" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Enum. | ||||
| const ( | ||||
| 	Enum_Name_field_name          protoreflect.Name = "name" | ||||
| 	Enum_Enumvalue_field_name     protoreflect.Name = "enumvalue" | ||||
| 	Enum_Options_field_name       protoreflect.Name = "options" | ||||
| 	Enum_SourceContext_field_name protoreflect.Name = "source_context" | ||||
| 	Enum_Syntax_field_name        protoreflect.Name = "syntax" | ||||
|  | ||||
| 	Enum_Name_field_fullname          protoreflect.FullName = "google.protobuf.Enum.name" | ||||
| 	Enum_Enumvalue_field_fullname     protoreflect.FullName = "google.protobuf.Enum.enumvalue" | ||||
| 	Enum_Options_field_fullname       protoreflect.FullName = "google.protobuf.Enum.options" | ||||
| 	Enum_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Enum.source_context" | ||||
| 	Enum_Syntax_field_fullname        protoreflect.FullName = "google.protobuf.Enum.syntax" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Enum. | ||||
| const ( | ||||
| 	Enum_Name_field_number          protoreflect.FieldNumber = 1 | ||||
| 	Enum_Enumvalue_field_number     protoreflect.FieldNumber = 2 | ||||
| 	Enum_Options_field_number       protoreflect.FieldNumber = 3 | ||||
| 	Enum_SourceContext_field_number protoreflect.FieldNumber = 4 | ||||
| 	Enum_Syntax_field_number        protoreflect.FieldNumber = 5 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.EnumValue. | ||||
| const ( | ||||
| 	EnumValue_message_name     protoreflect.Name     = "EnumValue" | ||||
| 	EnumValue_message_fullname protoreflect.FullName = "google.protobuf.EnumValue" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.EnumValue. | ||||
| const ( | ||||
| 	EnumValue_Name_field_name    protoreflect.Name = "name" | ||||
| 	EnumValue_Number_field_name  protoreflect.Name = "number" | ||||
| 	EnumValue_Options_field_name protoreflect.Name = "options" | ||||
|  | ||||
| 	EnumValue_Name_field_fullname    protoreflect.FullName = "google.protobuf.EnumValue.name" | ||||
| 	EnumValue_Number_field_fullname  protoreflect.FullName = "google.protobuf.EnumValue.number" | ||||
| 	EnumValue_Options_field_fullname protoreflect.FullName = "google.protobuf.EnumValue.options" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.EnumValue. | ||||
| const ( | ||||
| 	EnumValue_Name_field_number    protoreflect.FieldNumber = 1 | ||||
| 	EnumValue_Number_field_number  protoreflect.FieldNumber = 2 | ||||
| 	EnumValue_Options_field_number protoreflect.FieldNumber = 3 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.Option. | ||||
| const ( | ||||
| 	Option_message_name     protoreflect.Name     = "Option" | ||||
| 	Option_message_fullname protoreflect.FullName = "google.protobuf.Option" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Option. | ||||
| const ( | ||||
| 	Option_Name_field_name  protoreflect.Name = "name" | ||||
| 	Option_Value_field_name protoreflect.Name = "value" | ||||
|  | ||||
| 	Option_Name_field_fullname  protoreflect.FullName = "google.protobuf.Option.name" | ||||
| 	Option_Value_field_fullname protoreflect.FullName = "google.protobuf.Option.value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Option. | ||||
| const ( | ||||
| 	Option_Name_field_number  protoreflect.FieldNumber = 1 | ||||
| 	Option_Value_field_number protoreflect.FieldNumber = 2 | ||||
| ) | ||||
							
								
								
									
										13
									
								
								vendor/google.golang.org/protobuf/internal/genid/wrappers.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/google.golang.org/protobuf/internal/genid/wrappers.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| // 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 genid | ||||
|  | ||||
| import protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
|  | ||||
| // Generic field name and number for messages in wrappers.proto. | ||||
| const ( | ||||
| 	WrapperValue_Value_field_name   protoreflect.Name        = "value" | ||||
| 	WrapperValue_Value_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
							
								
								
									
										175
									
								
								vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,175 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-protos. DO NOT EDIT. | ||||
|  | ||||
| package genid | ||||
|  | ||||
| import ( | ||||
| 	protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| const File_google_protobuf_wrappers_proto = "google/protobuf/wrappers.proto" | ||||
|  | ||||
| // Names for google.protobuf.DoubleValue. | ||||
| const ( | ||||
| 	DoubleValue_message_name     protoreflect.Name     = "DoubleValue" | ||||
| 	DoubleValue_message_fullname protoreflect.FullName = "google.protobuf.DoubleValue" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.DoubleValue. | ||||
| const ( | ||||
| 	DoubleValue_Value_field_name protoreflect.Name = "value" | ||||
|  | ||||
| 	DoubleValue_Value_field_fullname protoreflect.FullName = "google.protobuf.DoubleValue.value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.DoubleValue. | ||||
| const ( | ||||
| 	DoubleValue_Value_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.FloatValue. | ||||
| const ( | ||||
| 	FloatValue_message_name     protoreflect.Name     = "FloatValue" | ||||
| 	FloatValue_message_fullname protoreflect.FullName = "google.protobuf.FloatValue" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.FloatValue. | ||||
| const ( | ||||
| 	FloatValue_Value_field_name protoreflect.Name = "value" | ||||
|  | ||||
| 	FloatValue_Value_field_fullname protoreflect.FullName = "google.protobuf.FloatValue.value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.FloatValue. | ||||
| const ( | ||||
| 	FloatValue_Value_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.Int64Value. | ||||
| const ( | ||||
| 	Int64Value_message_name     protoreflect.Name     = "Int64Value" | ||||
| 	Int64Value_message_fullname protoreflect.FullName = "google.protobuf.Int64Value" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Int64Value. | ||||
| const ( | ||||
| 	Int64Value_Value_field_name protoreflect.Name = "value" | ||||
|  | ||||
| 	Int64Value_Value_field_fullname protoreflect.FullName = "google.protobuf.Int64Value.value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Int64Value. | ||||
| const ( | ||||
| 	Int64Value_Value_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.UInt64Value. | ||||
| const ( | ||||
| 	UInt64Value_message_name     protoreflect.Name     = "UInt64Value" | ||||
| 	UInt64Value_message_fullname protoreflect.FullName = "google.protobuf.UInt64Value" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.UInt64Value. | ||||
| const ( | ||||
| 	UInt64Value_Value_field_name protoreflect.Name = "value" | ||||
|  | ||||
| 	UInt64Value_Value_field_fullname protoreflect.FullName = "google.protobuf.UInt64Value.value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.UInt64Value. | ||||
| const ( | ||||
| 	UInt64Value_Value_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.Int32Value. | ||||
| const ( | ||||
| 	Int32Value_message_name     protoreflect.Name     = "Int32Value" | ||||
| 	Int32Value_message_fullname protoreflect.FullName = "google.protobuf.Int32Value" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.Int32Value. | ||||
| const ( | ||||
| 	Int32Value_Value_field_name protoreflect.Name = "value" | ||||
|  | ||||
| 	Int32Value_Value_field_fullname protoreflect.FullName = "google.protobuf.Int32Value.value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.Int32Value. | ||||
| const ( | ||||
| 	Int32Value_Value_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.UInt32Value. | ||||
| const ( | ||||
| 	UInt32Value_message_name     protoreflect.Name     = "UInt32Value" | ||||
| 	UInt32Value_message_fullname protoreflect.FullName = "google.protobuf.UInt32Value" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.UInt32Value. | ||||
| const ( | ||||
| 	UInt32Value_Value_field_name protoreflect.Name = "value" | ||||
|  | ||||
| 	UInt32Value_Value_field_fullname protoreflect.FullName = "google.protobuf.UInt32Value.value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.UInt32Value. | ||||
| const ( | ||||
| 	UInt32Value_Value_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.BoolValue. | ||||
| const ( | ||||
| 	BoolValue_message_name     protoreflect.Name     = "BoolValue" | ||||
| 	BoolValue_message_fullname protoreflect.FullName = "google.protobuf.BoolValue" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.BoolValue. | ||||
| const ( | ||||
| 	BoolValue_Value_field_name protoreflect.Name = "value" | ||||
|  | ||||
| 	BoolValue_Value_field_fullname protoreflect.FullName = "google.protobuf.BoolValue.value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.BoolValue. | ||||
| const ( | ||||
| 	BoolValue_Value_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.StringValue. | ||||
| const ( | ||||
| 	StringValue_message_name     protoreflect.Name     = "StringValue" | ||||
| 	StringValue_message_fullname protoreflect.FullName = "google.protobuf.StringValue" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.StringValue. | ||||
| const ( | ||||
| 	StringValue_Value_field_name protoreflect.Name = "value" | ||||
|  | ||||
| 	StringValue_Value_field_fullname protoreflect.FullName = "google.protobuf.StringValue.value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.StringValue. | ||||
| const ( | ||||
| 	StringValue_Value_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
|  | ||||
| // Names for google.protobuf.BytesValue. | ||||
| const ( | ||||
| 	BytesValue_message_name     protoreflect.Name     = "BytesValue" | ||||
| 	BytesValue_message_fullname protoreflect.FullName = "google.protobuf.BytesValue" | ||||
| ) | ||||
|  | ||||
| // Field names for google.protobuf.BytesValue. | ||||
| const ( | ||||
| 	BytesValue_Value_field_name protoreflect.Name = "value" | ||||
|  | ||||
| 	BytesValue_Value_field_fullname protoreflect.FullName = "google.protobuf.BytesValue.value" | ||||
| ) | ||||
|  | ||||
| // Field numbers for google.protobuf.BytesValue. | ||||
| const ( | ||||
| 	BytesValue_Value_field_number protoreflect.FieldNumber = 1 | ||||
| ) | ||||
							
								
								
									
										177
									
								
								vendor/google.golang.org/protobuf/internal/impl/api_export.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								vendor/google.golang.org/protobuf/internal/impl/api_export.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"strconv" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/prototext" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	piface "google.golang.org/protobuf/runtime/protoiface" | ||||
| ) | ||||
|  | ||||
| // Export is a zero-length named type that exists only to export a set of | ||||
| // functions that we do not want to appear in godoc. | ||||
| type Export struct{} | ||||
|  | ||||
| // NewError formats a string according to the format specifier and arguments and | ||||
| // returns an error that has a "proto" prefix. | ||||
| func (Export) NewError(f string, x ...interface{}) error { | ||||
| 	return errors.New(f, x...) | ||||
| } | ||||
|  | ||||
| // enum is any enum type generated by protoc-gen-go | ||||
| // and must be a named int32 type. | ||||
| type enum = interface{} | ||||
|  | ||||
| // EnumOf returns the protoreflect.Enum interface over e. | ||||
| // It returns nil if e is nil. | ||||
| func (Export) EnumOf(e enum) pref.Enum { | ||||
| 	switch e := e.(type) { | ||||
| 	case nil: | ||||
| 		return nil | ||||
| 	case pref.Enum: | ||||
| 		return e | ||||
| 	default: | ||||
| 		return legacyWrapEnum(reflect.ValueOf(e)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // EnumDescriptorOf returns the protoreflect.EnumDescriptor for e. | ||||
| // It returns nil if e is nil. | ||||
| func (Export) EnumDescriptorOf(e enum) pref.EnumDescriptor { | ||||
| 	switch e := e.(type) { | ||||
| 	case nil: | ||||
| 		return nil | ||||
| 	case pref.Enum: | ||||
| 		return e.Descriptor() | ||||
| 	default: | ||||
| 		return LegacyLoadEnumDesc(reflect.TypeOf(e)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // EnumTypeOf returns the protoreflect.EnumType for e. | ||||
| // It returns nil if e is nil. | ||||
| func (Export) EnumTypeOf(e enum) pref.EnumType { | ||||
| 	switch e := e.(type) { | ||||
| 	case nil: | ||||
| 		return nil | ||||
| 	case pref.Enum: | ||||
| 		return e.Type() | ||||
| 	default: | ||||
| 		return legacyLoadEnumType(reflect.TypeOf(e)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // EnumStringOf returns the enum value as a string, either as the name if | ||||
| // the number is resolvable, or the number formatted as a string. | ||||
| func (Export) EnumStringOf(ed pref.EnumDescriptor, n pref.EnumNumber) string { | ||||
| 	ev := ed.Values().ByNumber(n) | ||||
| 	if ev != nil { | ||||
| 		return string(ev.Name()) | ||||
| 	} | ||||
| 	return strconv.Itoa(int(n)) | ||||
| } | ||||
|  | ||||
| // message is any message type generated by protoc-gen-go | ||||
| // and must be a pointer to a named struct type. | ||||
| type message = interface{} | ||||
|  | ||||
| // legacyMessageWrapper wraps a v2 message as a v1 message. | ||||
| type legacyMessageWrapper struct{ m pref.ProtoMessage } | ||||
|  | ||||
| func (m legacyMessageWrapper) Reset()         { proto.Reset(m.m) } | ||||
| func (m legacyMessageWrapper) String() string { return Export{}.MessageStringOf(m.m) } | ||||
| func (m legacyMessageWrapper) ProtoMessage()  {} | ||||
|  | ||||
| // ProtoMessageV1Of converts either a v1 or v2 message to a v1 message. | ||||
| // It returns nil if m is nil. | ||||
| func (Export) ProtoMessageV1Of(m message) piface.MessageV1 { | ||||
| 	switch mv := m.(type) { | ||||
| 	case nil: | ||||
| 		return nil | ||||
| 	case piface.MessageV1: | ||||
| 		return mv | ||||
| 	case unwrapper: | ||||
| 		return Export{}.ProtoMessageV1Of(mv.protoUnwrap()) | ||||
| 	case pref.ProtoMessage: | ||||
| 		return legacyMessageWrapper{mv} | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (Export) protoMessageV2Of(m message) pref.ProtoMessage { | ||||
| 	switch mv := m.(type) { | ||||
| 	case nil: | ||||
| 		return nil | ||||
| 	case pref.ProtoMessage: | ||||
| 		return mv | ||||
| 	case legacyMessageWrapper: | ||||
| 		return mv.m | ||||
| 	case piface.MessageV1: | ||||
| 		return nil | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ProtoMessageV2Of converts either a v1 or v2 message to a v2 message. | ||||
| // It returns nil if m is nil. | ||||
| func (Export) ProtoMessageV2Of(m message) pref.ProtoMessage { | ||||
| 	if m == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if mv := (Export{}).protoMessageV2Of(m); mv != nil { | ||||
| 		return mv | ||||
| 	} | ||||
| 	return legacyWrapMessage(reflect.ValueOf(m)).Interface() | ||||
| } | ||||
|  | ||||
| // MessageOf returns the protoreflect.Message interface over m. | ||||
| // It returns nil if m is nil. | ||||
| func (Export) MessageOf(m message) pref.Message { | ||||
| 	if m == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if mv := (Export{}).protoMessageV2Of(m); mv != nil { | ||||
| 		return mv.ProtoReflect() | ||||
| 	} | ||||
| 	return legacyWrapMessage(reflect.ValueOf(m)) | ||||
| } | ||||
|  | ||||
| // MessageDescriptorOf returns the protoreflect.MessageDescriptor for m. | ||||
| // It returns nil if m is nil. | ||||
| func (Export) MessageDescriptorOf(m message) pref.MessageDescriptor { | ||||
| 	if m == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if mv := (Export{}).protoMessageV2Of(m); mv != nil { | ||||
| 		return mv.ProtoReflect().Descriptor() | ||||
| 	} | ||||
| 	return LegacyLoadMessageDesc(reflect.TypeOf(m)) | ||||
| } | ||||
|  | ||||
| // MessageTypeOf returns the protoreflect.MessageType for m. | ||||
| // It returns nil if m is nil. | ||||
| func (Export) MessageTypeOf(m message) pref.MessageType { | ||||
| 	if m == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if mv := (Export{}).protoMessageV2Of(m); mv != nil { | ||||
| 		return mv.ProtoReflect().Type() | ||||
| 	} | ||||
| 	return legacyLoadMessageType(reflect.TypeOf(m), "") | ||||
| } | ||||
|  | ||||
| // MessageStringOf returns the message value as a string, | ||||
| // which is the message serialized in the protobuf text format. | ||||
| func (Export) MessageStringOf(m pref.ProtoMessage) string { | ||||
| 	return prototext.MarshalOptions{Multiline: false}.Format(m) | ||||
| } | ||||
							
								
								
									
										141
									
								
								vendor/google.golang.org/protobuf/internal/impl/checkinit.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								vendor/google.golang.org/protobuf/internal/impl/checkinit.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,141 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	piface "google.golang.org/protobuf/runtime/protoiface" | ||||
| ) | ||||
|  | ||||
| func (mi *MessageInfo) checkInitialized(in piface.CheckInitializedInput) (piface.CheckInitializedOutput, error) { | ||||
| 	var p pointer | ||||
| 	if ms, ok := in.Message.(*messageState); ok { | ||||
| 		p = ms.pointer() | ||||
| 	} else { | ||||
| 		p = in.Message.(*messageReflectWrapper).pointer() | ||||
| 	} | ||||
| 	return piface.CheckInitializedOutput{}, mi.checkInitializedPointer(p) | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) checkInitializedPointer(p pointer) error { | ||||
| 	mi.init() | ||||
| 	if !mi.needsInitCheck { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if p.IsNil() { | ||||
| 		for _, f := range mi.orderedCoderFields { | ||||
| 			if f.isRequired { | ||||
| 				return errors.RequiredNotSet(string(mi.Desc.Fields().ByNumber(f.num).FullName())) | ||||
| 			} | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
| 	if mi.extensionOffset.IsValid() { | ||||
| 		e := p.Apply(mi.extensionOffset).Extensions() | ||||
| 		if err := mi.isInitExtensions(e); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	for _, f := range mi.orderedCoderFields { | ||||
| 		if !f.isRequired && f.funcs.isInit == nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		fptr := p.Apply(f.offset) | ||||
| 		if f.isPointer && fptr.Elem().IsNil() { | ||||
| 			if f.isRequired { | ||||
| 				return errors.RequiredNotSet(string(mi.Desc.Fields().ByNumber(f.num).FullName())) | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 		if f.funcs.isInit == nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		if err := f.funcs.isInit(fptr, f); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) isInitExtensions(ext *map[int32]ExtensionField) error { | ||||
| 	if ext == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	for _, x := range *ext { | ||||
| 		ei := getExtensionFieldInfo(x.Type()) | ||||
| 		if ei.funcs.isInit == nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		v := x.Value() | ||||
| 		if !v.IsValid() { | ||||
| 			continue | ||||
| 		} | ||||
| 		if err := ei.funcs.isInit(v); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	needsInitCheckMu  sync.Mutex | ||||
| 	needsInitCheckMap sync.Map | ||||
| ) | ||||
|  | ||||
| // needsInitCheck reports whether a message needs to be checked for partial initialization. | ||||
| // | ||||
| // It returns true if the message transitively includes any required or extension fields. | ||||
| func needsInitCheck(md pref.MessageDescriptor) bool { | ||||
| 	if v, ok := needsInitCheckMap.Load(md); ok { | ||||
| 		if has, ok := v.(bool); ok { | ||||
| 			return has | ||||
| 		} | ||||
| 	} | ||||
| 	needsInitCheckMu.Lock() | ||||
| 	defer needsInitCheckMu.Unlock() | ||||
| 	return needsInitCheckLocked(md) | ||||
| } | ||||
|  | ||||
| func needsInitCheckLocked(md pref.MessageDescriptor) (has bool) { | ||||
| 	if v, ok := needsInitCheckMap.Load(md); ok { | ||||
| 		// If has is true, we've previously determined that this message | ||||
| 		// needs init checks. | ||||
| 		// | ||||
| 		// If has is false, we've previously determined that it can never | ||||
| 		// be uninitialized. | ||||
| 		// | ||||
| 		// If has is not a bool, we've just encountered a cycle in the | ||||
| 		// message graph. In this case, it is safe to return false: If | ||||
| 		// the message does have required fields, we'll detect them later | ||||
| 		// in the graph traversal. | ||||
| 		has, ok := v.(bool) | ||||
| 		return ok && has | ||||
| 	} | ||||
| 	needsInitCheckMap.Store(md, struct{}{}) // avoid cycles while descending into this message | ||||
| 	defer func() { | ||||
| 		needsInitCheckMap.Store(md, has) | ||||
| 	}() | ||||
| 	if md.RequiredNumbers().Len() > 0 { | ||||
| 		return true | ||||
| 	} | ||||
| 	if md.ExtensionRanges().Len() > 0 { | ||||
| 		return true | ||||
| 	} | ||||
| 	for i := 0; i < md.Fields().Len(); i++ { | ||||
| 		fd := md.Fields().Get(i) | ||||
| 		// Map keys are never messages, so just consider the map value. | ||||
| 		if fd.IsMap() { | ||||
| 			fd = fd.MapValue() | ||||
| 		} | ||||
| 		fmd := fd.Message() | ||||
| 		if fmd != nil && needsInitCheckLocked(fmd) { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
							
								
								
									
										223
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_extension.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_extension.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,223 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"sync" | ||||
| 	"sync/atomic" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| type extensionFieldInfo struct { | ||||
| 	wiretag             uint64 | ||||
| 	tagsize             int | ||||
| 	unmarshalNeedsValue bool | ||||
| 	funcs               valueCoderFuncs | ||||
| 	validation          validationInfo | ||||
| } | ||||
|  | ||||
| var legacyExtensionFieldInfoCache sync.Map // map[protoreflect.ExtensionType]*extensionFieldInfo | ||||
|  | ||||
| func getExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { | ||||
| 	if xi, ok := xt.(*ExtensionInfo); ok { | ||||
| 		xi.lazyInit() | ||||
| 		return xi.info | ||||
| 	} | ||||
| 	return legacyLoadExtensionFieldInfo(xt) | ||||
| } | ||||
|  | ||||
| // legacyLoadExtensionFieldInfo dynamically loads a *ExtensionInfo for xt. | ||||
| func legacyLoadExtensionFieldInfo(xt pref.ExtensionType) *extensionFieldInfo { | ||||
| 	if xi, ok := legacyExtensionFieldInfoCache.Load(xt); ok { | ||||
| 		return xi.(*extensionFieldInfo) | ||||
| 	} | ||||
| 	e := makeExtensionFieldInfo(xt.TypeDescriptor()) | ||||
| 	if e, ok := legacyMessageTypeCache.LoadOrStore(xt, e); ok { | ||||
| 		return e.(*extensionFieldInfo) | ||||
| 	} | ||||
| 	return e | ||||
| } | ||||
|  | ||||
| func makeExtensionFieldInfo(xd pref.ExtensionDescriptor) *extensionFieldInfo { | ||||
| 	var wiretag uint64 | ||||
| 	if !xd.IsPacked() { | ||||
| 		wiretag = protowire.EncodeTag(xd.Number(), wireTypes[xd.Kind()]) | ||||
| 	} else { | ||||
| 		wiretag = protowire.EncodeTag(xd.Number(), protowire.BytesType) | ||||
| 	} | ||||
| 	e := &extensionFieldInfo{ | ||||
| 		wiretag: wiretag, | ||||
| 		tagsize: protowire.SizeVarint(wiretag), | ||||
| 		funcs:   encoderFuncsForValue(xd), | ||||
| 	} | ||||
| 	// Does the unmarshal function need a value passed to it? | ||||
| 	// This is true for composite types, where we pass in a message, list, or map to fill in, | ||||
| 	// and for enums, where we pass in a prototype value to specify the concrete enum type. | ||||
| 	switch xd.Kind() { | ||||
| 	case pref.MessageKind, pref.GroupKind, pref.EnumKind: | ||||
| 		e.unmarshalNeedsValue = true | ||||
| 	default: | ||||
| 		if xd.Cardinality() == pref.Repeated { | ||||
| 			e.unmarshalNeedsValue = true | ||||
| 		} | ||||
| 	} | ||||
| 	return e | ||||
| } | ||||
|  | ||||
| type lazyExtensionValue struct { | ||||
| 	atomicOnce uint32 // atomically set if value is valid | ||||
| 	mu         sync.Mutex | ||||
| 	xi         *extensionFieldInfo | ||||
| 	value      pref.Value | ||||
| 	b          []byte | ||||
| 	fn         func() pref.Value | ||||
| } | ||||
|  | ||||
| type ExtensionField struct { | ||||
| 	typ pref.ExtensionType | ||||
|  | ||||
| 	// value is either the value of GetValue, | ||||
| 	// or a *lazyExtensionValue that then returns the value of GetValue. | ||||
| 	value pref.Value | ||||
| 	lazy  *lazyExtensionValue | ||||
| } | ||||
|  | ||||
| func (f *ExtensionField) appendLazyBytes(xt pref.ExtensionType, xi *extensionFieldInfo, num protowire.Number, wtyp protowire.Type, b []byte) { | ||||
| 	if f.lazy == nil { | ||||
| 		f.lazy = &lazyExtensionValue{xi: xi} | ||||
| 	} | ||||
| 	f.typ = xt | ||||
| 	f.lazy.xi = xi | ||||
| 	f.lazy.b = protowire.AppendTag(f.lazy.b, num, wtyp) | ||||
| 	f.lazy.b = append(f.lazy.b, b...) | ||||
| } | ||||
|  | ||||
| func (f *ExtensionField) canLazy(xt pref.ExtensionType) bool { | ||||
| 	if f.typ == nil { | ||||
| 		return true | ||||
| 	} | ||||
| 	if f.typ == xt && f.lazy != nil && atomic.LoadUint32(&f.lazy.atomicOnce) == 0 { | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (f *ExtensionField) lazyInit() { | ||||
| 	f.lazy.mu.Lock() | ||||
| 	defer f.lazy.mu.Unlock() | ||||
| 	if atomic.LoadUint32(&f.lazy.atomicOnce) == 1 { | ||||
| 		return | ||||
| 	} | ||||
| 	if f.lazy.xi != nil { | ||||
| 		b := f.lazy.b | ||||
| 		val := f.typ.New() | ||||
| 		for len(b) > 0 { | ||||
| 			var tag uint64 | ||||
| 			if b[0] < 0x80 { | ||||
| 				tag = uint64(b[0]) | ||||
| 				b = b[1:] | ||||
| 			} else if len(b) >= 2 && b[1] < 128 { | ||||
| 				tag = uint64(b[0]&0x7f) + uint64(b[1])<<7 | ||||
| 				b = b[2:] | ||||
| 			} else { | ||||
| 				var n int | ||||
| 				tag, n = protowire.ConsumeVarint(b) | ||||
| 				if n < 0 { | ||||
| 					panic(errors.New("bad tag in lazy extension decoding")) | ||||
| 				} | ||||
| 				b = b[n:] | ||||
| 			} | ||||
| 			num := protowire.Number(tag >> 3) | ||||
| 			wtyp := protowire.Type(tag & 7) | ||||
| 			var out unmarshalOutput | ||||
| 			var err error | ||||
| 			val, out, err = f.lazy.xi.funcs.unmarshal(b, val, num, wtyp, lazyUnmarshalOptions) | ||||
| 			if err != nil { | ||||
| 				panic(errors.New("decode failure in lazy extension decoding: %v", err)) | ||||
| 			} | ||||
| 			b = b[out.n:] | ||||
| 		} | ||||
| 		f.lazy.value = val | ||||
| 	} else { | ||||
| 		f.lazy.value = f.lazy.fn() | ||||
| 	} | ||||
| 	f.lazy.xi = nil | ||||
| 	f.lazy.fn = nil | ||||
| 	f.lazy.b = nil | ||||
| 	atomic.StoreUint32(&f.lazy.atomicOnce, 1) | ||||
| } | ||||
|  | ||||
| // Set sets the type and value of the extension field. | ||||
| // This must not be called concurrently. | ||||
| func (f *ExtensionField) Set(t pref.ExtensionType, v pref.Value) { | ||||
| 	f.typ = t | ||||
| 	f.value = v | ||||
| 	f.lazy = nil | ||||
| } | ||||
|  | ||||
| // SetLazy sets the type and a value that is to be lazily evaluated upon first use. | ||||
| // This must not be called concurrently. | ||||
| func (f *ExtensionField) SetLazy(t pref.ExtensionType, fn func() pref.Value) { | ||||
| 	f.typ = t | ||||
| 	f.lazy = &lazyExtensionValue{fn: fn} | ||||
| } | ||||
|  | ||||
| // Value returns the value of the extension field. | ||||
| // This may be called concurrently. | ||||
| func (f *ExtensionField) Value() pref.Value { | ||||
| 	if f.lazy != nil { | ||||
| 		if atomic.LoadUint32(&f.lazy.atomicOnce) == 0 { | ||||
| 			f.lazyInit() | ||||
| 		} | ||||
| 		return f.lazy.value | ||||
| 	} | ||||
| 	return f.value | ||||
| } | ||||
|  | ||||
| // Type returns the type of the extension field. | ||||
| // This may be called concurrently. | ||||
| func (f ExtensionField) Type() pref.ExtensionType { | ||||
| 	return f.typ | ||||
| } | ||||
|  | ||||
| // IsSet returns whether the extension field is set. | ||||
| // This may be called concurrently. | ||||
| func (f ExtensionField) IsSet() bool { | ||||
| 	return f.typ != nil | ||||
| } | ||||
|  | ||||
| // IsLazy reports whether a field is lazily encoded. | ||||
| // It is exported for testing. | ||||
| func IsLazy(m pref.Message, fd pref.FieldDescriptor) bool { | ||||
| 	var mi *MessageInfo | ||||
| 	var p pointer | ||||
| 	switch m := m.(type) { | ||||
| 	case *messageState: | ||||
| 		mi = m.messageInfo() | ||||
| 		p = m.pointer() | ||||
| 	case *messageReflectWrapper: | ||||
| 		mi = m.messageInfo() | ||||
| 		p = m.pointer() | ||||
| 	default: | ||||
| 		return false | ||||
| 	} | ||||
| 	xd, ok := fd.(pref.ExtensionTypeDescriptor) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	xt := xd.Type() | ||||
| 	ext := mi.extensionMap(p) | ||||
| 	if ext == nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	f, ok := (*ext)[int32(fd.Number())] | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	return f.typ == xt && f.lazy != nil && atomic.LoadUint32(&f.lazy.atomicOnce) == 0 | ||||
| } | ||||
							
								
								
									
										830
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_field.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										830
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_field.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,830 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	preg "google.golang.org/protobuf/reflect/protoregistry" | ||||
| 	piface "google.golang.org/protobuf/runtime/protoiface" | ||||
| ) | ||||
|  | ||||
| type errInvalidUTF8 struct{} | ||||
|  | ||||
| func (errInvalidUTF8) Error() string     { return "string field contains invalid UTF-8" } | ||||
| func (errInvalidUTF8) InvalidUTF8() bool { return true } | ||||
| func (errInvalidUTF8) Unwrap() error     { return errors.Error } | ||||
|  | ||||
| // initOneofFieldCoders initializes the fast-path functions for the fields in a oneof. | ||||
| // | ||||
| // For size, marshal, and isInit operations, functions are set only on the first field | ||||
| // in the oneof. The functions are called when the oneof is non-nil, and will dispatch | ||||
| // to the appropriate field-specific function as necessary. | ||||
| // | ||||
| // The unmarshal function is set on each field individually as usual. | ||||
| func (mi *MessageInfo) initOneofFieldCoders(od pref.OneofDescriptor, si structInfo) { | ||||
| 	fs := si.oneofsByName[od.Name()] | ||||
| 	ft := fs.Type | ||||
| 	oneofFields := make(map[reflect.Type]*coderFieldInfo) | ||||
| 	needIsInit := false | ||||
| 	fields := od.Fields() | ||||
| 	for i, lim := 0, fields.Len(); i < lim; i++ { | ||||
| 		fd := od.Fields().Get(i) | ||||
| 		num := fd.Number() | ||||
| 		// Make a copy of the original coderFieldInfo for use in unmarshaling. | ||||
| 		// | ||||
| 		// oneofFields[oneofType].funcs.marshal is the field-specific marshal function. | ||||
| 		// | ||||
| 		// mi.coderFields[num].marshal is set on only the first field in the oneof, | ||||
| 		// and dispatches to the field-specific marshaler in oneofFields. | ||||
| 		cf := *mi.coderFields[num] | ||||
| 		ot := si.oneofWrappersByNumber[num] | ||||
| 		cf.ft = ot.Field(0).Type | ||||
| 		cf.mi, cf.funcs = fieldCoder(fd, cf.ft) | ||||
| 		oneofFields[ot] = &cf | ||||
| 		if cf.funcs.isInit != nil { | ||||
| 			needIsInit = true | ||||
| 		} | ||||
| 		mi.coderFields[num].funcs.unmarshal = func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) { | ||||
| 			var vw reflect.Value         // pointer to wrapper type | ||||
| 			vi := p.AsValueOf(ft).Elem() // oneof field value of interface kind | ||||
| 			if !vi.IsNil() && !vi.Elem().IsNil() && vi.Elem().Elem().Type() == ot { | ||||
| 				vw = vi.Elem() | ||||
| 			} else { | ||||
| 				vw = reflect.New(ot) | ||||
| 			} | ||||
| 			out, err := cf.funcs.unmarshal(b, pointerOfValue(vw).Apply(zeroOffset), wtyp, &cf, opts) | ||||
| 			if err != nil { | ||||
| 				return out, err | ||||
| 			} | ||||
| 			vi.Set(vw) | ||||
| 			return out, nil | ||||
| 		} | ||||
| 	} | ||||
| 	getInfo := func(p pointer) (pointer, *coderFieldInfo) { | ||||
| 		v := p.AsValueOf(ft).Elem() | ||||
| 		if v.IsNil() { | ||||
| 			return pointer{}, nil | ||||
| 		} | ||||
| 		v = v.Elem() // interface -> *struct | ||||
| 		if v.IsNil() { | ||||
| 			return pointer{}, nil | ||||
| 		} | ||||
| 		return pointerOfValue(v).Apply(zeroOffset), oneofFields[v.Elem().Type()] | ||||
| 	} | ||||
| 	first := mi.coderFields[od.Fields().Get(0).Number()] | ||||
| 	first.funcs.size = func(p pointer, _ *coderFieldInfo, opts marshalOptions) int { | ||||
| 		p, info := getInfo(p) | ||||
| 		if info == nil || info.funcs.size == nil { | ||||
| 			return 0 | ||||
| 		} | ||||
| 		return info.funcs.size(p, info, opts) | ||||
| 	} | ||||
| 	first.funcs.marshal = func(b []byte, p pointer, _ *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 		p, info := getInfo(p) | ||||
| 		if info == nil || info.funcs.marshal == nil { | ||||
| 			return b, nil | ||||
| 		} | ||||
| 		return info.funcs.marshal(b, p, info, opts) | ||||
| 	} | ||||
| 	first.funcs.merge = func(dst, src pointer, _ *coderFieldInfo, opts mergeOptions) { | ||||
| 		srcp, srcinfo := getInfo(src) | ||||
| 		if srcinfo == nil || srcinfo.funcs.merge == nil { | ||||
| 			return | ||||
| 		} | ||||
| 		dstp, dstinfo := getInfo(dst) | ||||
| 		if dstinfo != srcinfo { | ||||
| 			dst.AsValueOf(ft).Elem().Set(reflect.New(src.AsValueOf(ft).Elem().Elem().Elem().Type())) | ||||
| 			dstp = pointerOfValue(dst.AsValueOf(ft).Elem().Elem()).Apply(zeroOffset) | ||||
| 		} | ||||
| 		srcinfo.funcs.merge(dstp, srcp, srcinfo, opts) | ||||
| 	} | ||||
| 	if needIsInit { | ||||
| 		first.funcs.isInit = func(p pointer, _ *coderFieldInfo) error { | ||||
| 			p, info := getInfo(p) | ||||
| 			if info == nil || info.funcs.isInit == nil { | ||||
| 				return nil | ||||
| 			} | ||||
| 			return info.funcs.isInit(p, info) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func makeWeakMessageFieldCoder(fd pref.FieldDescriptor) pointerCoderFuncs { | ||||
| 	var once sync.Once | ||||
| 	var messageType pref.MessageType | ||||
| 	lazyInit := func() { | ||||
| 		once.Do(func() { | ||||
| 			messageName := fd.Message().FullName() | ||||
| 			messageType, _ = preg.GlobalTypes.FindMessageByName(messageName) | ||||
| 		}) | ||||
| 	} | ||||
|  | ||||
| 	return pointerCoderFuncs{ | ||||
| 		size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int { | ||||
| 			m, ok := p.WeakFields().get(f.num) | ||||
| 			if !ok { | ||||
| 				return 0 | ||||
| 			} | ||||
| 			lazyInit() | ||||
| 			if messageType == nil { | ||||
| 				panic(fmt.Sprintf("weak message %v is not linked in", fd.Message().FullName())) | ||||
| 			} | ||||
| 			return sizeMessage(m, f.tagsize, opts) | ||||
| 		}, | ||||
| 		marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 			m, ok := p.WeakFields().get(f.num) | ||||
| 			if !ok { | ||||
| 				return b, nil | ||||
| 			} | ||||
| 			lazyInit() | ||||
| 			if messageType == nil { | ||||
| 				panic(fmt.Sprintf("weak message %v is not linked in", fd.Message().FullName())) | ||||
| 			} | ||||
| 			return appendMessage(b, m, f.wiretag, opts) | ||||
| 		}, | ||||
| 		unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) { | ||||
| 			fs := p.WeakFields() | ||||
| 			m, ok := fs.get(f.num) | ||||
| 			if !ok { | ||||
| 				lazyInit() | ||||
| 				if messageType == nil { | ||||
| 					return unmarshalOutput{}, errUnknown | ||||
| 				} | ||||
| 				m = messageType.New().Interface() | ||||
| 				fs.set(f.num, m) | ||||
| 			} | ||||
| 			return consumeMessage(b, m, wtyp, opts) | ||||
| 		}, | ||||
| 		isInit: func(p pointer, f *coderFieldInfo) error { | ||||
| 			m, ok := p.WeakFields().get(f.num) | ||||
| 			if !ok { | ||||
| 				return nil | ||||
| 			} | ||||
| 			return proto.CheckInitialized(m) | ||||
| 		}, | ||||
| 		merge: func(dst, src pointer, f *coderFieldInfo, opts mergeOptions) { | ||||
| 			sm, ok := src.WeakFields().get(f.num) | ||||
| 			if !ok { | ||||
| 				return | ||||
| 			} | ||||
| 			dm, ok := dst.WeakFields().get(f.num) | ||||
| 			if !ok { | ||||
| 				lazyInit() | ||||
| 				if messageType == nil { | ||||
| 					panic(fmt.Sprintf("weak message %v is not linked in", fd.Message().FullName())) | ||||
| 				} | ||||
| 				dm = messageType.New().Interface() | ||||
| 				dst.WeakFields().set(f.num, dm) | ||||
| 			} | ||||
| 			opts.Merge(dm, sm) | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func makeMessageFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { | ||||
| 	if mi := getMessageInfo(ft); mi != nil { | ||||
| 		funcs := pointerCoderFuncs{ | ||||
| 			size:      sizeMessageInfo, | ||||
| 			marshal:   appendMessageInfo, | ||||
| 			unmarshal: consumeMessageInfo, | ||||
| 			merge:     mergeMessage, | ||||
| 		} | ||||
| 		if needsInitCheck(mi.Desc) { | ||||
| 			funcs.isInit = isInitMessageInfo | ||||
| 		} | ||||
| 		return funcs | ||||
| 	} else { | ||||
| 		return pointerCoderFuncs{ | ||||
| 			size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int { | ||||
| 				m := asMessage(p.AsValueOf(ft).Elem()) | ||||
| 				return sizeMessage(m, f.tagsize, opts) | ||||
| 			}, | ||||
| 			marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 				m := asMessage(p.AsValueOf(ft).Elem()) | ||||
| 				return appendMessage(b, m, f.wiretag, opts) | ||||
| 			}, | ||||
| 			unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) { | ||||
| 				mp := p.AsValueOf(ft).Elem() | ||||
| 				if mp.IsNil() { | ||||
| 					mp.Set(reflect.New(ft.Elem())) | ||||
| 				} | ||||
| 				return consumeMessage(b, asMessage(mp), wtyp, opts) | ||||
| 			}, | ||||
| 			isInit: func(p pointer, f *coderFieldInfo) error { | ||||
| 				m := asMessage(p.AsValueOf(ft).Elem()) | ||||
| 				return proto.CheckInitialized(m) | ||||
| 			}, | ||||
| 			merge: mergeMessage, | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func sizeMessageInfo(p pointer, f *coderFieldInfo, opts marshalOptions) int { | ||||
| 	return protowire.SizeBytes(f.mi.sizePointer(p.Elem(), opts)) + f.tagsize | ||||
| } | ||||
|  | ||||
| func appendMessageInfo(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 	b = protowire.AppendVarint(b, f.wiretag) | ||||
| 	b = protowire.AppendVarint(b, uint64(f.mi.sizePointer(p.Elem(), opts))) | ||||
| 	return f.mi.marshalAppendPointer(b, p.Elem(), opts) | ||||
| } | ||||
|  | ||||
| func consumeMessageInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	if wtyp != protowire.BytesType { | ||||
| 		return out, errUnknown | ||||
| 	} | ||||
| 	v, n := protowire.ConsumeBytes(b) | ||||
| 	if n < 0 { | ||||
| 		return out, errDecode | ||||
| 	} | ||||
| 	if p.Elem().IsNil() { | ||||
| 		p.SetPointer(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem()))) | ||||
| 	} | ||||
| 	o, err := f.mi.unmarshalPointer(v, p.Elem(), 0, opts) | ||||
| 	if err != nil { | ||||
| 		return out, err | ||||
| 	} | ||||
| 	out.n = n | ||||
| 	out.initialized = o.initialized | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func isInitMessageInfo(p pointer, f *coderFieldInfo) error { | ||||
| 	return f.mi.checkInitializedPointer(p.Elem()) | ||||
| } | ||||
|  | ||||
| func sizeMessage(m proto.Message, tagsize int, _ marshalOptions) int { | ||||
| 	return protowire.SizeBytes(proto.Size(m)) + tagsize | ||||
| } | ||||
|  | ||||
| func appendMessage(b []byte, m proto.Message, wiretag uint64, opts marshalOptions) ([]byte, error) { | ||||
| 	b = protowire.AppendVarint(b, wiretag) | ||||
| 	b = protowire.AppendVarint(b, uint64(proto.Size(m))) | ||||
| 	return opts.Options().MarshalAppend(b, m) | ||||
| } | ||||
|  | ||||
| func consumeMessage(b []byte, m proto.Message, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	if wtyp != protowire.BytesType { | ||||
| 		return out, errUnknown | ||||
| 	} | ||||
| 	v, n := protowire.ConsumeBytes(b) | ||||
| 	if n < 0 { | ||||
| 		return out, errDecode | ||||
| 	} | ||||
| 	o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ | ||||
| 		Buf:     v, | ||||
| 		Message: m.ProtoReflect(), | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return out, err | ||||
| 	} | ||||
| 	out.n = n | ||||
| 	out.initialized = o.Flags&piface.UnmarshalInitialized != 0 | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func sizeMessageValue(v pref.Value, tagsize int, opts marshalOptions) int { | ||||
| 	m := v.Message().Interface() | ||||
| 	return sizeMessage(m, tagsize, opts) | ||||
| } | ||||
|  | ||||
| func appendMessageValue(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { | ||||
| 	m := v.Message().Interface() | ||||
| 	return appendMessage(b, m, wiretag, opts) | ||||
| } | ||||
|  | ||||
| func consumeMessageValue(b []byte, v pref.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) { | ||||
| 	m := v.Message().Interface() | ||||
| 	out, err := consumeMessage(b, m, wtyp, opts) | ||||
| 	return v, out, err | ||||
| } | ||||
|  | ||||
| func isInitMessageValue(v pref.Value) error { | ||||
| 	m := v.Message().Interface() | ||||
| 	return proto.CheckInitialized(m) | ||||
| } | ||||
|  | ||||
| var coderMessageValue = valueCoderFuncs{ | ||||
| 	size:      sizeMessageValue, | ||||
| 	marshal:   appendMessageValue, | ||||
| 	unmarshal: consumeMessageValue, | ||||
| 	isInit:    isInitMessageValue, | ||||
| 	merge:     mergeMessageValue, | ||||
| } | ||||
|  | ||||
| func sizeGroupValue(v pref.Value, tagsize int, opts marshalOptions) int { | ||||
| 	m := v.Message().Interface() | ||||
| 	return sizeGroup(m, tagsize, opts) | ||||
| } | ||||
|  | ||||
| func appendGroupValue(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { | ||||
| 	m := v.Message().Interface() | ||||
| 	return appendGroup(b, m, wiretag, opts) | ||||
| } | ||||
|  | ||||
| func consumeGroupValue(b []byte, v pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) { | ||||
| 	m := v.Message().Interface() | ||||
| 	out, err := consumeGroup(b, m, num, wtyp, opts) | ||||
| 	return v, out, err | ||||
| } | ||||
|  | ||||
| var coderGroupValue = valueCoderFuncs{ | ||||
| 	size:      sizeGroupValue, | ||||
| 	marshal:   appendGroupValue, | ||||
| 	unmarshal: consumeGroupValue, | ||||
| 	isInit:    isInitMessageValue, | ||||
| 	merge:     mergeMessageValue, | ||||
| } | ||||
|  | ||||
| func makeGroupFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { | ||||
| 	num := fd.Number() | ||||
| 	if mi := getMessageInfo(ft); mi != nil { | ||||
| 		funcs := pointerCoderFuncs{ | ||||
| 			size:      sizeGroupType, | ||||
| 			marshal:   appendGroupType, | ||||
| 			unmarshal: consumeGroupType, | ||||
| 			merge:     mergeMessage, | ||||
| 		} | ||||
| 		if needsInitCheck(mi.Desc) { | ||||
| 			funcs.isInit = isInitMessageInfo | ||||
| 		} | ||||
| 		return funcs | ||||
| 	} else { | ||||
| 		return pointerCoderFuncs{ | ||||
| 			size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int { | ||||
| 				m := asMessage(p.AsValueOf(ft).Elem()) | ||||
| 				return sizeGroup(m, f.tagsize, opts) | ||||
| 			}, | ||||
| 			marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 				m := asMessage(p.AsValueOf(ft).Elem()) | ||||
| 				return appendGroup(b, m, f.wiretag, opts) | ||||
| 			}, | ||||
| 			unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) { | ||||
| 				mp := p.AsValueOf(ft).Elem() | ||||
| 				if mp.IsNil() { | ||||
| 					mp.Set(reflect.New(ft.Elem())) | ||||
| 				} | ||||
| 				return consumeGroup(b, asMessage(mp), num, wtyp, opts) | ||||
| 			}, | ||||
| 			isInit: func(p pointer, f *coderFieldInfo) error { | ||||
| 				m := asMessage(p.AsValueOf(ft).Elem()) | ||||
| 				return proto.CheckInitialized(m) | ||||
| 			}, | ||||
| 			merge: mergeMessage, | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func sizeGroupType(p pointer, f *coderFieldInfo, opts marshalOptions) int { | ||||
| 	return 2*f.tagsize + f.mi.sizePointer(p.Elem(), opts) | ||||
| } | ||||
|  | ||||
| func appendGroupType(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 	b = protowire.AppendVarint(b, f.wiretag) // start group | ||||
| 	b, err := f.mi.marshalAppendPointer(b, p.Elem(), opts) | ||||
| 	b = protowire.AppendVarint(b, f.wiretag+1) // end group | ||||
| 	return b, err | ||||
| } | ||||
|  | ||||
| func consumeGroupType(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	if wtyp != protowire.StartGroupType { | ||||
| 		return out, errUnknown | ||||
| 	} | ||||
| 	if p.Elem().IsNil() { | ||||
| 		p.SetPointer(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem()))) | ||||
| 	} | ||||
| 	return f.mi.unmarshalPointer(b, p.Elem(), f.num, opts) | ||||
| } | ||||
|  | ||||
| func sizeGroup(m proto.Message, tagsize int, _ marshalOptions) int { | ||||
| 	return 2*tagsize + proto.Size(m) | ||||
| } | ||||
|  | ||||
| func appendGroup(b []byte, m proto.Message, wiretag uint64, opts marshalOptions) ([]byte, error) { | ||||
| 	b = protowire.AppendVarint(b, wiretag) // start group | ||||
| 	b, err := opts.Options().MarshalAppend(b, m) | ||||
| 	b = protowire.AppendVarint(b, wiretag+1) // end group | ||||
| 	return b, err | ||||
| } | ||||
|  | ||||
| func consumeGroup(b []byte, m proto.Message, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	if wtyp != protowire.StartGroupType { | ||||
| 		return out, errUnknown | ||||
| 	} | ||||
| 	b, n := protowire.ConsumeGroup(num, b) | ||||
| 	if n < 0 { | ||||
| 		return out, errDecode | ||||
| 	} | ||||
| 	o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ | ||||
| 		Buf:     b, | ||||
| 		Message: m.ProtoReflect(), | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return out, err | ||||
| 	} | ||||
| 	out.n = n | ||||
| 	out.initialized = o.Flags&piface.UnmarshalInitialized != 0 | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func makeMessageSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { | ||||
| 	if mi := getMessageInfo(ft); mi != nil { | ||||
| 		funcs := pointerCoderFuncs{ | ||||
| 			size:      sizeMessageSliceInfo, | ||||
| 			marshal:   appendMessageSliceInfo, | ||||
| 			unmarshal: consumeMessageSliceInfo, | ||||
| 			merge:     mergeMessageSlice, | ||||
| 		} | ||||
| 		if needsInitCheck(mi.Desc) { | ||||
| 			funcs.isInit = isInitMessageSliceInfo | ||||
| 		} | ||||
| 		return funcs | ||||
| 	} | ||||
| 	return pointerCoderFuncs{ | ||||
| 		size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int { | ||||
| 			return sizeMessageSlice(p, ft, f.tagsize, opts) | ||||
| 		}, | ||||
| 		marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 			return appendMessageSlice(b, p, f.wiretag, ft, opts) | ||||
| 		}, | ||||
| 		unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) { | ||||
| 			return consumeMessageSlice(b, p, ft, wtyp, opts) | ||||
| 		}, | ||||
| 		isInit: func(p pointer, f *coderFieldInfo) error { | ||||
| 			return isInitMessageSlice(p, ft) | ||||
| 		}, | ||||
| 		merge: mergeMessageSlice, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func sizeMessageSliceInfo(p pointer, f *coderFieldInfo, opts marshalOptions) int { | ||||
| 	s := p.PointerSlice() | ||||
| 	n := 0 | ||||
| 	for _, v := range s { | ||||
| 		n += protowire.SizeBytes(f.mi.sizePointer(v, opts)) + f.tagsize | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func appendMessageSliceInfo(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 	s := p.PointerSlice() | ||||
| 	var err error | ||||
| 	for _, v := range s { | ||||
| 		b = protowire.AppendVarint(b, f.wiretag) | ||||
| 		siz := f.mi.sizePointer(v, opts) | ||||
| 		b = protowire.AppendVarint(b, uint64(siz)) | ||||
| 		b, err = f.mi.marshalAppendPointer(b, v, opts) | ||||
| 		if err != nil { | ||||
| 			return b, err | ||||
| 		} | ||||
| 	} | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func consumeMessageSliceInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	if wtyp != protowire.BytesType { | ||||
| 		return out, errUnknown | ||||
| 	} | ||||
| 	v, n := protowire.ConsumeBytes(b) | ||||
| 	if n < 0 { | ||||
| 		return out, errDecode | ||||
| 	} | ||||
| 	m := reflect.New(f.mi.GoReflectType.Elem()).Interface() | ||||
| 	mp := pointerOfIface(m) | ||||
| 	o, err := f.mi.unmarshalPointer(v, mp, 0, opts) | ||||
| 	if err != nil { | ||||
| 		return out, err | ||||
| 	} | ||||
| 	p.AppendPointerSlice(mp) | ||||
| 	out.n = n | ||||
| 	out.initialized = o.initialized | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func isInitMessageSliceInfo(p pointer, f *coderFieldInfo) error { | ||||
| 	s := p.PointerSlice() | ||||
| 	for _, v := range s { | ||||
| 		if err := f.mi.checkInitializedPointer(v); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func sizeMessageSlice(p pointer, goType reflect.Type, tagsize int, _ marshalOptions) int { | ||||
| 	s := p.PointerSlice() | ||||
| 	n := 0 | ||||
| 	for _, v := range s { | ||||
| 		m := asMessage(v.AsValueOf(goType.Elem())) | ||||
| 		n += protowire.SizeBytes(proto.Size(m)) + tagsize | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func appendMessageSlice(b []byte, p pointer, wiretag uint64, goType reflect.Type, opts marshalOptions) ([]byte, error) { | ||||
| 	s := p.PointerSlice() | ||||
| 	var err error | ||||
| 	for _, v := range s { | ||||
| 		m := asMessage(v.AsValueOf(goType.Elem())) | ||||
| 		b = protowire.AppendVarint(b, wiretag) | ||||
| 		siz := proto.Size(m) | ||||
| 		b = protowire.AppendVarint(b, uint64(siz)) | ||||
| 		b, err = opts.Options().MarshalAppend(b, m) | ||||
| 		if err != nil { | ||||
| 			return b, err | ||||
| 		} | ||||
| 	} | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func consumeMessageSlice(b []byte, p pointer, goType reflect.Type, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	if wtyp != protowire.BytesType { | ||||
| 		return out, errUnknown | ||||
| 	} | ||||
| 	v, n := protowire.ConsumeBytes(b) | ||||
| 	if n < 0 { | ||||
| 		return out, errDecode | ||||
| 	} | ||||
| 	mp := reflect.New(goType.Elem()) | ||||
| 	o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ | ||||
| 		Buf:     v, | ||||
| 		Message: asMessage(mp).ProtoReflect(), | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return out, err | ||||
| 	} | ||||
| 	p.AppendPointerSlice(pointerOfValue(mp)) | ||||
| 	out.n = n | ||||
| 	out.initialized = o.Flags&piface.UnmarshalInitialized != 0 | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func isInitMessageSlice(p pointer, goType reflect.Type) error { | ||||
| 	s := p.PointerSlice() | ||||
| 	for _, v := range s { | ||||
| 		m := asMessage(v.AsValueOf(goType.Elem())) | ||||
| 		if err := proto.CheckInitialized(m); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Slices of messages | ||||
|  | ||||
| func sizeMessageSliceValue(listv pref.Value, tagsize int, opts marshalOptions) int { | ||||
| 	list := listv.List() | ||||
| 	n := 0 | ||||
| 	for i, llen := 0, list.Len(); i < llen; i++ { | ||||
| 		m := list.Get(i).Message().Interface() | ||||
| 		n += protowire.SizeBytes(proto.Size(m)) + tagsize | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func appendMessageSliceValue(b []byte, listv pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { | ||||
| 	list := listv.List() | ||||
| 	mopts := opts.Options() | ||||
| 	for i, llen := 0, list.Len(); i < llen; i++ { | ||||
| 		m := list.Get(i).Message().Interface() | ||||
| 		b = protowire.AppendVarint(b, wiretag) | ||||
| 		siz := proto.Size(m) | ||||
| 		b = protowire.AppendVarint(b, uint64(siz)) | ||||
| 		var err error | ||||
| 		b, err = mopts.MarshalAppend(b, m) | ||||
| 		if err != nil { | ||||
| 			return b, err | ||||
| 		} | ||||
| 	} | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func consumeMessageSliceValue(b []byte, listv pref.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ pref.Value, out unmarshalOutput, err error) { | ||||
| 	list := listv.List() | ||||
| 	if wtyp != protowire.BytesType { | ||||
| 		return pref.Value{}, out, errUnknown | ||||
| 	} | ||||
| 	v, n := protowire.ConsumeBytes(b) | ||||
| 	if n < 0 { | ||||
| 		return pref.Value{}, out, errDecode | ||||
| 	} | ||||
| 	m := list.NewElement() | ||||
| 	o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ | ||||
| 		Buf:     v, | ||||
| 		Message: m.Message(), | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return pref.Value{}, out, err | ||||
| 	} | ||||
| 	list.Append(m) | ||||
| 	out.n = n | ||||
| 	out.initialized = o.Flags&piface.UnmarshalInitialized != 0 | ||||
| 	return listv, out, nil | ||||
| } | ||||
|  | ||||
| func isInitMessageSliceValue(listv pref.Value) error { | ||||
| 	list := listv.List() | ||||
| 	for i, llen := 0, list.Len(); i < llen; i++ { | ||||
| 		m := list.Get(i).Message().Interface() | ||||
| 		if err := proto.CheckInitialized(m); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| var coderMessageSliceValue = valueCoderFuncs{ | ||||
| 	size:      sizeMessageSliceValue, | ||||
| 	marshal:   appendMessageSliceValue, | ||||
| 	unmarshal: consumeMessageSliceValue, | ||||
| 	isInit:    isInitMessageSliceValue, | ||||
| 	merge:     mergeMessageListValue, | ||||
| } | ||||
|  | ||||
| func sizeGroupSliceValue(listv pref.Value, tagsize int, opts marshalOptions) int { | ||||
| 	list := listv.List() | ||||
| 	n := 0 | ||||
| 	for i, llen := 0, list.Len(); i < llen; i++ { | ||||
| 		m := list.Get(i).Message().Interface() | ||||
| 		n += 2*tagsize + proto.Size(m) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func appendGroupSliceValue(b []byte, listv pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) { | ||||
| 	list := listv.List() | ||||
| 	mopts := opts.Options() | ||||
| 	for i, llen := 0, list.Len(); i < llen; i++ { | ||||
| 		m := list.Get(i).Message().Interface() | ||||
| 		b = protowire.AppendVarint(b, wiretag) // start group | ||||
| 		var err error | ||||
| 		b, err = mopts.MarshalAppend(b, m) | ||||
| 		if err != nil { | ||||
| 			return b, err | ||||
| 		} | ||||
| 		b = protowire.AppendVarint(b, wiretag+1) // end group | ||||
| 	} | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func consumeGroupSliceValue(b []byte, listv pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ pref.Value, out unmarshalOutput, err error) { | ||||
| 	list := listv.List() | ||||
| 	if wtyp != protowire.StartGroupType { | ||||
| 		return pref.Value{}, out, errUnknown | ||||
| 	} | ||||
| 	b, n := protowire.ConsumeGroup(num, b) | ||||
| 	if n < 0 { | ||||
| 		return pref.Value{}, out, errDecode | ||||
| 	} | ||||
| 	m := list.NewElement() | ||||
| 	o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ | ||||
| 		Buf:     b, | ||||
| 		Message: m.Message(), | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return pref.Value{}, out, err | ||||
| 	} | ||||
| 	list.Append(m) | ||||
| 	out.n = n | ||||
| 	out.initialized = o.Flags&piface.UnmarshalInitialized != 0 | ||||
| 	return listv, out, nil | ||||
| } | ||||
|  | ||||
| var coderGroupSliceValue = valueCoderFuncs{ | ||||
| 	size:      sizeGroupSliceValue, | ||||
| 	marshal:   appendGroupSliceValue, | ||||
| 	unmarshal: consumeGroupSliceValue, | ||||
| 	isInit:    isInitMessageSliceValue, | ||||
| 	merge:     mergeMessageListValue, | ||||
| } | ||||
|  | ||||
| func makeGroupSliceFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs { | ||||
| 	num := fd.Number() | ||||
| 	if mi := getMessageInfo(ft); mi != nil { | ||||
| 		funcs := pointerCoderFuncs{ | ||||
| 			size:      sizeGroupSliceInfo, | ||||
| 			marshal:   appendGroupSliceInfo, | ||||
| 			unmarshal: consumeGroupSliceInfo, | ||||
| 			merge:     mergeMessageSlice, | ||||
| 		} | ||||
| 		if needsInitCheck(mi.Desc) { | ||||
| 			funcs.isInit = isInitMessageSliceInfo | ||||
| 		} | ||||
| 		return funcs | ||||
| 	} | ||||
| 	return pointerCoderFuncs{ | ||||
| 		size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int { | ||||
| 			return sizeGroupSlice(p, ft, f.tagsize, opts) | ||||
| 		}, | ||||
| 		marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 			return appendGroupSlice(b, p, f.wiretag, ft, opts) | ||||
| 		}, | ||||
| 		unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) { | ||||
| 			return consumeGroupSlice(b, p, num, wtyp, ft, opts) | ||||
| 		}, | ||||
| 		isInit: func(p pointer, f *coderFieldInfo) error { | ||||
| 			return isInitMessageSlice(p, ft) | ||||
| 		}, | ||||
| 		merge: mergeMessageSlice, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func sizeGroupSlice(p pointer, messageType reflect.Type, tagsize int, _ marshalOptions) int { | ||||
| 	s := p.PointerSlice() | ||||
| 	n := 0 | ||||
| 	for _, v := range s { | ||||
| 		m := asMessage(v.AsValueOf(messageType.Elem())) | ||||
| 		n += 2*tagsize + proto.Size(m) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func appendGroupSlice(b []byte, p pointer, wiretag uint64, messageType reflect.Type, opts marshalOptions) ([]byte, error) { | ||||
| 	s := p.PointerSlice() | ||||
| 	var err error | ||||
| 	for _, v := range s { | ||||
| 		m := asMessage(v.AsValueOf(messageType.Elem())) | ||||
| 		b = protowire.AppendVarint(b, wiretag) // start group | ||||
| 		b, err = opts.Options().MarshalAppend(b, m) | ||||
| 		if err != nil { | ||||
| 			return b, err | ||||
| 		} | ||||
| 		b = protowire.AppendVarint(b, wiretag+1) // end group | ||||
| 	} | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func consumeGroupSlice(b []byte, p pointer, num protowire.Number, wtyp protowire.Type, goType reflect.Type, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	if wtyp != protowire.StartGroupType { | ||||
| 		return out, errUnknown | ||||
| 	} | ||||
| 	b, n := protowire.ConsumeGroup(num, b) | ||||
| 	if n < 0 { | ||||
| 		return out, errDecode | ||||
| 	} | ||||
| 	mp := reflect.New(goType.Elem()) | ||||
| 	o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{ | ||||
| 		Buf:     b, | ||||
| 		Message: asMessage(mp).ProtoReflect(), | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return out, err | ||||
| 	} | ||||
| 	p.AppendPointerSlice(pointerOfValue(mp)) | ||||
| 	out.n = n | ||||
| 	out.initialized = o.Flags&piface.UnmarshalInitialized != 0 | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func sizeGroupSliceInfo(p pointer, f *coderFieldInfo, opts marshalOptions) int { | ||||
| 	s := p.PointerSlice() | ||||
| 	n := 0 | ||||
| 	for _, v := range s { | ||||
| 		n += 2*f.tagsize + f.mi.sizePointer(v, opts) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func appendGroupSliceInfo(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 	s := p.PointerSlice() | ||||
| 	var err error | ||||
| 	for _, v := range s { | ||||
| 		b = protowire.AppendVarint(b, f.wiretag) // start group | ||||
| 		b, err = f.mi.marshalAppendPointer(b, v, opts) | ||||
| 		if err != nil { | ||||
| 			return b, err | ||||
| 		} | ||||
| 		b = protowire.AppendVarint(b, f.wiretag+1) // end group | ||||
| 	} | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func consumeGroupSliceInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) { | ||||
| 	if wtyp != protowire.StartGroupType { | ||||
| 		return unmarshalOutput{}, errUnknown | ||||
| 	} | ||||
| 	m := reflect.New(f.mi.GoReflectType.Elem()).Interface() | ||||
| 	mp := pointerOfIface(m) | ||||
| 	out, err := f.mi.unmarshalPointer(b, mp, f.num, opts) | ||||
| 	if err != nil { | ||||
| 		return out, err | ||||
| 	} | ||||
| 	p.AppendPointerSlice(mp) | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func asMessage(v reflect.Value) pref.ProtoMessage { | ||||
| 	if m, ok := v.Interface().(pref.ProtoMessage); ok { | ||||
| 		return m | ||||
| 	} | ||||
| 	return legacyWrapMessage(v).Interface() | ||||
| } | ||||
							
								
								
									
										5637
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5637
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										388
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_map.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										388
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_map.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,388 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| type mapInfo struct { | ||||
| 	goType     reflect.Type | ||||
| 	keyWiretag uint64 | ||||
| 	valWiretag uint64 | ||||
| 	keyFuncs   valueCoderFuncs | ||||
| 	valFuncs   valueCoderFuncs | ||||
| 	keyZero    pref.Value | ||||
| 	keyKind    pref.Kind | ||||
| 	conv       *mapConverter | ||||
| } | ||||
|  | ||||
| func encoderFuncsForMap(fd pref.FieldDescriptor, ft reflect.Type) (valueMessage *MessageInfo, funcs pointerCoderFuncs) { | ||||
| 	// TODO: Consider generating specialized map coders. | ||||
| 	keyField := fd.MapKey() | ||||
| 	valField := fd.MapValue() | ||||
| 	keyWiretag := protowire.EncodeTag(1, wireTypes[keyField.Kind()]) | ||||
| 	valWiretag := protowire.EncodeTag(2, wireTypes[valField.Kind()]) | ||||
| 	keyFuncs := encoderFuncsForValue(keyField) | ||||
| 	valFuncs := encoderFuncsForValue(valField) | ||||
| 	conv := newMapConverter(ft, fd) | ||||
|  | ||||
| 	mapi := &mapInfo{ | ||||
| 		goType:     ft, | ||||
| 		keyWiretag: keyWiretag, | ||||
| 		valWiretag: valWiretag, | ||||
| 		keyFuncs:   keyFuncs, | ||||
| 		valFuncs:   valFuncs, | ||||
| 		keyZero:    keyField.Default(), | ||||
| 		keyKind:    keyField.Kind(), | ||||
| 		conv:       conv, | ||||
| 	} | ||||
| 	if valField.Kind() == pref.MessageKind { | ||||
| 		valueMessage = getMessageInfo(ft.Elem()) | ||||
| 	} | ||||
|  | ||||
| 	funcs = pointerCoderFuncs{ | ||||
| 		size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int { | ||||
| 			return sizeMap(p.AsValueOf(ft).Elem(), mapi, f, opts) | ||||
| 		}, | ||||
| 		marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 			return appendMap(b, p.AsValueOf(ft).Elem(), mapi, f, opts) | ||||
| 		}, | ||||
| 		unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) { | ||||
| 			mp := p.AsValueOf(ft) | ||||
| 			if mp.Elem().IsNil() { | ||||
| 				mp.Elem().Set(reflect.MakeMap(mapi.goType)) | ||||
| 			} | ||||
| 			if f.mi == nil { | ||||
| 				return consumeMap(b, mp.Elem(), wtyp, mapi, f, opts) | ||||
| 			} else { | ||||
| 				return consumeMapOfMessage(b, mp.Elem(), wtyp, mapi, f, opts) | ||||
| 			} | ||||
| 		}, | ||||
| 	} | ||||
| 	switch valField.Kind() { | ||||
| 	case pref.MessageKind: | ||||
| 		funcs.merge = mergeMapOfMessage | ||||
| 	case pref.BytesKind: | ||||
| 		funcs.merge = mergeMapOfBytes | ||||
| 	default: | ||||
| 		funcs.merge = mergeMap | ||||
| 	} | ||||
| 	if valFuncs.isInit != nil { | ||||
| 		funcs.isInit = func(p pointer, f *coderFieldInfo) error { | ||||
| 			return isInitMap(p.AsValueOf(ft).Elem(), mapi, f) | ||||
| 		} | ||||
| 	} | ||||
| 	return valueMessage, funcs | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	mapKeyTagSize = 1 // field 1, tag size 1. | ||||
| 	mapValTagSize = 1 // field 2, tag size 2. | ||||
| ) | ||||
|  | ||||
| func sizeMap(mapv reflect.Value, mapi *mapInfo, f *coderFieldInfo, opts marshalOptions) int { | ||||
| 	if mapv.Len() == 0 { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	n := 0 | ||||
| 	iter := mapRange(mapv) | ||||
| 	for iter.Next() { | ||||
| 		key := mapi.conv.keyConv.PBValueOf(iter.Key()).MapKey() | ||||
| 		keySize := mapi.keyFuncs.size(key.Value(), mapKeyTagSize, opts) | ||||
| 		var valSize int | ||||
| 		value := mapi.conv.valConv.PBValueOf(iter.Value()) | ||||
| 		if f.mi == nil { | ||||
| 			valSize = mapi.valFuncs.size(value, mapValTagSize, opts) | ||||
| 		} else { | ||||
| 			p := pointerOfValue(iter.Value()) | ||||
| 			valSize += mapValTagSize | ||||
| 			valSize += protowire.SizeBytes(f.mi.sizePointer(p, opts)) | ||||
| 		} | ||||
| 		n += f.tagsize + protowire.SizeBytes(keySize+valSize) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	if wtyp != protowire.BytesType { | ||||
| 		return out, errUnknown | ||||
| 	} | ||||
| 	b, n := protowire.ConsumeBytes(b) | ||||
| 	if n < 0 { | ||||
| 		return out, errDecode | ||||
| 	} | ||||
| 	var ( | ||||
| 		key = mapi.keyZero | ||||
| 		val = mapi.conv.valConv.New() | ||||
| 	) | ||||
| 	for len(b) > 0 { | ||||
| 		num, wtyp, n := protowire.ConsumeTag(b) | ||||
| 		if n < 0 { | ||||
| 			return out, errDecode | ||||
| 		} | ||||
| 		if num > protowire.MaxValidNumber { | ||||
| 			return out, errDecode | ||||
| 		} | ||||
| 		b = b[n:] | ||||
| 		err := errUnknown | ||||
| 		switch num { | ||||
| 		case genid.MapEntry_Key_field_number: | ||||
| 			var v pref.Value | ||||
| 			var o unmarshalOutput | ||||
| 			v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts) | ||||
| 			if err != nil { | ||||
| 				break | ||||
| 			} | ||||
| 			key = v | ||||
| 			n = o.n | ||||
| 		case genid.MapEntry_Value_field_number: | ||||
| 			var v pref.Value | ||||
| 			var o unmarshalOutput | ||||
| 			v, o, err = mapi.valFuncs.unmarshal(b, val, num, wtyp, opts) | ||||
| 			if err != nil { | ||||
| 				break | ||||
| 			} | ||||
| 			val = v | ||||
| 			n = o.n | ||||
| 		} | ||||
| 		if err == errUnknown { | ||||
| 			n = protowire.ConsumeFieldValue(num, wtyp, b) | ||||
| 			if n < 0 { | ||||
| 				return out, errDecode | ||||
| 			} | ||||
| 		} else if err != nil { | ||||
| 			return out, err | ||||
| 		} | ||||
| 		b = b[n:] | ||||
| 	} | ||||
| 	mapv.SetMapIndex(mapi.conv.keyConv.GoValueOf(key), mapi.conv.valConv.GoValueOf(val)) | ||||
| 	out.n = n | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func consumeMapOfMessage(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	if wtyp != protowire.BytesType { | ||||
| 		return out, errUnknown | ||||
| 	} | ||||
| 	b, n := protowire.ConsumeBytes(b) | ||||
| 	if n < 0 { | ||||
| 		return out, errDecode | ||||
| 	} | ||||
| 	var ( | ||||
| 		key = mapi.keyZero | ||||
| 		val = reflect.New(f.mi.GoReflectType.Elem()) | ||||
| 	) | ||||
| 	for len(b) > 0 { | ||||
| 		num, wtyp, n := protowire.ConsumeTag(b) | ||||
| 		if n < 0 { | ||||
| 			return out, errDecode | ||||
| 		} | ||||
| 		if num > protowire.MaxValidNumber { | ||||
| 			return out, errDecode | ||||
| 		} | ||||
| 		b = b[n:] | ||||
| 		err := errUnknown | ||||
| 		switch num { | ||||
| 		case 1: | ||||
| 			var v pref.Value | ||||
| 			var o unmarshalOutput | ||||
| 			v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts) | ||||
| 			if err != nil { | ||||
| 				break | ||||
| 			} | ||||
| 			key = v | ||||
| 			n = o.n | ||||
| 		case 2: | ||||
| 			if wtyp != protowire.BytesType { | ||||
| 				break | ||||
| 			} | ||||
| 			var v []byte | ||||
| 			v, n = protowire.ConsumeBytes(b) | ||||
| 			if n < 0 { | ||||
| 				return out, errDecode | ||||
| 			} | ||||
| 			var o unmarshalOutput | ||||
| 			o, err = f.mi.unmarshalPointer(v, pointerOfValue(val), 0, opts) | ||||
| 			if o.initialized { | ||||
| 				// Consider this map item initialized so long as we see | ||||
| 				// an initialized value. | ||||
| 				out.initialized = true | ||||
| 			} | ||||
| 		} | ||||
| 		if err == errUnknown { | ||||
| 			n = protowire.ConsumeFieldValue(num, wtyp, b) | ||||
| 			if n < 0 { | ||||
| 				return out, errDecode | ||||
| 			} | ||||
| 		} else if err != nil { | ||||
| 			return out, err | ||||
| 		} | ||||
| 		b = b[n:] | ||||
| 	} | ||||
| 	mapv.SetMapIndex(mapi.conv.keyConv.GoValueOf(key), val) | ||||
| 	out.n = n | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func appendMapItem(b []byte, keyrv, valrv reflect.Value, mapi *mapInfo, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 	if f.mi == nil { | ||||
| 		key := mapi.conv.keyConv.PBValueOf(keyrv).MapKey() | ||||
| 		val := mapi.conv.valConv.PBValueOf(valrv) | ||||
| 		size := 0 | ||||
| 		size += mapi.keyFuncs.size(key.Value(), mapKeyTagSize, opts) | ||||
| 		size += mapi.valFuncs.size(val, mapValTagSize, opts) | ||||
| 		b = protowire.AppendVarint(b, uint64(size)) | ||||
| 		b, err := mapi.keyFuncs.marshal(b, key.Value(), mapi.keyWiretag, opts) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		return mapi.valFuncs.marshal(b, val, mapi.valWiretag, opts) | ||||
| 	} else { | ||||
| 		key := mapi.conv.keyConv.PBValueOf(keyrv).MapKey() | ||||
| 		val := pointerOfValue(valrv) | ||||
| 		valSize := f.mi.sizePointer(val, opts) | ||||
| 		size := 0 | ||||
| 		size += mapi.keyFuncs.size(key.Value(), mapKeyTagSize, opts) | ||||
| 		size += mapValTagSize + protowire.SizeBytes(valSize) | ||||
| 		b = protowire.AppendVarint(b, uint64(size)) | ||||
| 		b, err := mapi.keyFuncs.marshal(b, key.Value(), mapi.keyWiretag, opts) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		b = protowire.AppendVarint(b, mapi.valWiretag) | ||||
| 		b = protowire.AppendVarint(b, uint64(valSize)) | ||||
| 		return f.mi.marshalAppendPointer(b, val, opts) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func appendMap(b []byte, mapv reflect.Value, mapi *mapInfo, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 	if mapv.Len() == 0 { | ||||
| 		return b, nil | ||||
| 	} | ||||
| 	if opts.Deterministic() { | ||||
| 		return appendMapDeterministic(b, mapv, mapi, f, opts) | ||||
| 	} | ||||
| 	iter := mapRange(mapv) | ||||
| 	for iter.Next() { | ||||
| 		var err error | ||||
| 		b = protowire.AppendVarint(b, f.wiretag) | ||||
| 		b, err = appendMapItem(b, iter.Key(), iter.Value(), mapi, f, opts) | ||||
| 		if err != nil { | ||||
| 			return b, err | ||||
| 		} | ||||
| 	} | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func appendMapDeterministic(b []byte, mapv reflect.Value, mapi *mapInfo, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 	keys := mapv.MapKeys() | ||||
| 	sort.Slice(keys, func(i, j int) bool { | ||||
| 		switch keys[i].Kind() { | ||||
| 		case reflect.Bool: | ||||
| 			return !keys[i].Bool() && keys[j].Bool() | ||||
| 		case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | ||||
| 			return keys[i].Int() < keys[j].Int() | ||||
| 		case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: | ||||
| 			return keys[i].Uint() < keys[j].Uint() | ||||
| 		case reflect.Float32, reflect.Float64: | ||||
| 			return keys[i].Float() < keys[j].Float() | ||||
| 		case reflect.String: | ||||
| 			return keys[i].String() < keys[j].String() | ||||
| 		default: | ||||
| 			panic("invalid kind: " + keys[i].Kind().String()) | ||||
| 		} | ||||
| 	}) | ||||
| 	for _, key := range keys { | ||||
| 		var err error | ||||
| 		b = protowire.AppendVarint(b, f.wiretag) | ||||
| 		b, err = appendMapItem(b, key, mapv.MapIndex(key), mapi, f, opts) | ||||
| 		if err != nil { | ||||
| 			return b, err | ||||
| 		} | ||||
| 	} | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func isInitMap(mapv reflect.Value, mapi *mapInfo, f *coderFieldInfo) error { | ||||
| 	if mi := f.mi; mi != nil { | ||||
| 		mi.init() | ||||
| 		if !mi.needsInitCheck { | ||||
| 			return nil | ||||
| 		} | ||||
| 		iter := mapRange(mapv) | ||||
| 		for iter.Next() { | ||||
| 			val := pointerOfValue(iter.Value()) | ||||
| 			if err := mi.checkInitializedPointer(val); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 	} else { | ||||
| 		iter := mapRange(mapv) | ||||
| 		for iter.Next() { | ||||
| 			val := mapi.conv.valConv.PBValueOf(iter.Value()) | ||||
| 			if err := mapi.valFuncs.isInit(val); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func mergeMap(dst, src pointer, f *coderFieldInfo, opts mergeOptions) { | ||||
| 	dstm := dst.AsValueOf(f.ft).Elem() | ||||
| 	srcm := src.AsValueOf(f.ft).Elem() | ||||
| 	if srcm.Len() == 0 { | ||||
| 		return | ||||
| 	} | ||||
| 	if dstm.IsNil() { | ||||
| 		dstm.Set(reflect.MakeMap(f.ft)) | ||||
| 	} | ||||
| 	iter := mapRange(srcm) | ||||
| 	for iter.Next() { | ||||
| 		dstm.SetMapIndex(iter.Key(), iter.Value()) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeMapOfBytes(dst, src pointer, f *coderFieldInfo, opts mergeOptions) { | ||||
| 	dstm := dst.AsValueOf(f.ft).Elem() | ||||
| 	srcm := src.AsValueOf(f.ft).Elem() | ||||
| 	if srcm.Len() == 0 { | ||||
| 		return | ||||
| 	} | ||||
| 	if dstm.IsNil() { | ||||
| 		dstm.Set(reflect.MakeMap(f.ft)) | ||||
| 	} | ||||
| 	iter := mapRange(srcm) | ||||
| 	for iter.Next() { | ||||
| 		dstm.SetMapIndex(iter.Key(), reflect.ValueOf(append(emptyBuf[:], iter.Value().Bytes()...))) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeMapOfMessage(dst, src pointer, f *coderFieldInfo, opts mergeOptions) { | ||||
| 	dstm := dst.AsValueOf(f.ft).Elem() | ||||
| 	srcm := src.AsValueOf(f.ft).Elem() | ||||
| 	if srcm.Len() == 0 { | ||||
| 		return | ||||
| 	} | ||||
| 	if dstm.IsNil() { | ||||
| 		dstm.Set(reflect.MakeMap(f.ft)) | ||||
| 	} | ||||
| 	iter := mapRange(srcm) | ||||
| 	for iter.Next() { | ||||
| 		val := reflect.New(f.ft.Elem().Elem()) | ||||
| 		if f.mi != nil { | ||||
| 			f.mi.mergePointer(pointerOfValue(val), pointerOfValue(iter.Value()), opts) | ||||
| 		} else { | ||||
| 			opts.Merge(asMessage(val), asMessage(iter.Value())) | ||||
| 		} | ||||
| 		dstm.SetMapIndex(iter.Key(), val) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										38
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_map_go111.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_map_go111.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| // 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. | ||||
|  | ||||
| //go:build !go1.12 | ||||
| // +build !go1.12 | ||||
|  | ||||
| package impl | ||||
|  | ||||
| import "reflect" | ||||
|  | ||||
| type mapIter struct { | ||||
| 	v    reflect.Value | ||||
| 	keys []reflect.Value | ||||
| } | ||||
|  | ||||
| // mapRange provides a less-efficient equivalent to | ||||
| // the Go 1.12 reflect.Value.MapRange method. | ||||
| func mapRange(v reflect.Value) *mapIter { | ||||
| 	return &mapIter{v: v} | ||||
| } | ||||
|  | ||||
| func (i *mapIter) Next() bool { | ||||
| 	if i.keys == nil { | ||||
| 		i.keys = i.v.MapKeys() | ||||
| 	} else { | ||||
| 		i.keys = i.keys[1:] | ||||
| 	} | ||||
| 	return len(i.keys) > 0 | ||||
| } | ||||
|  | ||||
| func (i *mapIter) Key() reflect.Value { | ||||
| 	return i.keys[0] | ||||
| } | ||||
|  | ||||
| func (i *mapIter) Value() reflect.Value { | ||||
| 	return i.v.MapIndex(i.keys[0]) | ||||
| } | ||||
							
								
								
									
										12
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_map_go112.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_map_go112.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| // 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. | ||||
|  | ||||
| //go:build go1.12 | ||||
| // +build go1.12 | ||||
|  | ||||
| package impl | ||||
|  | ||||
| import "reflect" | ||||
|  | ||||
| func mapRange(v reflect.Value) *reflect.MapIter { return v.MapRange() } | ||||
							
								
								
									
										217
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_message.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_message.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,217 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/encoding/messageset" | ||||
| 	"google.golang.org/protobuf/internal/order" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	piface "google.golang.org/protobuf/runtime/protoiface" | ||||
| ) | ||||
|  | ||||
| // coderMessageInfo contains per-message information used by the fast-path functions. | ||||
| // This is a different type from MessageInfo to keep MessageInfo as general-purpose as | ||||
| // possible. | ||||
| type coderMessageInfo struct { | ||||
| 	methods piface.Methods | ||||
|  | ||||
| 	orderedCoderFields []*coderFieldInfo | ||||
| 	denseCoderFields   []*coderFieldInfo | ||||
| 	coderFields        map[protowire.Number]*coderFieldInfo | ||||
| 	sizecacheOffset    offset | ||||
| 	unknownOffset      offset | ||||
| 	unknownPtrKind     bool | ||||
| 	extensionOffset    offset | ||||
| 	needsInitCheck     bool | ||||
| 	isMessageSet       bool | ||||
| 	numRequiredFields  uint8 | ||||
| } | ||||
|  | ||||
| type coderFieldInfo struct { | ||||
| 	funcs      pointerCoderFuncs // fast-path per-field functions | ||||
| 	mi         *MessageInfo      // field's message | ||||
| 	ft         reflect.Type | ||||
| 	validation validationInfo   // information used by message validation | ||||
| 	num        pref.FieldNumber // field number | ||||
| 	offset     offset           // struct field offset | ||||
| 	wiretag    uint64           // field tag (number + wire type) | ||||
| 	tagsize    int              // size of the varint-encoded tag | ||||
| 	isPointer  bool             // true if IsNil may be called on the struct field | ||||
| 	isRequired bool             // true if field is required | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { | ||||
| 	mi.sizecacheOffset = invalidOffset | ||||
| 	mi.unknownOffset = invalidOffset | ||||
| 	mi.extensionOffset = invalidOffset | ||||
|  | ||||
| 	if si.sizecacheOffset.IsValid() && si.sizecacheType == sizecacheType { | ||||
| 		mi.sizecacheOffset = si.sizecacheOffset | ||||
| 	} | ||||
| 	if si.unknownOffset.IsValid() && (si.unknownType == unknownFieldsAType || si.unknownType == unknownFieldsBType) { | ||||
| 		mi.unknownOffset = si.unknownOffset | ||||
| 		mi.unknownPtrKind = si.unknownType.Kind() == reflect.Ptr | ||||
| 	} | ||||
| 	if si.extensionOffset.IsValid() && si.extensionType == extensionFieldsType { | ||||
| 		mi.extensionOffset = si.extensionOffset | ||||
| 	} | ||||
|  | ||||
| 	mi.coderFields = make(map[protowire.Number]*coderFieldInfo) | ||||
| 	fields := mi.Desc.Fields() | ||||
| 	preallocFields := make([]coderFieldInfo, fields.Len()) | ||||
| 	for i := 0; i < fields.Len(); i++ { | ||||
| 		fd := fields.Get(i) | ||||
|  | ||||
| 		fs := si.fieldsByNumber[fd.Number()] | ||||
| 		isOneof := fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic() | ||||
| 		if isOneof { | ||||
| 			fs = si.oneofsByName[fd.ContainingOneof().Name()] | ||||
| 		} | ||||
| 		ft := fs.Type | ||||
| 		var wiretag uint64 | ||||
| 		if !fd.IsPacked() { | ||||
| 			wiretag = protowire.EncodeTag(fd.Number(), wireTypes[fd.Kind()]) | ||||
| 		} else { | ||||
| 			wiretag = protowire.EncodeTag(fd.Number(), protowire.BytesType) | ||||
| 		} | ||||
| 		var fieldOffset offset | ||||
| 		var funcs pointerCoderFuncs | ||||
| 		var childMessage *MessageInfo | ||||
| 		switch { | ||||
| 		case ft == nil: | ||||
| 			// This never occurs for generated message types. | ||||
| 			// It implies that a hand-crafted type has missing Go fields | ||||
| 			// for specific protobuf message fields. | ||||
| 			funcs = pointerCoderFuncs{ | ||||
| 				size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int { | ||||
| 					return 0 | ||||
| 				}, | ||||
| 				marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 					return nil, nil | ||||
| 				}, | ||||
| 				unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) { | ||||
| 					panic("missing Go struct field for " + string(fd.FullName())) | ||||
| 				}, | ||||
| 				isInit: func(p pointer, f *coderFieldInfo) error { | ||||
| 					panic("missing Go struct field for " + string(fd.FullName())) | ||||
| 				}, | ||||
| 				merge: func(dst, src pointer, f *coderFieldInfo, opts mergeOptions) { | ||||
| 					panic("missing Go struct field for " + string(fd.FullName())) | ||||
| 				}, | ||||
| 			} | ||||
| 		case isOneof: | ||||
| 			fieldOffset = offsetOf(fs, mi.Exporter) | ||||
| 		case fd.IsWeak(): | ||||
| 			fieldOffset = si.weakOffset | ||||
| 			funcs = makeWeakMessageFieldCoder(fd) | ||||
| 		default: | ||||
| 			fieldOffset = offsetOf(fs, mi.Exporter) | ||||
| 			childMessage, funcs = fieldCoder(fd, ft) | ||||
| 		} | ||||
| 		cf := &preallocFields[i] | ||||
| 		*cf = coderFieldInfo{ | ||||
| 			num:        fd.Number(), | ||||
| 			offset:     fieldOffset, | ||||
| 			wiretag:    wiretag, | ||||
| 			ft:         ft, | ||||
| 			tagsize:    protowire.SizeVarint(wiretag), | ||||
| 			funcs:      funcs, | ||||
| 			mi:         childMessage, | ||||
| 			validation: newFieldValidationInfo(mi, si, fd, ft), | ||||
| 			isPointer:  fd.Cardinality() == pref.Repeated || fd.HasPresence(), | ||||
| 			isRequired: fd.Cardinality() == pref.Required, | ||||
| 		} | ||||
| 		mi.orderedCoderFields = append(mi.orderedCoderFields, cf) | ||||
| 		mi.coderFields[cf.num] = cf | ||||
| 	} | ||||
| 	for i, oneofs := 0, mi.Desc.Oneofs(); i < oneofs.Len(); i++ { | ||||
| 		if od := oneofs.Get(i); !od.IsSynthetic() { | ||||
| 			mi.initOneofFieldCoders(od, si) | ||||
| 		} | ||||
| 	} | ||||
| 	if messageset.IsMessageSet(mi.Desc) { | ||||
| 		if !mi.extensionOffset.IsValid() { | ||||
| 			panic(fmt.Sprintf("%v: MessageSet with no extensions field", mi.Desc.FullName())) | ||||
| 		} | ||||
| 		if !mi.unknownOffset.IsValid() { | ||||
| 			panic(fmt.Sprintf("%v: MessageSet with no unknown field", mi.Desc.FullName())) | ||||
| 		} | ||||
| 		mi.isMessageSet = true | ||||
| 	} | ||||
| 	sort.Slice(mi.orderedCoderFields, func(i, j int) bool { | ||||
| 		return mi.orderedCoderFields[i].num < mi.orderedCoderFields[j].num | ||||
| 	}) | ||||
|  | ||||
| 	var maxDense pref.FieldNumber | ||||
| 	for _, cf := range mi.orderedCoderFields { | ||||
| 		if cf.num >= 16 && cf.num >= 2*maxDense { | ||||
| 			break | ||||
| 		} | ||||
| 		maxDense = cf.num | ||||
| 	} | ||||
| 	mi.denseCoderFields = make([]*coderFieldInfo, maxDense+1) | ||||
| 	for _, cf := range mi.orderedCoderFields { | ||||
| 		if int(cf.num) >= len(mi.denseCoderFields) { | ||||
| 			break | ||||
| 		} | ||||
| 		mi.denseCoderFields[cf.num] = cf | ||||
| 	} | ||||
|  | ||||
| 	// To preserve compatibility with historic wire output, marshal oneofs last. | ||||
| 	if mi.Desc.Oneofs().Len() > 0 { | ||||
| 		sort.Slice(mi.orderedCoderFields, func(i, j int) bool { | ||||
| 			fi := fields.ByNumber(mi.orderedCoderFields[i].num) | ||||
| 			fj := fields.ByNumber(mi.orderedCoderFields[j].num) | ||||
| 			return order.LegacyFieldOrder(fi, fj) | ||||
| 		}) | ||||
| 	} | ||||
|  | ||||
| 	mi.needsInitCheck = needsInitCheck(mi.Desc) | ||||
| 	if mi.methods.Marshal == nil && mi.methods.Size == nil { | ||||
| 		mi.methods.Flags |= piface.SupportMarshalDeterministic | ||||
| 		mi.methods.Marshal = mi.marshal | ||||
| 		mi.methods.Size = mi.size | ||||
| 	} | ||||
| 	if mi.methods.Unmarshal == nil { | ||||
| 		mi.methods.Flags |= piface.SupportUnmarshalDiscardUnknown | ||||
| 		mi.methods.Unmarshal = mi.unmarshal | ||||
| 	} | ||||
| 	if mi.methods.CheckInitialized == nil { | ||||
| 		mi.methods.CheckInitialized = mi.checkInitialized | ||||
| 	} | ||||
| 	if mi.methods.Merge == nil { | ||||
| 		mi.methods.Merge = mi.merge | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // getUnknownBytes returns a *[]byte for the unknown fields. | ||||
| // It is the caller's responsibility to check whether the pointer is nil. | ||||
| // This function is specially designed to be inlineable. | ||||
| func (mi *MessageInfo) getUnknownBytes(p pointer) *[]byte { | ||||
| 	if mi.unknownPtrKind { | ||||
| 		return *p.Apply(mi.unknownOffset).BytesPtr() | ||||
| 	} else { | ||||
| 		return p.Apply(mi.unknownOffset).Bytes() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // mutableUnknownBytes returns a *[]byte for the unknown fields. | ||||
| // The returned pointer is guaranteed to not be nil. | ||||
| func (mi *MessageInfo) mutableUnknownBytes(p pointer) *[]byte { | ||||
| 	if mi.unknownPtrKind { | ||||
| 		bp := p.Apply(mi.unknownOffset).BytesPtr() | ||||
| 		if *bp == nil { | ||||
| 			*bp = new([]byte) | ||||
| 		} | ||||
| 		return *bp | ||||
| 	} else { | ||||
| 		return p.Apply(mi.unknownOffset).Bytes() | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										123
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,123 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"sort" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/encoding/messageset" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	"google.golang.org/protobuf/internal/flags" | ||||
| ) | ||||
|  | ||||
| func sizeMessageSet(mi *MessageInfo, p pointer, opts marshalOptions) (size int) { | ||||
| 	if !flags.ProtoLegacy { | ||||
| 		return 0 | ||||
| 	} | ||||
|  | ||||
| 	ext := *p.Apply(mi.extensionOffset).Extensions() | ||||
| 	for _, x := range ext { | ||||
| 		xi := getExtensionFieldInfo(x.Type()) | ||||
| 		if xi.funcs.size == nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		num, _ := protowire.DecodeTag(xi.wiretag) | ||||
| 		size += messageset.SizeField(num) | ||||
| 		size += xi.funcs.size(x.Value(), protowire.SizeTag(messageset.FieldMessage), opts) | ||||
| 	} | ||||
|  | ||||
| 	if u := mi.getUnknownBytes(p); u != nil { | ||||
| 		size += messageset.SizeUnknown(*u) | ||||
| 	} | ||||
|  | ||||
| 	return size | ||||
| } | ||||
|  | ||||
| func marshalMessageSet(mi *MessageInfo, b []byte, p pointer, opts marshalOptions) ([]byte, error) { | ||||
| 	if !flags.ProtoLegacy { | ||||
| 		return b, errors.New("no support for message_set_wire_format") | ||||
| 	} | ||||
|  | ||||
| 	ext := *p.Apply(mi.extensionOffset).Extensions() | ||||
| 	switch len(ext) { | ||||
| 	case 0: | ||||
| 	case 1: | ||||
| 		// Fast-path for one extension: Don't bother sorting the keys. | ||||
| 		for _, x := range ext { | ||||
| 			var err error | ||||
| 			b, err = marshalMessageSetField(mi, b, x, opts) | ||||
| 			if err != nil { | ||||
| 				return b, err | ||||
| 			} | ||||
| 		} | ||||
| 	default: | ||||
| 		// Sort the keys to provide a deterministic encoding. | ||||
| 		// Not sure this is required, but the old code does it. | ||||
| 		keys := make([]int, 0, len(ext)) | ||||
| 		for k := range ext { | ||||
| 			keys = append(keys, int(k)) | ||||
| 		} | ||||
| 		sort.Ints(keys) | ||||
| 		for _, k := range keys { | ||||
| 			var err error | ||||
| 			b, err = marshalMessageSetField(mi, b, ext[int32(k)], opts) | ||||
| 			if err != nil { | ||||
| 				return b, err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if u := mi.getUnknownBytes(p); u != nil { | ||||
| 		var err error | ||||
| 		b, err = messageset.AppendUnknown(b, *u) | ||||
| 		if err != nil { | ||||
| 			return b, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func marshalMessageSetField(mi *MessageInfo, b []byte, x ExtensionField, opts marshalOptions) ([]byte, error) { | ||||
| 	xi := getExtensionFieldInfo(x.Type()) | ||||
| 	num, _ := protowire.DecodeTag(xi.wiretag) | ||||
| 	b = messageset.AppendFieldStart(b, num) | ||||
| 	b, err := xi.funcs.marshal(b, x.Value(), protowire.EncodeTag(messageset.FieldMessage, protowire.BytesType), opts) | ||||
| 	if err != nil { | ||||
| 		return b, err | ||||
| 	} | ||||
| 	b = messageset.AppendFieldEnd(b) | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func unmarshalMessageSet(mi *MessageInfo, b []byte, p pointer, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	if !flags.ProtoLegacy { | ||||
| 		return out, errors.New("no support for message_set_wire_format") | ||||
| 	} | ||||
|  | ||||
| 	ep := p.Apply(mi.extensionOffset).Extensions() | ||||
| 	if *ep == nil { | ||||
| 		*ep = make(map[int32]ExtensionField) | ||||
| 	} | ||||
| 	ext := *ep | ||||
| 	initialized := true | ||||
| 	err = messageset.Unmarshal(b, true, func(num protowire.Number, v []byte) error { | ||||
| 		o, err := mi.unmarshalExtension(v, num, protowire.BytesType, ext, opts) | ||||
| 		if err == errUnknown { | ||||
| 			u := mi.mutableUnknownBytes(p) | ||||
| 			*u = protowire.AppendTag(*u, num, protowire.BytesType) | ||||
| 			*u = append(*u, v...) | ||||
| 			return nil | ||||
| 		} | ||||
| 		if !o.initialized { | ||||
| 			initialized = false | ||||
| 		} | ||||
| 		return err | ||||
| 	}) | ||||
| 	out.n = len(b) | ||||
| 	out.initialized = initialized | ||||
| 	return out, err | ||||
| } | ||||
							
								
								
									
										210
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,210 @@ | ||||
| // 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. | ||||
|  | ||||
| //go:build purego || appengine | ||||
| // +build purego appengine | ||||
|  | ||||
| package impl | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| ) | ||||
|  | ||||
| func sizeEnum(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) { | ||||
| 	v := p.v.Elem().Int() | ||||
| 	return f.tagsize + protowire.SizeVarint(uint64(v)) | ||||
| } | ||||
|  | ||||
| func appendEnum(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 	v := p.v.Elem().Int() | ||||
| 	b = protowire.AppendVarint(b, f.wiretag) | ||||
| 	b = protowire.AppendVarint(b, uint64(v)) | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func consumeEnum(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	if wtyp != protowire.VarintType { | ||||
| 		return out, errUnknown | ||||
| 	} | ||||
| 	v, n := protowire.ConsumeVarint(b) | ||||
| 	if n < 0 { | ||||
| 		return out, errDecode | ||||
| 	} | ||||
| 	p.v.Elem().SetInt(int64(v)) | ||||
| 	out.n = n | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func mergeEnum(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	dst.v.Elem().Set(src.v.Elem()) | ||||
| } | ||||
|  | ||||
| var coderEnum = pointerCoderFuncs{ | ||||
| 	size:      sizeEnum, | ||||
| 	marshal:   appendEnum, | ||||
| 	unmarshal: consumeEnum, | ||||
| 	merge:     mergeEnum, | ||||
| } | ||||
|  | ||||
| func sizeEnumNoZero(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) { | ||||
| 	if p.v.Elem().Int() == 0 { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	return sizeEnum(p, f, opts) | ||||
| } | ||||
|  | ||||
| func appendEnumNoZero(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 	if p.v.Elem().Int() == 0 { | ||||
| 		return b, nil | ||||
| 	} | ||||
| 	return appendEnum(b, p, f, opts) | ||||
| } | ||||
|  | ||||
| func mergeEnumNoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	if src.v.Elem().Int() != 0 { | ||||
| 		dst.v.Elem().Set(src.v.Elem()) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var coderEnumNoZero = pointerCoderFuncs{ | ||||
| 	size:      sizeEnumNoZero, | ||||
| 	marshal:   appendEnumNoZero, | ||||
| 	unmarshal: consumeEnum, | ||||
| 	merge:     mergeEnumNoZero, | ||||
| } | ||||
|  | ||||
| func sizeEnumPtr(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) { | ||||
| 	return sizeEnum(pointer{p.v.Elem()}, f, opts) | ||||
| } | ||||
|  | ||||
| func appendEnumPtr(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 	return appendEnum(b, pointer{p.v.Elem()}, f, opts) | ||||
| } | ||||
|  | ||||
| func consumeEnumPtr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	if wtyp != protowire.VarintType { | ||||
| 		return out, errUnknown | ||||
| 	} | ||||
| 	if p.v.Elem().IsNil() { | ||||
| 		p.v.Elem().Set(reflect.New(p.v.Elem().Type().Elem())) | ||||
| 	} | ||||
| 	return consumeEnum(b, pointer{p.v.Elem()}, wtyp, f, opts) | ||||
| } | ||||
|  | ||||
| func mergeEnumPtr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	if !src.v.Elem().IsNil() { | ||||
| 		v := reflect.New(dst.v.Type().Elem().Elem()) | ||||
| 		v.Elem().Set(src.v.Elem().Elem()) | ||||
| 		dst.v.Elem().Set(v) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var coderEnumPtr = pointerCoderFuncs{ | ||||
| 	size:      sizeEnumPtr, | ||||
| 	marshal:   appendEnumPtr, | ||||
| 	unmarshal: consumeEnumPtr, | ||||
| 	merge:     mergeEnumPtr, | ||||
| } | ||||
|  | ||||
| func sizeEnumSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) { | ||||
| 	s := p.v.Elem() | ||||
| 	for i, llen := 0, s.Len(); i < llen; i++ { | ||||
| 		size += protowire.SizeVarint(uint64(s.Index(i).Int())) + f.tagsize | ||||
| 	} | ||||
| 	return size | ||||
| } | ||||
|  | ||||
| func appendEnumSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 	s := p.v.Elem() | ||||
| 	for i, llen := 0, s.Len(); i < llen; i++ { | ||||
| 		b = protowire.AppendVarint(b, f.wiretag) | ||||
| 		b = protowire.AppendVarint(b, uint64(s.Index(i).Int())) | ||||
| 	} | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func consumeEnumSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	s := p.v.Elem() | ||||
| 	if wtyp == protowire.BytesType { | ||||
| 		b, n := protowire.ConsumeBytes(b) | ||||
| 		if n < 0 { | ||||
| 			return out, errDecode | ||||
| 		} | ||||
| 		for len(b) > 0 { | ||||
| 			v, n := protowire.ConsumeVarint(b) | ||||
| 			if n < 0 { | ||||
| 				return out, errDecode | ||||
| 			} | ||||
| 			rv := reflect.New(s.Type().Elem()).Elem() | ||||
| 			rv.SetInt(int64(v)) | ||||
| 			s.Set(reflect.Append(s, rv)) | ||||
| 			b = b[n:] | ||||
| 		} | ||||
| 		out.n = n | ||||
| 		return out, nil | ||||
| 	} | ||||
| 	if wtyp != protowire.VarintType { | ||||
| 		return out, errUnknown | ||||
| 	} | ||||
| 	v, n := protowire.ConsumeVarint(b) | ||||
| 	if n < 0 { | ||||
| 		return out, errDecode | ||||
| 	} | ||||
| 	rv := reflect.New(s.Type().Elem()).Elem() | ||||
| 	rv.SetInt(int64(v)) | ||||
| 	s.Set(reflect.Append(s, rv)) | ||||
| 	out.n = n | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func mergeEnumSlice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	dst.v.Elem().Set(reflect.AppendSlice(dst.v.Elem(), src.v.Elem())) | ||||
| } | ||||
|  | ||||
| var coderEnumSlice = pointerCoderFuncs{ | ||||
| 	size:      sizeEnumSlice, | ||||
| 	marshal:   appendEnumSlice, | ||||
| 	unmarshal: consumeEnumSlice, | ||||
| 	merge:     mergeEnumSlice, | ||||
| } | ||||
|  | ||||
| func sizeEnumPackedSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) { | ||||
| 	s := p.v.Elem() | ||||
| 	llen := s.Len() | ||||
| 	if llen == 0 { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	n := 0 | ||||
| 	for i := 0; i < llen; i++ { | ||||
| 		n += protowire.SizeVarint(uint64(s.Index(i).Int())) | ||||
| 	} | ||||
| 	return f.tagsize + protowire.SizeBytes(n) | ||||
| } | ||||
|  | ||||
| func appendEnumPackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { | ||||
| 	s := p.v.Elem() | ||||
| 	llen := s.Len() | ||||
| 	if llen == 0 { | ||||
| 		return b, nil | ||||
| 	} | ||||
| 	b = protowire.AppendVarint(b, f.wiretag) | ||||
| 	n := 0 | ||||
| 	for i := 0; i < llen; i++ { | ||||
| 		n += protowire.SizeVarint(uint64(s.Index(i).Int())) | ||||
| 	} | ||||
| 	b = protowire.AppendVarint(b, uint64(n)) | ||||
| 	for i := 0; i < llen; i++ { | ||||
| 		b = protowire.AppendVarint(b, uint64(s.Index(i).Int())) | ||||
| 	} | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| var coderEnumPackedSlice = pointerCoderFuncs{ | ||||
| 	size:      sizeEnumPackedSlice, | ||||
| 	marshal:   appendEnumPackedSlice, | ||||
| 	unmarshal: consumeEnumSlice, | ||||
| 	merge:     mergeEnumSlice, | ||||
| } | ||||
							
								
								
									
										557
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_tables.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										557
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_tables.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,557 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| // pointerCoderFuncs is a set of pointer encoding functions. | ||||
| type pointerCoderFuncs struct { | ||||
| 	mi        *MessageInfo | ||||
| 	size      func(p pointer, f *coderFieldInfo, opts marshalOptions) int | ||||
| 	marshal   func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) | ||||
| 	unmarshal func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) | ||||
| 	isInit    func(p pointer, f *coderFieldInfo) error | ||||
| 	merge     func(dst, src pointer, f *coderFieldInfo, opts mergeOptions) | ||||
| } | ||||
|  | ||||
| // valueCoderFuncs is a set of protoreflect.Value encoding functions. | ||||
| type valueCoderFuncs struct { | ||||
| 	size      func(v pref.Value, tagsize int, opts marshalOptions) int | ||||
| 	marshal   func(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error) | ||||
| 	unmarshal func(b []byte, v pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) | ||||
| 	isInit    func(v pref.Value) error | ||||
| 	merge     func(dst, src pref.Value, opts mergeOptions) pref.Value | ||||
| } | ||||
|  | ||||
| // fieldCoder returns pointer functions for a field, used for operating on | ||||
| // struct fields. | ||||
| func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointerCoderFuncs) { | ||||
| 	switch { | ||||
| 	case fd.IsMap(): | ||||
| 		return encoderFuncsForMap(fd, ft) | ||||
| 	case fd.Cardinality() == pref.Repeated && !fd.IsPacked(): | ||||
| 		// Repeated fields (not packed). | ||||
| 		if ft.Kind() != reflect.Slice { | ||||
| 			break | ||||
| 		} | ||||
| 		ft := ft.Elem() | ||||
| 		switch fd.Kind() { | ||||
| 		case pref.BoolKind: | ||||
| 			if ft.Kind() == reflect.Bool { | ||||
| 				return nil, coderBoolSlice | ||||
| 			} | ||||
| 		case pref.EnumKind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderEnumSlice | ||||
| 			} | ||||
| 		case pref.Int32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderInt32Slice | ||||
| 			} | ||||
| 		case pref.Sint32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderSint32Slice | ||||
| 			} | ||||
| 		case pref.Uint32Kind: | ||||
| 			if ft.Kind() == reflect.Uint32 { | ||||
| 				return nil, coderUint32Slice | ||||
| 			} | ||||
| 		case pref.Int64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderInt64Slice | ||||
| 			} | ||||
| 		case pref.Sint64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderSint64Slice | ||||
| 			} | ||||
| 		case pref.Uint64Kind: | ||||
| 			if ft.Kind() == reflect.Uint64 { | ||||
| 				return nil, coderUint64Slice | ||||
| 			} | ||||
| 		case pref.Sfixed32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderSfixed32Slice | ||||
| 			} | ||||
| 		case pref.Fixed32Kind: | ||||
| 			if ft.Kind() == reflect.Uint32 { | ||||
| 				return nil, coderFixed32Slice | ||||
| 			} | ||||
| 		case pref.FloatKind: | ||||
| 			if ft.Kind() == reflect.Float32 { | ||||
| 				return nil, coderFloatSlice | ||||
| 			} | ||||
| 		case pref.Sfixed64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderSfixed64Slice | ||||
| 			} | ||||
| 		case pref.Fixed64Kind: | ||||
| 			if ft.Kind() == reflect.Uint64 { | ||||
| 				return nil, coderFixed64Slice | ||||
| 			} | ||||
| 		case pref.DoubleKind: | ||||
| 			if ft.Kind() == reflect.Float64 { | ||||
| 				return nil, coderDoubleSlice | ||||
| 			} | ||||
| 		case pref.StringKind: | ||||
| 			if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { | ||||
| 				return nil, coderStringSliceValidateUTF8 | ||||
| 			} | ||||
| 			if ft.Kind() == reflect.String { | ||||
| 				return nil, coderStringSlice | ||||
| 			} | ||||
| 			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) { | ||||
| 				return nil, coderBytesSliceValidateUTF8 | ||||
| 			} | ||||
| 			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { | ||||
| 				return nil, coderBytesSlice | ||||
| 			} | ||||
| 		case pref.BytesKind: | ||||
| 			if ft.Kind() == reflect.String { | ||||
| 				return nil, coderStringSlice | ||||
| 			} | ||||
| 			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { | ||||
| 				return nil, coderBytesSlice | ||||
| 			} | ||||
| 		case pref.MessageKind: | ||||
| 			return getMessageInfo(ft), makeMessageSliceFieldCoder(fd, ft) | ||||
| 		case pref.GroupKind: | ||||
| 			return getMessageInfo(ft), makeGroupSliceFieldCoder(fd, ft) | ||||
| 		} | ||||
| 	case fd.Cardinality() == pref.Repeated && fd.IsPacked(): | ||||
| 		// Packed repeated fields. | ||||
| 		// | ||||
| 		// Only repeated fields of primitive numeric types | ||||
| 		// (Varint, Fixed32, or Fixed64 wire type) can be packed. | ||||
| 		if ft.Kind() != reflect.Slice { | ||||
| 			break | ||||
| 		} | ||||
| 		ft := ft.Elem() | ||||
| 		switch fd.Kind() { | ||||
| 		case pref.BoolKind: | ||||
| 			if ft.Kind() == reflect.Bool { | ||||
| 				return nil, coderBoolPackedSlice | ||||
| 			} | ||||
| 		case pref.EnumKind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderEnumPackedSlice | ||||
| 			} | ||||
| 		case pref.Int32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderInt32PackedSlice | ||||
| 			} | ||||
| 		case pref.Sint32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderSint32PackedSlice | ||||
| 			} | ||||
| 		case pref.Uint32Kind: | ||||
| 			if ft.Kind() == reflect.Uint32 { | ||||
| 				return nil, coderUint32PackedSlice | ||||
| 			} | ||||
| 		case pref.Int64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderInt64PackedSlice | ||||
| 			} | ||||
| 		case pref.Sint64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderSint64PackedSlice | ||||
| 			} | ||||
| 		case pref.Uint64Kind: | ||||
| 			if ft.Kind() == reflect.Uint64 { | ||||
| 				return nil, coderUint64PackedSlice | ||||
| 			} | ||||
| 		case pref.Sfixed32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderSfixed32PackedSlice | ||||
| 			} | ||||
| 		case pref.Fixed32Kind: | ||||
| 			if ft.Kind() == reflect.Uint32 { | ||||
| 				return nil, coderFixed32PackedSlice | ||||
| 			} | ||||
| 		case pref.FloatKind: | ||||
| 			if ft.Kind() == reflect.Float32 { | ||||
| 				return nil, coderFloatPackedSlice | ||||
| 			} | ||||
| 		case pref.Sfixed64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderSfixed64PackedSlice | ||||
| 			} | ||||
| 		case pref.Fixed64Kind: | ||||
| 			if ft.Kind() == reflect.Uint64 { | ||||
| 				return nil, coderFixed64PackedSlice | ||||
| 			} | ||||
| 		case pref.DoubleKind: | ||||
| 			if ft.Kind() == reflect.Float64 { | ||||
| 				return nil, coderDoublePackedSlice | ||||
| 			} | ||||
| 		} | ||||
| 	case fd.Kind() == pref.MessageKind: | ||||
| 		return getMessageInfo(ft), makeMessageFieldCoder(fd, ft) | ||||
| 	case fd.Kind() == pref.GroupKind: | ||||
| 		return getMessageInfo(ft), makeGroupFieldCoder(fd, ft) | ||||
| 	case fd.Syntax() == pref.Proto3 && fd.ContainingOneof() == nil: | ||||
| 		// Populated oneof fields always encode even if set to the zero value, | ||||
| 		// which normally are not encoded in proto3. | ||||
| 		switch fd.Kind() { | ||||
| 		case pref.BoolKind: | ||||
| 			if ft.Kind() == reflect.Bool { | ||||
| 				return nil, coderBoolNoZero | ||||
| 			} | ||||
| 		case pref.EnumKind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderEnumNoZero | ||||
| 			} | ||||
| 		case pref.Int32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderInt32NoZero | ||||
| 			} | ||||
| 		case pref.Sint32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderSint32NoZero | ||||
| 			} | ||||
| 		case pref.Uint32Kind: | ||||
| 			if ft.Kind() == reflect.Uint32 { | ||||
| 				return nil, coderUint32NoZero | ||||
| 			} | ||||
| 		case pref.Int64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderInt64NoZero | ||||
| 			} | ||||
| 		case pref.Sint64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderSint64NoZero | ||||
| 			} | ||||
| 		case pref.Uint64Kind: | ||||
| 			if ft.Kind() == reflect.Uint64 { | ||||
| 				return nil, coderUint64NoZero | ||||
| 			} | ||||
| 		case pref.Sfixed32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderSfixed32NoZero | ||||
| 			} | ||||
| 		case pref.Fixed32Kind: | ||||
| 			if ft.Kind() == reflect.Uint32 { | ||||
| 				return nil, coderFixed32NoZero | ||||
| 			} | ||||
| 		case pref.FloatKind: | ||||
| 			if ft.Kind() == reflect.Float32 { | ||||
| 				return nil, coderFloatNoZero | ||||
| 			} | ||||
| 		case pref.Sfixed64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderSfixed64NoZero | ||||
| 			} | ||||
| 		case pref.Fixed64Kind: | ||||
| 			if ft.Kind() == reflect.Uint64 { | ||||
| 				return nil, coderFixed64NoZero | ||||
| 			} | ||||
| 		case pref.DoubleKind: | ||||
| 			if ft.Kind() == reflect.Float64 { | ||||
| 				return nil, coderDoubleNoZero | ||||
| 			} | ||||
| 		case pref.StringKind: | ||||
| 			if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { | ||||
| 				return nil, coderStringNoZeroValidateUTF8 | ||||
| 			} | ||||
| 			if ft.Kind() == reflect.String { | ||||
| 				return nil, coderStringNoZero | ||||
| 			} | ||||
| 			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) { | ||||
| 				return nil, coderBytesNoZeroValidateUTF8 | ||||
| 			} | ||||
| 			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { | ||||
| 				return nil, coderBytesNoZero | ||||
| 			} | ||||
| 		case pref.BytesKind: | ||||
| 			if ft.Kind() == reflect.String { | ||||
| 				return nil, coderStringNoZero | ||||
| 			} | ||||
| 			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { | ||||
| 				return nil, coderBytesNoZero | ||||
| 			} | ||||
| 		} | ||||
| 	case ft.Kind() == reflect.Ptr: | ||||
| 		ft := ft.Elem() | ||||
| 		switch fd.Kind() { | ||||
| 		case pref.BoolKind: | ||||
| 			if ft.Kind() == reflect.Bool { | ||||
| 				return nil, coderBoolPtr | ||||
| 			} | ||||
| 		case pref.EnumKind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderEnumPtr | ||||
| 			} | ||||
| 		case pref.Int32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderInt32Ptr | ||||
| 			} | ||||
| 		case pref.Sint32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderSint32Ptr | ||||
| 			} | ||||
| 		case pref.Uint32Kind: | ||||
| 			if ft.Kind() == reflect.Uint32 { | ||||
| 				return nil, coderUint32Ptr | ||||
| 			} | ||||
| 		case pref.Int64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderInt64Ptr | ||||
| 			} | ||||
| 		case pref.Sint64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderSint64Ptr | ||||
| 			} | ||||
| 		case pref.Uint64Kind: | ||||
| 			if ft.Kind() == reflect.Uint64 { | ||||
| 				return nil, coderUint64Ptr | ||||
| 			} | ||||
| 		case pref.Sfixed32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderSfixed32Ptr | ||||
| 			} | ||||
| 		case pref.Fixed32Kind: | ||||
| 			if ft.Kind() == reflect.Uint32 { | ||||
| 				return nil, coderFixed32Ptr | ||||
| 			} | ||||
| 		case pref.FloatKind: | ||||
| 			if ft.Kind() == reflect.Float32 { | ||||
| 				return nil, coderFloatPtr | ||||
| 			} | ||||
| 		case pref.Sfixed64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderSfixed64Ptr | ||||
| 			} | ||||
| 		case pref.Fixed64Kind: | ||||
| 			if ft.Kind() == reflect.Uint64 { | ||||
| 				return nil, coderFixed64Ptr | ||||
| 			} | ||||
| 		case pref.DoubleKind: | ||||
| 			if ft.Kind() == reflect.Float64 { | ||||
| 				return nil, coderDoublePtr | ||||
| 			} | ||||
| 		case pref.StringKind: | ||||
| 			if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { | ||||
| 				return nil, coderStringPtrValidateUTF8 | ||||
| 			} | ||||
| 			if ft.Kind() == reflect.String { | ||||
| 				return nil, coderStringPtr | ||||
| 			} | ||||
| 		case pref.BytesKind: | ||||
| 			if ft.Kind() == reflect.String { | ||||
| 				return nil, coderStringPtr | ||||
| 			} | ||||
| 		} | ||||
| 	default: | ||||
| 		switch fd.Kind() { | ||||
| 		case pref.BoolKind: | ||||
| 			if ft.Kind() == reflect.Bool { | ||||
| 				return nil, coderBool | ||||
| 			} | ||||
| 		case pref.EnumKind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderEnum | ||||
| 			} | ||||
| 		case pref.Int32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderInt32 | ||||
| 			} | ||||
| 		case pref.Sint32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderSint32 | ||||
| 			} | ||||
| 		case pref.Uint32Kind: | ||||
| 			if ft.Kind() == reflect.Uint32 { | ||||
| 				return nil, coderUint32 | ||||
| 			} | ||||
| 		case pref.Int64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderInt64 | ||||
| 			} | ||||
| 		case pref.Sint64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderSint64 | ||||
| 			} | ||||
| 		case pref.Uint64Kind: | ||||
| 			if ft.Kind() == reflect.Uint64 { | ||||
| 				return nil, coderUint64 | ||||
| 			} | ||||
| 		case pref.Sfixed32Kind: | ||||
| 			if ft.Kind() == reflect.Int32 { | ||||
| 				return nil, coderSfixed32 | ||||
| 			} | ||||
| 		case pref.Fixed32Kind: | ||||
| 			if ft.Kind() == reflect.Uint32 { | ||||
| 				return nil, coderFixed32 | ||||
| 			} | ||||
| 		case pref.FloatKind: | ||||
| 			if ft.Kind() == reflect.Float32 { | ||||
| 				return nil, coderFloat | ||||
| 			} | ||||
| 		case pref.Sfixed64Kind: | ||||
| 			if ft.Kind() == reflect.Int64 { | ||||
| 				return nil, coderSfixed64 | ||||
| 			} | ||||
| 		case pref.Fixed64Kind: | ||||
| 			if ft.Kind() == reflect.Uint64 { | ||||
| 				return nil, coderFixed64 | ||||
| 			} | ||||
| 		case pref.DoubleKind: | ||||
| 			if ft.Kind() == reflect.Float64 { | ||||
| 				return nil, coderDouble | ||||
| 			} | ||||
| 		case pref.StringKind: | ||||
| 			if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) { | ||||
| 				return nil, coderStringValidateUTF8 | ||||
| 			} | ||||
| 			if ft.Kind() == reflect.String { | ||||
| 				return nil, coderString | ||||
| 			} | ||||
| 			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) { | ||||
| 				return nil, coderBytesValidateUTF8 | ||||
| 			} | ||||
| 			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { | ||||
| 				return nil, coderBytes | ||||
| 			} | ||||
| 		case pref.BytesKind: | ||||
| 			if ft.Kind() == reflect.String { | ||||
| 				return nil, coderString | ||||
| 			} | ||||
| 			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 { | ||||
| 				return nil, coderBytes | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("invalid type: no encoder for %v %v %v/%v", fd.FullName(), fd.Cardinality(), fd.Kind(), ft)) | ||||
| } | ||||
|  | ||||
| // encoderFuncsForValue returns value functions for a field, used for | ||||
| // extension values and map encoding. | ||||
| func encoderFuncsForValue(fd pref.FieldDescriptor) valueCoderFuncs { | ||||
| 	switch { | ||||
| 	case fd.Cardinality() == pref.Repeated && !fd.IsPacked(): | ||||
| 		switch fd.Kind() { | ||||
| 		case pref.BoolKind: | ||||
| 			return coderBoolSliceValue | ||||
| 		case pref.EnumKind: | ||||
| 			return coderEnumSliceValue | ||||
| 		case pref.Int32Kind: | ||||
| 			return coderInt32SliceValue | ||||
| 		case pref.Sint32Kind: | ||||
| 			return coderSint32SliceValue | ||||
| 		case pref.Uint32Kind: | ||||
| 			return coderUint32SliceValue | ||||
| 		case pref.Int64Kind: | ||||
| 			return coderInt64SliceValue | ||||
| 		case pref.Sint64Kind: | ||||
| 			return coderSint64SliceValue | ||||
| 		case pref.Uint64Kind: | ||||
| 			return coderUint64SliceValue | ||||
| 		case pref.Sfixed32Kind: | ||||
| 			return coderSfixed32SliceValue | ||||
| 		case pref.Fixed32Kind: | ||||
| 			return coderFixed32SliceValue | ||||
| 		case pref.FloatKind: | ||||
| 			return coderFloatSliceValue | ||||
| 		case pref.Sfixed64Kind: | ||||
| 			return coderSfixed64SliceValue | ||||
| 		case pref.Fixed64Kind: | ||||
| 			return coderFixed64SliceValue | ||||
| 		case pref.DoubleKind: | ||||
| 			return coderDoubleSliceValue | ||||
| 		case pref.StringKind: | ||||
| 			// We don't have a UTF-8 validating coder for repeated string fields. | ||||
| 			// Value coders are used for extensions and maps. | ||||
| 			// Extensions are never proto3, and maps never contain lists. | ||||
| 			return coderStringSliceValue | ||||
| 		case pref.BytesKind: | ||||
| 			return coderBytesSliceValue | ||||
| 		case pref.MessageKind: | ||||
| 			return coderMessageSliceValue | ||||
| 		case pref.GroupKind: | ||||
| 			return coderGroupSliceValue | ||||
| 		} | ||||
| 	case fd.Cardinality() == pref.Repeated && fd.IsPacked(): | ||||
| 		switch fd.Kind() { | ||||
| 		case pref.BoolKind: | ||||
| 			return coderBoolPackedSliceValue | ||||
| 		case pref.EnumKind: | ||||
| 			return coderEnumPackedSliceValue | ||||
| 		case pref.Int32Kind: | ||||
| 			return coderInt32PackedSliceValue | ||||
| 		case pref.Sint32Kind: | ||||
| 			return coderSint32PackedSliceValue | ||||
| 		case pref.Uint32Kind: | ||||
| 			return coderUint32PackedSliceValue | ||||
| 		case pref.Int64Kind: | ||||
| 			return coderInt64PackedSliceValue | ||||
| 		case pref.Sint64Kind: | ||||
| 			return coderSint64PackedSliceValue | ||||
| 		case pref.Uint64Kind: | ||||
| 			return coderUint64PackedSliceValue | ||||
| 		case pref.Sfixed32Kind: | ||||
| 			return coderSfixed32PackedSliceValue | ||||
| 		case pref.Fixed32Kind: | ||||
| 			return coderFixed32PackedSliceValue | ||||
| 		case pref.FloatKind: | ||||
| 			return coderFloatPackedSliceValue | ||||
| 		case pref.Sfixed64Kind: | ||||
| 			return coderSfixed64PackedSliceValue | ||||
| 		case pref.Fixed64Kind: | ||||
| 			return coderFixed64PackedSliceValue | ||||
| 		case pref.DoubleKind: | ||||
| 			return coderDoublePackedSliceValue | ||||
| 		} | ||||
| 	default: | ||||
| 		switch fd.Kind() { | ||||
| 		default: | ||||
| 		case pref.BoolKind: | ||||
| 			return coderBoolValue | ||||
| 		case pref.EnumKind: | ||||
| 			return coderEnumValue | ||||
| 		case pref.Int32Kind: | ||||
| 			return coderInt32Value | ||||
| 		case pref.Sint32Kind: | ||||
| 			return coderSint32Value | ||||
| 		case pref.Uint32Kind: | ||||
| 			return coderUint32Value | ||||
| 		case pref.Int64Kind: | ||||
| 			return coderInt64Value | ||||
| 		case pref.Sint64Kind: | ||||
| 			return coderSint64Value | ||||
| 		case pref.Uint64Kind: | ||||
| 			return coderUint64Value | ||||
| 		case pref.Sfixed32Kind: | ||||
| 			return coderSfixed32Value | ||||
| 		case pref.Fixed32Kind: | ||||
| 			return coderFixed32Value | ||||
| 		case pref.FloatKind: | ||||
| 			return coderFloatValue | ||||
| 		case pref.Sfixed64Kind: | ||||
| 			return coderSfixed64Value | ||||
| 		case pref.Fixed64Kind: | ||||
| 			return coderFixed64Value | ||||
| 		case pref.DoubleKind: | ||||
| 			return coderDoubleValue | ||||
| 		case pref.StringKind: | ||||
| 			if strs.EnforceUTF8(fd) { | ||||
| 				return coderStringValueValidateUTF8 | ||||
| 			} | ||||
| 			return coderStringValue | ||||
| 		case pref.BytesKind: | ||||
| 			return coderBytesValue | ||||
| 		case pref.MessageKind: | ||||
| 			return coderMessageValue | ||||
| 		case pref.GroupKind: | ||||
| 			return coderGroupValue | ||||
| 		} | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("invalid field: no encoder for %v %v %v", fd.FullName(), fd.Cardinality(), fd.Kind())) | ||||
| } | ||||
							
								
								
									
										18
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| // 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. | ||||
|  | ||||
| //go:build !purego && !appengine | ||||
| // +build !purego,!appengine | ||||
|  | ||||
| package impl | ||||
|  | ||||
| // When using unsafe pointers, we can just treat enum values as int32s. | ||||
|  | ||||
| var ( | ||||
| 	coderEnumNoZero      = coderInt32NoZero | ||||
| 	coderEnum            = coderInt32 | ||||
| 	coderEnumPtr         = coderInt32Ptr | ||||
| 	coderEnumSlice       = coderInt32Slice | ||||
| 	coderEnumPackedSlice = coderInt32PackedSlice | ||||
| ) | ||||
							
								
								
									
										496
									
								
								vendor/google.golang.org/protobuf/internal/impl/convert.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										496
									
								
								vendor/google.golang.org/protobuf/internal/impl/convert.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,496 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
|  | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| // unwrapper unwraps the value to the underlying value. | ||||
| // This is implemented by List and Map. | ||||
| type unwrapper interface { | ||||
| 	protoUnwrap() interface{} | ||||
| } | ||||
|  | ||||
| // A Converter coverts to/from Go reflect.Value types and protobuf protoreflect.Value types. | ||||
| type Converter interface { | ||||
| 	// PBValueOf converts a reflect.Value to a protoreflect.Value. | ||||
| 	PBValueOf(reflect.Value) pref.Value | ||||
|  | ||||
| 	// GoValueOf converts a protoreflect.Value to a reflect.Value. | ||||
| 	GoValueOf(pref.Value) reflect.Value | ||||
|  | ||||
| 	// IsValidPB returns whether a protoreflect.Value is compatible with this type. | ||||
| 	IsValidPB(pref.Value) bool | ||||
|  | ||||
| 	// IsValidGo returns whether a reflect.Value is compatible with this type. | ||||
| 	IsValidGo(reflect.Value) bool | ||||
|  | ||||
| 	// New returns a new field value. | ||||
| 	// For scalars, it returns the default value of the field. | ||||
| 	// For composite types, it returns a new mutable value. | ||||
| 	New() pref.Value | ||||
|  | ||||
| 	// Zero returns a new field value. | ||||
| 	// For scalars, it returns the default value of the field. | ||||
| 	// For composite types, it returns an immutable, empty value. | ||||
| 	Zero() pref.Value | ||||
| } | ||||
|  | ||||
| // NewConverter matches a Go type with a protobuf field and returns a Converter | ||||
| // that converts between the two. Enums must be a named int32 kind that | ||||
| // implements protoreflect.Enum, and messages must be pointer to a named | ||||
| // struct type that implements protoreflect.ProtoMessage. | ||||
| // | ||||
| // This matcher deliberately supports a wider range of Go types than what | ||||
| // protoc-gen-go historically generated to be able to automatically wrap some | ||||
| // v1 messages generated by other forks of protoc-gen-go. | ||||
| func NewConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { | ||||
| 	switch { | ||||
| 	case fd.IsList(): | ||||
| 		return newListConverter(t, fd) | ||||
| 	case fd.IsMap(): | ||||
| 		return newMapConverter(t, fd) | ||||
| 	default: | ||||
| 		return newSingularConverter(t, fd) | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName())) | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	boolType    = reflect.TypeOf(bool(false)) | ||||
| 	int32Type   = reflect.TypeOf(int32(0)) | ||||
| 	int64Type   = reflect.TypeOf(int64(0)) | ||||
| 	uint32Type  = reflect.TypeOf(uint32(0)) | ||||
| 	uint64Type  = reflect.TypeOf(uint64(0)) | ||||
| 	float32Type = reflect.TypeOf(float32(0)) | ||||
| 	float64Type = reflect.TypeOf(float64(0)) | ||||
| 	stringType  = reflect.TypeOf(string("")) | ||||
| 	bytesType   = reflect.TypeOf([]byte(nil)) | ||||
| 	byteType    = reflect.TypeOf(byte(0)) | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	boolZero    = pref.ValueOfBool(false) | ||||
| 	int32Zero   = pref.ValueOfInt32(0) | ||||
| 	int64Zero   = pref.ValueOfInt64(0) | ||||
| 	uint32Zero  = pref.ValueOfUint32(0) | ||||
| 	uint64Zero  = pref.ValueOfUint64(0) | ||||
| 	float32Zero = pref.ValueOfFloat32(0) | ||||
| 	float64Zero = pref.ValueOfFloat64(0) | ||||
| 	stringZero  = pref.ValueOfString("") | ||||
| 	bytesZero   = pref.ValueOfBytes(nil) | ||||
| ) | ||||
|  | ||||
| func newSingularConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { | ||||
| 	defVal := func(fd pref.FieldDescriptor, zero pref.Value) pref.Value { | ||||
| 		if fd.Cardinality() == pref.Repeated { | ||||
| 			// Default isn't defined for repeated fields. | ||||
| 			return zero | ||||
| 		} | ||||
| 		return fd.Default() | ||||
| 	} | ||||
| 	switch fd.Kind() { | ||||
| 	case pref.BoolKind: | ||||
| 		if t.Kind() == reflect.Bool { | ||||
| 			return &boolConverter{t, defVal(fd, boolZero)} | ||||
| 		} | ||||
| 	case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind: | ||||
| 		if t.Kind() == reflect.Int32 { | ||||
| 			return &int32Converter{t, defVal(fd, int32Zero)} | ||||
| 		} | ||||
| 	case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind: | ||||
| 		if t.Kind() == reflect.Int64 { | ||||
| 			return &int64Converter{t, defVal(fd, int64Zero)} | ||||
| 		} | ||||
| 	case pref.Uint32Kind, pref.Fixed32Kind: | ||||
| 		if t.Kind() == reflect.Uint32 { | ||||
| 			return &uint32Converter{t, defVal(fd, uint32Zero)} | ||||
| 		} | ||||
| 	case pref.Uint64Kind, pref.Fixed64Kind: | ||||
| 		if t.Kind() == reflect.Uint64 { | ||||
| 			return &uint64Converter{t, defVal(fd, uint64Zero)} | ||||
| 		} | ||||
| 	case pref.FloatKind: | ||||
| 		if t.Kind() == reflect.Float32 { | ||||
| 			return &float32Converter{t, defVal(fd, float32Zero)} | ||||
| 		} | ||||
| 	case pref.DoubleKind: | ||||
| 		if t.Kind() == reflect.Float64 { | ||||
| 			return &float64Converter{t, defVal(fd, float64Zero)} | ||||
| 		} | ||||
| 	case pref.StringKind: | ||||
| 		if t.Kind() == reflect.String || (t.Kind() == reflect.Slice && t.Elem() == byteType) { | ||||
| 			return &stringConverter{t, defVal(fd, stringZero)} | ||||
| 		} | ||||
| 	case pref.BytesKind: | ||||
| 		if t.Kind() == reflect.String || (t.Kind() == reflect.Slice && t.Elem() == byteType) { | ||||
| 			return &bytesConverter{t, defVal(fd, bytesZero)} | ||||
| 		} | ||||
| 	case pref.EnumKind: | ||||
| 		// Handle enums, which must be a named int32 type. | ||||
| 		if t.Kind() == reflect.Int32 { | ||||
| 			return newEnumConverter(t, fd) | ||||
| 		} | ||||
| 	case pref.MessageKind, pref.GroupKind: | ||||
| 		return newMessageConverter(t) | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName())) | ||||
| } | ||||
|  | ||||
| type boolConverter struct { | ||||
| 	goType reflect.Type | ||||
| 	def    pref.Value | ||||
| } | ||||
|  | ||||
| func (c *boolConverter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	return pref.ValueOfBool(v.Bool()) | ||||
| } | ||||
| func (c *boolConverter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	return reflect.ValueOf(v.Bool()).Convert(c.goType) | ||||
| } | ||||
| func (c *boolConverter) IsValidPB(v pref.Value) bool { | ||||
| 	_, ok := v.Interface().(bool) | ||||
| 	return ok | ||||
| } | ||||
| func (c *boolConverter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
| func (c *boolConverter) New() pref.Value  { return c.def } | ||||
| func (c *boolConverter) Zero() pref.Value { return c.def } | ||||
|  | ||||
| type int32Converter struct { | ||||
| 	goType reflect.Type | ||||
| 	def    pref.Value | ||||
| } | ||||
|  | ||||
| func (c *int32Converter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	return pref.ValueOfInt32(int32(v.Int())) | ||||
| } | ||||
| func (c *int32Converter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	return reflect.ValueOf(int32(v.Int())).Convert(c.goType) | ||||
| } | ||||
| func (c *int32Converter) IsValidPB(v pref.Value) bool { | ||||
| 	_, ok := v.Interface().(int32) | ||||
| 	return ok | ||||
| } | ||||
| func (c *int32Converter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
| func (c *int32Converter) New() pref.Value  { return c.def } | ||||
| func (c *int32Converter) Zero() pref.Value { return c.def } | ||||
|  | ||||
| type int64Converter struct { | ||||
| 	goType reflect.Type | ||||
| 	def    pref.Value | ||||
| } | ||||
|  | ||||
| func (c *int64Converter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	return pref.ValueOfInt64(int64(v.Int())) | ||||
| } | ||||
| func (c *int64Converter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	return reflect.ValueOf(int64(v.Int())).Convert(c.goType) | ||||
| } | ||||
| func (c *int64Converter) IsValidPB(v pref.Value) bool { | ||||
| 	_, ok := v.Interface().(int64) | ||||
| 	return ok | ||||
| } | ||||
| func (c *int64Converter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
| func (c *int64Converter) New() pref.Value  { return c.def } | ||||
| func (c *int64Converter) Zero() pref.Value { return c.def } | ||||
|  | ||||
| type uint32Converter struct { | ||||
| 	goType reflect.Type | ||||
| 	def    pref.Value | ||||
| } | ||||
|  | ||||
| func (c *uint32Converter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	return pref.ValueOfUint32(uint32(v.Uint())) | ||||
| } | ||||
| func (c *uint32Converter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	return reflect.ValueOf(uint32(v.Uint())).Convert(c.goType) | ||||
| } | ||||
| func (c *uint32Converter) IsValidPB(v pref.Value) bool { | ||||
| 	_, ok := v.Interface().(uint32) | ||||
| 	return ok | ||||
| } | ||||
| func (c *uint32Converter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
| func (c *uint32Converter) New() pref.Value  { return c.def } | ||||
| func (c *uint32Converter) Zero() pref.Value { return c.def } | ||||
|  | ||||
| type uint64Converter struct { | ||||
| 	goType reflect.Type | ||||
| 	def    pref.Value | ||||
| } | ||||
|  | ||||
| func (c *uint64Converter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	return pref.ValueOfUint64(uint64(v.Uint())) | ||||
| } | ||||
| func (c *uint64Converter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	return reflect.ValueOf(uint64(v.Uint())).Convert(c.goType) | ||||
| } | ||||
| func (c *uint64Converter) IsValidPB(v pref.Value) bool { | ||||
| 	_, ok := v.Interface().(uint64) | ||||
| 	return ok | ||||
| } | ||||
| func (c *uint64Converter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
| func (c *uint64Converter) New() pref.Value  { return c.def } | ||||
| func (c *uint64Converter) Zero() pref.Value { return c.def } | ||||
|  | ||||
| type float32Converter struct { | ||||
| 	goType reflect.Type | ||||
| 	def    pref.Value | ||||
| } | ||||
|  | ||||
| func (c *float32Converter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	return pref.ValueOfFloat32(float32(v.Float())) | ||||
| } | ||||
| func (c *float32Converter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	return reflect.ValueOf(float32(v.Float())).Convert(c.goType) | ||||
| } | ||||
| func (c *float32Converter) IsValidPB(v pref.Value) bool { | ||||
| 	_, ok := v.Interface().(float32) | ||||
| 	return ok | ||||
| } | ||||
| func (c *float32Converter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
| func (c *float32Converter) New() pref.Value  { return c.def } | ||||
| func (c *float32Converter) Zero() pref.Value { return c.def } | ||||
|  | ||||
| type float64Converter struct { | ||||
| 	goType reflect.Type | ||||
| 	def    pref.Value | ||||
| } | ||||
|  | ||||
| func (c *float64Converter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	return pref.ValueOfFloat64(float64(v.Float())) | ||||
| } | ||||
| func (c *float64Converter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	return reflect.ValueOf(float64(v.Float())).Convert(c.goType) | ||||
| } | ||||
| func (c *float64Converter) IsValidPB(v pref.Value) bool { | ||||
| 	_, ok := v.Interface().(float64) | ||||
| 	return ok | ||||
| } | ||||
| func (c *float64Converter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
| func (c *float64Converter) New() pref.Value  { return c.def } | ||||
| func (c *float64Converter) Zero() pref.Value { return c.def } | ||||
|  | ||||
| type stringConverter struct { | ||||
| 	goType reflect.Type | ||||
| 	def    pref.Value | ||||
| } | ||||
|  | ||||
| func (c *stringConverter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	return pref.ValueOfString(v.Convert(stringType).String()) | ||||
| } | ||||
| func (c *stringConverter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	// pref.Value.String never panics, so we go through an interface | ||||
| 	// conversion here to check the type. | ||||
| 	s := v.Interface().(string) | ||||
| 	if c.goType.Kind() == reflect.Slice && s == "" { | ||||
| 		return reflect.Zero(c.goType) // ensure empty string is []byte(nil) | ||||
| 	} | ||||
| 	return reflect.ValueOf(s).Convert(c.goType) | ||||
| } | ||||
| func (c *stringConverter) IsValidPB(v pref.Value) bool { | ||||
| 	_, ok := v.Interface().(string) | ||||
| 	return ok | ||||
| } | ||||
| func (c *stringConverter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
| func (c *stringConverter) New() pref.Value  { return c.def } | ||||
| func (c *stringConverter) Zero() pref.Value { return c.def } | ||||
|  | ||||
| type bytesConverter struct { | ||||
| 	goType reflect.Type | ||||
| 	def    pref.Value | ||||
| } | ||||
|  | ||||
| func (c *bytesConverter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	if c.goType.Kind() == reflect.String && v.Len() == 0 { | ||||
| 		return pref.ValueOfBytes(nil) // ensure empty string is []byte(nil) | ||||
| 	} | ||||
| 	return pref.ValueOfBytes(v.Convert(bytesType).Bytes()) | ||||
| } | ||||
| func (c *bytesConverter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	return reflect.ValueOf(v.Bytes()).Convert(c.goType) | ||||
| } | ||||
| func (c *bytesConverter) IsValidPB(v pref.Value) bool { | ||||
| 	_, ok := v.Interface().([]byte) | ||||
| 	return ok | ||||
| } | ||||
| func (c *bytesConverter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
| func (c *bytesConverter) New() pref.Value  { return c.def } | ||||
| func (c *bytesConverter) Zero() pref.Value { return c.def } | ||||
|  | ||||
| type enumConverter struct { | ||||
| 	goType reflect.Type | ||||
| 	def    pref.Value | ||||
| } | ||||
|  | ||||
| func newEnumConverter(goType reflect.Type, fd pref.FieldDescriptor) Converter { | ||||
| 	var def pref.Value | ||||
| 	if fd.Cardinality() == pref.Repeated { | ||||
| 		def = pref.ValueOfEnum(fd.Enum().Values().Get(0).Number()) | ||||
| 	} else { | ||||
| 		def = fd.Default() | ||||
| 	} | ||||
| 	return &enumConverter{goType, def} | ||||
| } | ||||
|  | ||||
| func (c *enumConverter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	return pref.ValueOfEnum(pref.EnumNumber(v.Int())) | ||||
| } | ||||
|  | ||||
| func (c *enumConverter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	return reflect.ValueOf(v.Enum()).Convert(c.goType) | ||||
| } | ||||
|  | ||||
| func (c *enumConverter) IsValidPB(v pref.Value) bool { | ||||
| 	_, ok := v.Interface().(pref.EnumNumber) | ||||
| 	return ok | ||||
| } | ||||
|  | ||||
| func (c *enumConverter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
|  | ||||
| func (c *enumConverter) New() pref.Value { | ||||
| 	return c.def | ||||
| } | ||||
|  | ||||
| func (c *enumConverter) Zero() pref.Value { | ||||
| 	return c.def | ||||
| } | ||||
|  | ||||
| type messageConverter struct { | ||||
| 	goType reflect.Type | ||||
| } | ||||
|  | ||||
| func newMessageConverter(goType reflect.Type) Converter { | ||||
| 	return &messageConverter{goType} | ||||
| } | ||||
|  | ||||
| func (c *messageConverter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	if c.isNonPointer() { | ||||
| 		if v.CanAddr() { | ||||
| 			v = v.Addr() // T => *T | ||||
| 		} else { | ||||
| 			v = reflect.Zero(reflect.PtrTo(v.Type())) | ||||
| 		} | ||||
| 	} | ||||
| 	if m, ok := v.Interface().(pref.ProtoMessage); ok { | ||||
| 		return pref.ValueOfMessage(m.ProtoReflect()) | ||||
| 	} | ||||
| 	return pref.ValueOfMessage(legacyWrapMessage(v)) | ||||
| } | ||||
|  | ||||
| func (c *messageConverter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	m := v.Message() | ||||
| 	var rv reflect.Value | ||||
| 	if u, ok := m.(unwrapper); ok { | ||||
| 		rv = reflect.ValueOf(u.protoUnwrap()) | ||||
| 	} else { | ||||
| 		rv = reflect.ValueOf(m.Interface()) | ||||
| 	} | ||||
| 	if c.isNonPointer() { | ||||
| 		if rv.Type() != reflect.PtrTo(c.goType) { | ||||
| 			panic(fmt.Sprintf("invalid type: got %v, want %v", rv.Type(), reflect.PtrTo(c.goType))) | ||||
| 		} | ||||
| 		if !rv.IsNil() { | ||||
| 			rv = rv.Elem() // *T => T | ||||
| 		} else { | ||||
| 			rv = reflect.Zero(rv.Type().Elem()) | ||||
| 		} | ||||
| 	} | ||||
| 	if rv.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", rv.Type(), c.goType)) | ||||
| 	} | ||||
| 	return rv | ||||
| } | ||||
|  | ||||
| func (c *messageConverter) IsValidPB(v pref.Value) bool { | ||||
| 	m := v.Message() | ||||
| 	var rv reflect.Value | ||||
| 	if u, ok := m.(unwrapper); ok { | ||||
| 		rv = reflect.ValueOf(u.protoUnwrap()) | ||||
| 	} else { | ||||
| 		rv = reflect.ValueOf(m.Interface()) | ||||
| 	} | ||||
| 	if c.isNonPointer() { | ||||
| 		return rv.Type() == reflect.PtrTo(c.goType) | ||||
| 	} | ||||
| 	return rv.Type() == c.goType | ||||
| } | ||||
|  | ||||
| func (c *messageConverter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
|  | ||||
| func (c *messageConverter) New() pref.Value { | ||||
| 	if c.isNonPointer() { | ||||
| 		return c.PBValueOf(reflect.New(c.goType).Elem()) | ||||
| 	} | ||||
| 	return c.PBValueOf(reflect.New(c.goType.Elem())) | ||||
| } | ||||
|  | ||||
| func (c *messageConverter) Zero() pref.Value { | ||||
| 	return c.PBValueOf(reflect.Zero(c.goType)) | ||||
| } | ||||
|  | ||||
| // isNonPointer reports whether the type is a non-pointer type. | ||||
| // This never occurs for generated message types. | ||||
| func (c *messageConverter) isNonPointer() bool { | ||||
| 	return c.goType.Kind() != reflect.Ptr | ||||
| } | ||||
							
								
								
									
										141
									
								
								vendor/google.golang.org/protobuf/internal/impl/convert_list.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								vendor/google.golang.org/protobuf/internal/impl/convert_list.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,141 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
|  | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| func newListConverter(t reflect.Type, fd pref.FieldDescriptor) Converter { | ||||
| 	switch { | ||||
| 	case t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Slice: | ||||
| 		return &listPtrConverter{t, newSingularConverter(t.Elem().Elem(), fd)} | ||||
| 	case t.Kind() == reflect.Slice: | ||||
| 		return &listConverter{t, newSingularConverter(t.Elem(), fd)} | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName())) | ||||
| } | ||||
|  | ||||
| type listConverter struct { | ||||
| 	goType reflect.Type // []T | ||||
| 	c      Converter | ||||
| } | ||||
|  | ||||
| func (c *listConverter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	pv := reflect.New(c.goType) | ||||
| 	pv.Elem().Set(v) | ||||
| 	return pref.ValueOfList(&listReflect{pv, c.c}) | ||||
| } | ||||
|  | ||||
| func (c *listConverter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	rv := v.List().(*listReflect).v | ||||
| 	if rv.IsNil() { | ||||
| 		return reflect.Zero(c.goType) | ||||
| 	} | ||||
| 	return rv.Elem() | ||||
| } | ||||
|  | ||||
| func (c *listConverter) IsValidPB(v pref.Value) bool { | ||||
| 	list, ok := v.Interface().(*listReflect) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	return list.v.Type().Elem() == c.goType | ||||
| } | ||||
|  | ||||
| func (c *listConverter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
|  | ||||
| func (c *listConverter) New() pref.Value { | ||||
| 	return pref.ValueOfList(&listReflect{reflect.New(c.goType), c.c}) | ||||
| } | ||||
|  | ||||
| func (c *listConverter) Zero() pref.Value { | ||||
| 	return pref.ValueOfList(&listReflect{reflect.Zero(reflect.PtrTo(c.goType)), c.c}) | ||||
| } | ||||
|  | ||||
| type listPtrConverter struct { | ||||
| 	goType reflect.Type // *[]T | ||||
| 	c      Converter | ||||
| } | ||||
|  | ||||
| func (c *listPtrConverter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	return pref.ValueOfList(&listReflect{v, c.c}) | ||||
| } | ||||
|  | ||||
| func (c *listPtrConverter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	return v.List().(*listReflect).v | ||||
| } | ||||
|  | ||||
| func (c *listPtrConverter) IsValidPB(v pref.Value) bool { | ||||
| 	list, ok := v.Interface().(*listReflect) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	return list.v.Type() == c.goType | ||||
| } | ||||
|  | ||||
| func (c *listPtrConverter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
|  | ||||
| func (c *listPtrConverter) New() pref.Value { | ||||
| 	return c.PBValueOf(reflect.New(c.goType.Elem())) | ||||
| } | ||||
|  | ||||
| func (c *listPtrConverter) Zero() pref.Value { | ||||
| 	return c.PBValueOf(reflect.Zero(c.goType)) | ||||
| } | ||||
|  | ||||
| type listReflect struct { | ||||
| 	v    reflect.Value // *[]T | ||||
| 	conv Converter | ||||
| } | ||||
|  | ||||
| func (ls *listReflect) Len() int { | ||||
| 	if ls.v.IsNil() { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	return ls.v.Elem().Len() | ||||
| } | ||||
| func (ls *listReflect) Get(i int) pref.Value { | ||||
| 	return ls.conv.PBValueOf(ls.v.Elem().Index(i)) | ||||
| } | ||||
| func (ls *listReflect) Set(i int, v pref.Value) { | ||||
| 	ls.v.Elem().Index(i).Set(ls.conv.GoValueOf(v)) | ||||
| } | ||||
| func (ls *listReflect) Append(v pref.Value) { | ||||
| 	ls.v.Elem().Set(reflect.Append(ls.v.Elem(), ls.conv.GoValueOf(v))) | ||||
| } | ||||
| func (ls *listReflect) AppendMutable() pref.Value { | ||||
| 	if _, ok := ls.conv.(*messageConverter); !ok { | ||||
| 		panic("invalid AppendMutable on list with non-message type") | ||||
| 	} | ||||
| 	v := ls.NewElement() | ||||
| 	ls.Append(v) | ||||
| 	return v | ||||
| } | ||||
| func (ls *listReflect) Truncate(i int) { | ||||
| 	ls.v.Elem().Set(ls.v.Elem().Slice(0, i)) | ||||
| } | ||||
| func (ls *listReflect) NewElement() pref.Value { | ||||
| 	return ls.conv.New() | ||||
| } | ||||
| func (ls *listReflect) IsValid() bool { | ||||
| 	return !ls.v.IsNil() | ||||
| } | ||||
| func (ls *listReflect) protoUnwrap() interface{} { | ||||
| 	return ls.v.Interface() | ||||
| } | ||||
							
								
								
									
										121
									
								
								vendor/google.golang.org/protobuf/internal/impl/convert_map.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								vendor/google.golang.org/protobuf/internal/impl/convert_map.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
|  | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| type mapConverter struct { | ||||
| 	goType           reflect.Type // map[K]V | ||||
| 	keyConv, valConv Converter | ||||
| } | ||||
|  | ||||
| func newMapConverter(t reflect.Type, fd pref.FieldDescriptor) *mapConverter { | ||||
| 	if t.Kind() != reflect.Map { | ||||
| 		panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName())) | ||||
| 	} | ||||
| 	return &mapConverter{ | ||||
| 		goType:  t, | ||||
| 		keyConv: newSingularConverter(t.Key(), fd.MapKey()), | ||||
| 		valConv: newSingularConverter(t.Elem(), fd.MapValue()), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *mapConverter) PBValueOf(v reflect.Value) pref.Value { | ||||
| 	if v.Type() != c.goType { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType)) | ||||
| 	} | ||||
| 	return pref.ValueOfMap(&mapReflect{v, c.keyConv, c.valConv}) | ||||
| } | ||||
|  | ||||
| func (c *mapConverter) GoValueOf(v pref.Value) reflect.Value { | ||||
| 	return v.Map().(*mapReflect).v | ||||
| } | ||||
|  | ||||
| func (c *mapConverter) IsValidPB(v pref.Value) bool { | ||||
| 	mapv, ok := v.Interface().(*mapReflect) | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	return mapv.v.Type() == c.goType | ||||
| } | ||||
|  | ||||
| func (c *mapConverter) IsValidGo(v reflect.Value) bool { | ||||
| 	return v.IsValid() && v.Type() == c.goType | ||||
| } | ||||
|  | ||||
| func (c *mapConverter) New() pref.Value { | ||||
| 	return c.PBValueOf(reflect.MakeMap(c.goType)) | ||||
| } | ||||
|  | ||||
| func (c *mapConverter) Zero() pref.Value { | ||||
| 	return c.PBValueOf(reflect.Zero(c.goType)) | ||||
| } | ||||
|  | ||||
| type mapReflect struct { | ||||
| 	v       reflect.Value // map[K]V | ||||
| 	keyConv Converter | ||||
| 	valConv Converter | ||||
| } | ||||
|  | ||||
| func (ms *mapReflect) Len() int { | ||||
| 	return ms.v.Len() | ||||
| } | ||||
| func (ms *mapReflect) Has(k pref.MapKey) bool { | ||||
| 	rk := ms.keyConv.GoValueOf(k.Value()) | ||||
| 	rv := ms.v.MapIndex(rk) | ||||
| 	return rv.IsValid() | ||||
| } | ||||
| func (ms *mapReflect) Get(k pref.MapKey) pref.Value { | ||||
| 	rk := ms.keyConv.GoValueOf(k.Value()) | ||||
| 	rv := ms.v.MapIndex(rk) | ||||
| 	if !rv.IsValid() { | ||||
| 		return pref.Value{} | ||||
| 	} | ||||
| 	return ms.valConv.PBValueOf(rv) | ||||
| } | ||||
| func (ms *mapReflect) Set(k pref.MapKey, v pref.Value) { | ||||
| 	rk := ms.keyConv.GoValueOf(k.Value()) | ||||
| 	rv := ms.valConv.GoValueOf(v) | ||||
| 	ms.v.SetMapIndex(rk, rv) | ||||
| } | ||||
| func (ms *mapReflect) Clear(k pref.MapKey) { | ||||
| 	rk := ms.keyConv.GoValueOf(k.Value()) | ||||
| 	ms.v.SetMapIndex(rk, reflect.Value{}) | ||||
| } | ||||
| func (ms *mapReflect) Mutable(k pref.MapKey) pref.Value { | ||||
| 	if _, ok := ms.valConv.(*messageConverter); !ok { | ||||
| 		panic("invalid Mutable on map with non-message value type") | ||||
| 	} | ||||
| 	v := ms.Get(k) | ||||
| 	if !v.IsValid() { | ||||
| 		v = ms.NewValue() | ||||
| 		ms.Set(k, v) | ||||
| 	} | ||||
| 	return v | ||||
| } | ||||
| func (ms *mapReflect) Range(f func(pref.MapKey, pref.Value) bool) { | ||||
| 	iter := mapRange(ms.v) | ||||
| 	for iter.Next() { | ||||
| 		k := ms.keyConv.PBValueOf(iter.Key()).MapKey() | ||||
| 		v := ms.valConv.PBValueOf(iter.Value()) | ||||
| 		if !f(k, v) { | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| func (ms *mapReflect) NewValue() pref.Value { | ||||
| 	return ms.valConv.New() | ||||
| } | ||||
| func (ms *mapReflect) IsValid() bool { | ||||
| 	return !ms.v.IsNil() | ||||
| } | ||||
| func (ms *mapReflect) protoUnwrap() interface{} { | ||||
| 	return ms.v.Interface() | ||||
| } | ||||
							
								
								
									
										284
									
								
								vendor/google.golang.org/protobuf/internal/impl/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										284
									
								
								vendor/google.golang.org/protobuf/internal/impl/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,284 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"math/bits" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	"google.golang.org/protobuf/internal/flags" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	preg "google.golang.org/protobuf/reflect/protoregistry" | ||||
| 	"google.golang.org/protobuf/runtime/protoiface" | ||||
| 	piface "google.golang.org/protobuf/runtime/protoiface" | ||||
| ) | ||||
|  | ||||
| var errDecode = errors.New("cannot parse invalid wire-format data") | ||||
| var errRecursionDepth = errors.New("exceeded maximum recursion depth") | ||||
|  | ||||
| type unmarshalOptions struct { | ||||
| 	flags    protoiface.UnmarshalInputFlags | ||||
| 	resolver interface { | ||||
| 		FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) | ||||
| 		FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) | ||||
| 	} | ||||
| 	depth int | ||||
| } | ||||
|  | ||||
| func (o unmarshalOptions) Options() proto.UnmarshalOptions { | ||||
| 	return proto.UnmarshalOptions{ | ||||
| 		Merge:          true, | ||||
| 		AllowPartial:   true, | ||||
| 		DiscardUnknown: o.DiscardUnknown(), | ||||
| 		Resolver:       o.resolver, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (o unmarshalOptions) DiscardUnknown() bool { return o.flags&piface.UnmarshalDiscardUnknown != 0 } | ||||
|  | ||||
| func (o unmarshalOptions) IsDefault() bool { | ||||
| 	return o.flags == 0 && o.resolver == preg.GlobalTypes | ||||
| } | ||||
|  | ||||
| var lazyUnmarshalOptions = unmarshalOptions{ | ||||
| 	resolver: preg.GlobalTypes, | ||||
| 	depth:    protowire.DefaultRecursionLimit, | ||||
| } | ||||
|  | ||||
| type unmarshalOutput struct { | ||||
| 	n           int // number of bytes consumed | ||||
| 	initialized bool | ||||
| } | ||||
|  | ||||
| // unmarshal is protoreflect.Methods.Unmarshal. | ||||
| func (mi *MessageInfo) unmarshal(in piface.UnmarshalInput) (piface.UnmarshalOutput, error) { | ||||
| 	var p pointer | ||||
| 	if ms, ok := in.Message.(*messageState); ok { | ||||
| 		p = ms.pointer() | ||||
| 	} else { | ||||
| 		p = in.Message.(*messageReflectWrapper).pointer() | ||||
| 	} | ||||
| 	out, err := mi.unmarshalPointer(in.Buf, p, 0, unmarshalOptions{ | ||||
| 		flags:    in.Flags, | ||||
| 		resolver: in.Resolver, | ||||
| 		depth:    in.Depth, | ||||
| 	}) | ||||
| 	var flags piface.UnmarshalOutputFlags | ||||
| 	if out.initialized { | ||||
| 		flags |= piface.UnmarshalInitialized | ||||
| 	} | ||||
| 	return piface.UnmarshalOutput{ | ||||
| 		Flags: flags, | ||||
| 	}, err | ||||
| } | ||||
|  | ||||
| // errUnknown is returned during unmarshaling to indicate a parse error that | ||||
| // should result in a field being placed in the unknown fields section (for example, | ||||
| // when the wire type doesn't match) as opposed to the entire unmarshal operation | ||||
| // failing (for example, when a field extends past the available input). | ||||
| // | ||||
| // This is a sentinel error which should never be visible to the user. | ||||
| var errUnknown = errors.New("unknown") | ||||
|  | ||||
| func (mi *MessageInfo) unmarshalPointer(b []byte, p pointer, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	mi.init() | ||||
| 	opts.depth-- | ||||
| 	if opts.depth < 0 { | ||||
| 		return out, errRecursionDepth | ||||
| 	} | ||||
| 	if flags.ProtoLegacy && mi.isMessageSet { | ||||
| 		return unmarshalMessageSet(mi, b, p, opts) | ||||
| 	} | ||||
| 	initialized := true | ||||
| 	var requiredMask uint64 | ||||
| 	var exts *map[int32]ExtensionField | ||||
| 	start := len(b) | ||||
| 	for len(b) > 0 { | ||||
| 		// Parse the tag (field number and wire type). | ||||
| 		var tag uint64 | ||||
| 		if b[0] < 0x80 { | ||||
| 			tag = uint64(b[0]) | ||||
| 			b = b[1:] | ||||
| 		} else if len(b) >= 2 && b[1] < 128 { | ||||
| 			tag = uint64(b[0]&0x7f) + uint64(b[1])<<7 | ||||
| 			b = b[2:] | ||||
| 		} else { | ||||
| 			var n int | ||||
| 			tag, n = protowire.ConsumeVarint(b) | ||||
| 			if n < 0 { | ||||
| 				return out, errDecode | ||||
| 			} | ||||
| 			b = b[n:] | ||||
| 		} | ||||
| 		var num protowire.Number | ||||
| 		if n := tag >> 3; n < uint64(protowire.MinValidNumber) || n > uint64(protowire.MaxValidNumber) { | ||||
| 			return out, errDecode | ||||
| 		} else { | ||||
| 			num = protowire.Number(n) | ||||
| 		} | ||||
| 		wtyp := protowire.Type(tag & 7) | ||||
|  | ||||
| 		if wtyp == protowire.EndGroupType { | ||||
| 			if num != groupTag { | ||||
| 				return out, errDecode | ||||
| 			} | ||||
| 			groupTag = 0 | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| 		var f *coderFieldInfo | ||||
| 		if int(num) < len(mi.denseCoderFields) { | ||||
| 			f = mi.denseCoderFields[num] | ||||
| 		} else { | ||||
| 			f = mi.coderFields[num] | ||||
| 		} | ||||
| 		var n int | ||||
| 		err := errUnknown | ||||
| 		switch { | ||||
| 		case f != nil: | ||||
| 			if f.funcs.unmarshal == nil { | ||||
| 				break | ||||
| 			} | ||||
| 			var o unmarshalOutput | ||||
| 			o, err = f.funcs.unmarshal(b, p.Apply(f.offset), wtyp, f, opts) | ||||
| 			n = o.n | ||||
| 			if err != nil { | ||||
| 				break | ||||
| 			} | ||||
| 			requiredMask |= f.validation.requiredBit | ||||
| 			if f.funcs.isInit != nil && !o.initialized { | ||||
| 				initialized = false | ||||
| 			} | ||||
| 		default: | ||||
| 			// Possible extension. | ||||
| 			if exts == nil && mi.extensionOffset.IsValid() { | ||||
| 				exts = p.Apply(mi.extensionOffset).Extensions() | ||||
| 				if *exts == nil { | ||||
| 					*exts = make(map[int32]ExtensionField) | ||||
| 				} | ||||
| 			} | ||||
| 			if exts == nil { | ||||
| 				break | ||||
| 			} | ||||
| 			var o unmarshalOutput | ||||
| 			o, err = mi.unmarshalExtension(b, num, wtyp, *exts, opts) | ||||
| 			if err != nil { | ||||
| 				break | ||||
| 			} | ||||
| 			n = o.n | ||||
| 			if !o.initialized { | ||||
| 				initialized = false | ||||
| 			} | ||||
| 		} | ||||
| 		if err != nil { | ||||
| 			if err != errUnknown { | ||||
| 				return out, err | ||||
| 			} | ||||
| 			n = protowire.ConsumeFieldValue(num, wtyp, b) | ||||
| 			if n < 0 { | ||||
| 				return out, errDecode | ||||
| 			} | ||||
| 			if !opts.DiscardUnknown() && mi.unknownOffset.IsValid() { | ||||
| 				u := mi.mutableUnknownBytes(p) | ||||
| 				*u = protowire.AppendTag(*u, num, wtyp) | ||||
| 				*u = append(*u, b[:n]...) | ||||
| 			} | ||||
| 		} | ||||
| 		b = b[n:] | ||||
| 	} | ||||
| 	if groupTag != 0 { | ||||
| 		return out, errDecode | ||||
| 	} | ||||
| 	if mi.numRequiredFields > 0 && bits.OnesCount64(requiredMask) != int(mi.numRequiredFields) { | ||||
| 		initialized = false | ||||
| 	} | ||||
| 	if initialized { | ||||
| 		out.initialized = true | ||||
| 	} | ||||
| 	out.n = start - len(b) | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) unmarshalExtension(b []byte, num protowire.Number, wtyp protowire.Type, exts map[int32]ExtensionField, opts unmarshalOptions) (out unmarshalOutput, err error) { | ||||
| 	x := exts[int32(num)] | ||||
| 	xt := x.Type() | ||||
| 	if xt == nil { | ||||
| 		var err error | ||||
| 		xt, err = opts.resolver.FindExtensionByNumber(mi.Desc.FullName(), num) | ||||
| 		if err != nil { | ||||
| 			if err == preg.NotFound { | ||||
| 				return out, errUnknown | ||||
| 			} | ||||
| 			return out, errors.New("%v: unable to resolve extension %v: %v", mi.Desc.FullName(), num, err) | ||||
| 		} | ||||
| 	} | ||||
| 	xi := getExtensionFieldInfo(xt) | ||||
| 	if xi.funcs.unmarshal == nil { | ||||
| 		return out, errUnknown | ||||
| 	} | ||||
| 	if flags.LazyUnmarshalExtensions { | ||||
| 		if opts.IsDefault() && x.canLazy(xt) { | ||||
| 			out, valid := skipExtension(b, xi, num, wtyp, opts) | ||||
| 			switch valid { | ||||
| 			case ValidationValid: | ||||
| 				if out.initialized { | ||||
| 					x.appendLazyBytes(xt, xi, num, wtyp, b[:out.n]) | ||||
| 					exts[int32(num)] = x | ||||
| 					return out, nil | ||||
| 				} | ||||
| 			case ValidationInvalid: | ||||
| 				return out, errDecode | ||||
| 			case ValidationUnknown: | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	ival := x.Value() | ||||
| 	if !ival.IsValid() && xi.unmarshalNeedsValue { | ||||
| 		// Create a new message, list, or map value to fill in. | ||||
| 		// For enums, create a prototype value to let the unmarshal func know the | ||||
| 		// concrete type. | ||||
| 		ival = xt.New() | ||||
| 	} | ||||
| 	v, out, err := xi.funcs.unmarshal(b, ival, num, wtyp, opts) | ||||
| 	if err != nil { | ||||
| 		return out, err | ||||
| 	} | ||||
| 	if xi.funcs.isInit == nil { | ||||
| 		out.initialized = true | ||||
| 	} | ||||
| 	x.Set(xt, v) | ||||
| 	exts[int32(num)] = x | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func skipExtension(b []byte, xi *extensionFieldInfo, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, _ ValidationStatus) { | ||||
| 	if xi.validation.mi == nil { | ||||
| 		return out, ValidationUnknown | ||||
| 	} | ||||
| 	xi.validation.mi.init() | ||||
| 	switch xi.validation.typ { | ||||
| 	case validationTypeMessage: | ||||
| 		if wtyp != protowire.BytesType { | ||||
| 			return out, ValidationUnknown | ||||
| 		} | ||||
| 		v, n := protowire.ConsumeBytes(b) | ||||
| 		if n < 0 { | ||||
| 			return out, ValidationUnknown | ||||
| 		} | ||||
| 		out, st := xi.validation.mi.validate(v, 0, opts) | ||||
| 		out.n = n | ||||
| 		return out, st | ||||
| 	case validationTypeGroup: | ||||
| 		if wtyp != protowire.StartGroupType { | ||||
| 			return out, ValidationUnknown | ||||
| 		} | ||||
| 		out, st := xi.validation.mi.validate(b, num, opts) | ||||
| 		return out, st | ||||
| 	default: | ||||
| 		return out, ValidationUnknown | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										201
									
								
								vendor/google.golang.org/protobuf/internal/impl/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								vendor/google.golang.org/protobuf/internal/impl/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,201 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"math" | ||||
| 	"sort" | ||||
| 	"sync/atomic" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/flags" | ||||
| 	proto "google.golang.org/protobuf/proto" | ||||
| 	piface "google.golang.org/protobuf/runtime/protoiface" | ||||
| ) | ||||
|  | ||||
| type marshalOptions struct { | ||||
| 	flags piface.MarshalInputFlags | ||||
| } | ||||
|  | ||||
| func (o marshalOptions) Options() proto.MarshalOptions { | ||||
| 	return proto.MarshalOptions{ | ||||
| 		AllowPartial:  true, | ||||
| 		Deterministic: o.Deterministic(), | ||||
| 		UseCachedSize: o.UseCachedSize(), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (o marshalOptions) Deterministic() bool { return o.flags&piface.MarshalDeterministic != 0 } | ||||
| func (o marshalOptions) UseCachedSize() bool { return o.flags&piface.MarshalUseCachedSize != 0 } | ||||
|  | ||||
| // size is protoreflect.Methods.Size. | ||||
| func (mi *MessageInfo) size(in piface.SizeInput) piface.SizeOutput { | ||||
| 	var p pointer | ||||
| 	if ms, ok := in.Message.(*messageState); ok { | ||||
| 		p = ms.pointer() | ||||
| 	} else { | ||||
| 		p = in.Message.(*messageReflectWrapper).pointer() | ||||
| 	} | ||||
| 	size := mi.sizePointer(p, marshalOptions{ | ||||
| 		flags: in.Flags, | ||||
| 	}) | ||||
| 	return piface.SizeOutput{Size: size} | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) sizePointer(p pointer, opts marshalOptions) (size int) { | ||||
| 	mi.init() | ||||
| 	if p.IsNil() { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	if opts.UseCachedSize() && mi.sizecacheOffset.IsValid() { | ||||
| 		if size := atomic.LoadInt32(p.Apply(mi.sizecacheOffset).Int32()); size >= 0 { | ||||
| 			return int(size) | ||||
| 		} | ||||
| 	} | ||||
| 	return mi.sizePointerSlow(p, opts) | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) sizePointerSlow(p pointer, opts marshalOptions) (size int) { | ||||
| 	if flags.ProtoLegacy && mi.isMessageSet { | ||||
| 		size = sizeMessageSet(mi, p, opts) | ||||
| 		if mi.sizecacheOffset.IsValid() { | ||||
| 			atomic.StoreInt32(p.Apply(mi.sizecacheOffset).Int32(), int32(size)) | ||||
| 		} | ||||
| 		return size | ||||
| 	} | ||||
| 	if mi.extensionOffset.IsValid() { | ||||
| 		e := p.Apply(mi.extensionOffset).Extensions() | ||||
| 		size += mi.sizeExtensions(e, opts) | ||||
| 	} | ||||
| 	for _, f := range mi.orderedCoderFields { | ||||
| 		if f.funcs.size == nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		fptr := p.Apply(f.offset) | ||||
| 		if f.isPointer && fptr.Elem().IsNil() { | ||||
| 			continue | ||||
| 		} | ||||
| 		size += f.funcs.size(fptr, f, opts) | ||||
| 	} | ||||
| 	if mi.unknownOffset.IsValid() { | ||||
| 		if u := mi.getUnknownBytes(p); u != nil { | ||||
| 			size += len(*u) | ||||
| 		} | ||||
| 	} | ||||
| 	if mi.sizecacheOffset.IsValid() { | ||||
| 		if size > math.MaxInt32 { | ||||
| 			// The size is too large for the int32 sizecache field. | ||||
| 			// We will need to recompute the size when encoding; | ||||
| 			// unfortunately expensive, but better than invalid output. | ||||
| 			atomic.StoreInt32(p.Apply(mi.sizecacheOffset).Int32(), -1) | ||||
| 		} else { | ||||
| 			atomic.StoreInt32(p.Apply(mi.sizecacheOffset).Int32(), int32(size)) | ||||
| 		} | ||||
| 	} | ||||
| 	return size | ||||
| } | ||||
|  | ||||
| // marshal is protoreflect.Methods.Marshal. | ||||
| func (mi *MessageInfo) marshal(in piface.MarshalInput) (out piface.MarshalOutput, err error) { | ||||
| 	var p pointer | ||||
| 	if ms, ok := in.Message.(*messageState); ok { | ||||
| 		p = ms.pointer() | ||||
| 	} else { | ||||
| 		p = in.Message.(*messageReflectWrapper).pointer() | ||||
| 	} | ||||
| 	b, err := mi.marshalAppendPointer(in.Buf, p, marshalOptions{ | ||||
| 		flags: in.Flags, | ||||
| 	}) | ||||
| 	return piface.MarshalOutput{Buf: b}, err | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) marshalAppendPointer(b []byte, p pointer, opts marshalOptions) ([]byte, error) { | ||||
| 	mi.init() | ||||
| 	if p.IsNil() { | ||||
| 		return b, nil | ||||
| 	} | ||||
| 	if flags.ProtoLegacy && mi.isMessageSet { | ||||
| 		return marshalMessageSet(mi, b, p, opts) | ||||
| 	} | ||||
| 	var err error | ||||
| 	// The old marshaler encodes extensions at beginning. | ||||
| 	if mi.extensionOffset.IsValid() { | ||||
| 		e := p.Apply(mi.extensionOffset).Extensions() | ||||
| 		// TODO: Special handling for MessageSet? | ||||
| 		b, err = mi.appendExtensions(b, e, opts) | ||||
| 		if err != nil { | ||||
| 			return b, err | ||||
| 		} | ||||
| 	} | ||||
| 	for _, f := range mi.orderedCoderFields { | ||||
| 		if f.funcs.marshal == nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		fptr := p.Apply(f.offset) | ||||
| 		if f.isPointer && fptr.Elem().IsNil() { | ||||
| 			continue | ||||
| 		} | ||||
| 		b, err = f.funcs.marshal(b, fptr, f, opts) | ||||
| 		if err != nil { | ||||
| 			return b, err | ||||
| 		} | ||||
| 	} | ||||
| 	if mi.unknownOffset.IsValid() && !mi.isMessageSet { | ||||
| 		if u := mi.getUnknownBytes(p); u != nil { | ||||
| 			b = append(b, (*u)...) | ||||
| 		} | ||||
| 	} | ||||
| 	return b, nil | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) sizeExtensions(ext *map[int32]ExtensionField, opts marshalOptions) (n int) { | ||||
| 	if ext == nil { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	for _, x := range *ext { | ||||
| 		xi := getExtensionFieldInfo(x.Type()) | ||||
| 		if xi.funcs.size == nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		n += xi.funcs.size(x.Value(), xi.tagsize, opts) | ||||
| 	} | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) appendExtensions(b []byte, ext *map[int32]ExtensionField, opts marshalOptions) ([]byte, error) { | ||||
| 	if ext == nil { | ||||
| 		return b, nil | ||||
| 	} | ||||
|  | ||||
| 	switch len(*ext) { | ||||
| 	case 0: | ||||
| 		return b, nil | ||||
| 	case 1: | ||||
| 		// Fast-path for one extension: Don't bother sorting the keys. | ||||
| 		var err error | ||||
| 		for _, x := range *ext { | ||||
| 			xi := getExtensionFieldInfo(x.Type()) | ||||
| 			b, err = xi.funcs.marshal(b, x.Value(), xi.wiretag, opts) | ||||
| 		} | ||||
| 		return b, err | ||||
| 	default: | ||||
| 		// Sort the keys to provide a deterministic encoding. | ||||
| 		// Not sure this is required, but the old code does it. | ||||
| 		keys := make([]int, 0, len(*ext)) | ||||
| 		for k := range *ext { | ||||
| 			keys = append(keys, int(k)) | ||||
| 		} | ||||
| 		sort.Ints(keys) | ||||
| 		var err error | ||||
| 		for _, k := range keys { | ||||
| 			x := (*ext)[int32(k)] | ||||
| 			xi := getExtensionFieldInfo(x.Type()) | ||||
| 			b, err = xi.funcs.marshal(b, x.Value(), xi.wiretag, opts) | ||||
| 			if err != nil { | ||||
| 				return b, err | ||||
| 			} | ||||
| 		} | ||||
| 		return b, nil | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										21
									
								
								vendor/google.golang.org/protobuf/internal/impl/enum.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								vendor/google.golang.org/protobuf/internal/impl/enum.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
|  | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| type EnumInfo struct { | ||||
| 	GoReflectType reflect.Type // int32 kind | ||||
| 	Desc          pref.EnumDescriptor | ||||
| } | ||||
|  | ||||
| func (t *EnumInfo) New(n pref.EnumNumber) pref.Enum { | ||||
| 	return reflect.ValueOf(n).Convert(t.GoReflectType).Interface().(pref.Enum) | ||||
| } | ||||
| func (t *EnumInfo) Descriptor() pref.EnumDescriptor { return t.Desc } | ||||
							
								
								
									
										156
									
								
								vendor/google.golang.org/protobuf/internal/impl/extension.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								vendor/google.golang.org/protobuf/internal/impl/extension.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,156 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"sync" | ||||
| 	"sync/atomic" | ||||
|  | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	piface "google.golang.org/protobuf/runtime/protoiface" | ||||
| ) | ||||
|  | ||||
| // ExtensionInfo implements ExtensionType. | ||||
| // | ||||
| // This type contains a number of exported fields for legacy compatibility. | ||||
| // The only non-deprecated use of this type is through the methods of the | ||||
| // ExtensionType interface. | ||||
| type ExtensionInfo struct { | ||||
| 	// An ExtensionInfo may exist in several stages of initialization. | ||||
| 	// | ||||
| 	// extensionInfoUninitialized: Some or all of the legacy exported | ||||
| 	// fields may be set, but none of the unexported fields have been | ||||
| 	// initialized. This is the starting state for an ExtensionInfo | ||||
| 	// in legacy generated code. | ||||
| 	// | ||||
| 	// extensionInfoDescInit: The desc field is set, but other unexported fields | ||||
| 	// may not be initialized. Legacy exported fields may or may not be set. | ||||
| 	// This is the starting state for an ExtensionInfo in newly generated code. | ||||
| 	// | ||||
| 	// extensionInfoFullInit: The ExtensionInfo is fully initialized. | ||||
| 	// This state is only entered after lazy initialization is complete. | ||||
| 	init uint32 | ||||
| 	mu   sync.Mutex | ||||
|  | ||||
| 	goType reflect.Type | ||||
| 	desc   extensionTypeDescriptor | ||||
| 	conv   Converter | ||||
| 	info   *extensionFieldInfo // for fast-path method implementations | ||||
|  | ||||
| 	// ExtendedType is a typed nil-pointer to the parent message type that | ||||
| 	// is being extended. It is possible for this to be unpopulated in v2 | ||||
| 	// since the message may no longer implement the MessageV1 interface. | ||||
| 	// | ||||
| 	// Deprecated: Use the ExtendedType method instead. | ||||
| 	ExtendedType piface.MessageV1 | ||||
|  | ||||
| 	// ExtensionType is the zero value of the extension type. | ||||
| 	// | ||||
| 	// For historical reasons, reflect.TypeOf(ExtensionType) and the | ||||
| 	// type returned by InterfaceOf may not be identical. | ||||
| 	// | ||||
| 	// Deprecated: Use InterfaceOf(xt.Zero()) instead. | ||||
| 	ExtensionType interface{} | ||||
|  | ||||
| 	// Field is the field number of the extension. | ||||
| 	// | ||||
| 	// Deprecated: Use the Descriptor().Number method instead. | ||||
| 	Field int32 | ||||
|  | ||||
| 	// Name is the fully qualified name of extension. | ||||
| 	// | ||||
| 	// Deprecated: Use the Descriptor().FullName method instead. | ||||
| 	Name string | ||||
|  | ||||
| 	// Tag is the protobuf struct tag used in the v1 API. | ||||
| 	// | ||||
| 	// Deprecated: Do not use. | ||||
| 	Tag string | ||||
|  | ||||
| 	// Filename is the proto filename in which the extension is defined. | ||||
| 	// | ||||
| 	// Deprecated: Use Descriptor().ParentFile().Path() instead. | ||||
| 	Filename string | ||||
| } | ||||
|  | ||||
| // Stages of initialization: See the ExtensionInfo.init field. | ||||
| const ( | ||||
| 	extensionInfoUninitialized = 0 | ||||
| 	extensionInfoDescInit      = 1 | ||||
| 	extensionInfoFullInit      = 2 | ||||
| ) | ||||
|  | ||||
| func InitExtensionInfo(xi *ExtensionInfo, xd pref.ExtensionDescriptor, goType reflect.Type) { | ||||
| 	xi.goType = goType | ||||
| 	xi.desc = extensionTypeDescriptor{xd, xi} | ||||
| 	xi.init = extensionInfoDescInit | ||||
| } | ||||
|  | ||||
| func (xi *ExtensionInfo) New() pref.Value { | ||||
| 	return xi.lazyInit().New() | ||||
| } | ||||
| func (xi *ExtensionInfo) Zero() pref.Value { | ||||
| 	return xi.lazyInit().Zero() | ||||
| } | ||||
| func (xi *ExtensionInfo) ValueOf(v interface{}) pref.Value { | ||||
| 	return xi.lazyInit().PBValueOf(reflect.ValueOf(v)) | ||||
| } | ||||
| func (xi *ExtensionInfo) InterfaceOf(v pref.Value) interface{} { | ||||
| 	return xi.lazyInit().GoValueOf(v).Interface() | ||||
| } | ||||
| func (xi *ExtensionInfo) IsValidValue(v pref.Value) bool { | ||||
| 	return xi.lazyInit().IsValidPB(v) | ||||
| } | ||||
| func (xi *ExtensionInfo) IsValidInterface(v interface{}) bool { | ||||
| 	return xi.lazyInit().IsValidGo(reflect.ValueOf(v)) | ||||
| } | ||||
| func (xi *ExtensionInfo) TypeDescriptor() pref.ExtensionTypeDescriptor { | ||||
| 	if atomic.LoadUint32(&xi.init) < extensionInfoDescInit { | ||||
| 		xi.lazyInitSlow() | ||||
| 	} | ||||
| 	return &xi.desc | ||||
| } | ||||
|  | ||||
| func (xi *ExtensionInfo) lazyInit() Converter { | ||||
| 	if atomic.LoadUint32(&xi.init) < extensionInfoFullInit { | ||||
| 		xi.lazyInitSlow() | ||||
| 	} | ||||
| 	return xi.conv | ||||
| } | ||||
|  | ||||
| func (xi *ExtensionInfo) lazyInitSlow() { | ||||
| 	xi.mu.Lock() | ||||
| 	defer xi.mu.Unlock() | ||||
|  | ||||
| 	if xi.init == extensionInfoFullInit { | ||||
| 		return | ||||
| 	} | ||||
| 	defer atomic.StoreUint32(&xi.init, extensionInfoFullInit) | ||||
|  | ||||
| 	if xi.desc.ExtensionDescriptor == nil { | ||||
| 		xi.initFromLegacy() | ||||
| 	} | ||||
| 	if !xi.desc.ExtensionDescriptor.IsPlaceholder() { | ||||
| 		if xi.ExtensionType == nil { | ||||
| 			xi.initToLegacy() | ||||
| 		} | ||||
| 		xi.conv = NewConverter(xi.goType, xi.desc.ExtensionDescriptor) | ||||
| 		xi.info = makeExtensionFieldInfo(xi.desc.ExtensionDescriptor) | ||||
| 		xi.info.validation = newValidationInfo(xi.desc.ExtensionDescriptor, xi.goType) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type extensionTypeDescriptor struct { | ||||
| 	pref.ExtensionDescriptor | ||||
| 	xi *ExtensionInfo | ||||
| } | ||||
|  | ||||
| func (xtd *extensionTypeDescriptor) Type() pref.ExtensionType { | ||||
| 	return xtd.xi | ||||
| } | ||||
| func (xtd *extensionTypeDescriptor) Descriptor() pref.ExtensionDescriptor { | ||||
| 	return xtd.ExtensionDescriptor | ||||
| } | ||||
							
								
								
									
										219
									
								
								vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,219 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/filedesc" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| // legacyEnumName returns the name of enums used in legacy code. | ||||
| // It is neither the protobuf full name nor the qualified Go name, | ||||
| // but rather an odd hybrid of both. | ||||
| func legacyEnumName(ed pref.EnumDescriptor) string { | ||||
| 	var protoPkg string | ||||
| 	enumName := string(ed.FullName()) | ||||
| 	if fd := ed.ParentFile(); fd != nil { | ||||
| 		protoPkg = string(fd.Package()) | ||||
| 		enumName = strings.TrimPrefix(enumName, protoPkg+".") | ||||
| 	} | ||||
| 	if protoPkg == "" { | ||||
| 		return strs.GoCamelCase(enumName) | ||||
| 	} | ||||
| 	return protoPkg + "." + strs.GoCamelCase(enumName) | ||||
| } | ||||
|  | ||||
| // legacyWrapEnum wraps v as a protoreflect.Enum, | ||||
| // where v must be a int32 kind and not implement the v2 API already. | ||||
| func legacyWrapEnum(v reflect.Value) pref.Enum { | ||||
| 	et := legacyLoadEnumType(v.Type()) | ||||
| 	return et.New(pref.EnumNumber(v.Int())) | ||||
| } | ||||
|  | ||||
| var legacyEnumTypeCache sync.Map // map[reflect.Type]protoreflect.EnumType | ||||
|  | ||||
| // legacyLoadEnumType dynamically loads a protoreflect.EnumType for t, | ||||
| // where t must be an int32 kind and not implement the v2 API already. | ||||
| func legacyLoadEnumType(t reflect.Type) pref.EnumType { | ||||
| 	// Fast-path: check if a EnumType is cached for this concrete type. | ||||
| 	if et, ok := legacyEnumTypeCache.Load(t); ok { | ||||
| 		return et.(pref.EnumType) | ||||
| 	} | ||||
|  | ||||
| 	// Slow-path: derive enum descriptor and initialize EnumType. | ||||
| 	var et pref.EnumType | ||||
| 	ed := LegacyLoadEnumDesc(t) | ||||
| 	et = &legacyEnumType{ | ||||
| 		desc:   ed, | ||||
| 		goType: t, | ||||
| 	} | ||||
| 	if et, ok := legacyEnumTypeCache.LoadOrStore(t, et); ok { | ||||
| 		return et.(pref.EnumType) | ||||
| 	} | ||||
| 	return et | ||||
| } | ||||
|  | ||||
| type legacyEnumType struct { | ||||
| 	desc   pref.EnumDescriptor | ||||
| 	goType reflect.Type | ||||
| 	m      sync.Map // map[protoreflect.EnumNumber]proto.Enum | ||||
| } | ||||
|  | ||||
| func (t *legacyEnumType) New(n pref.EnumNumber) pref.Enum { | ||||
| 	if e, ok := t.m.Load(n); ok { | ||||
| 		return e.(pref.Enum) | ||||
| 	} | ||||
| 	e := &legacyEnumWrapper{num: n, pbTyp: t, goTyp: t.goType} | ||||
| 	t.m.Store(n, e) | ||||
| 	return e | ||||
| } | ||||
| func (t *legacyEnumType) Descriptor() pref.EnumDescriptor { | ||||
| 	return t.desc | ||||
| } | ||||
|  | ||||
| type legacyEnumWrapper struct { | ||||
| 	num   pref.EnumNumber | ||||
| 	pbTyp pref.EnumType | ||||
| 	goTyp reflect.Type | ||||
| } | ||||
|  | ||||
| func (e *legacyEnumWrapper) Descriptor() pref.EnumDescriptor { | ||||
| 	return e.pbTyp.Descriptor() | ||||
| } | ||||
| func (e *legacyEnumWrapper) Type() pref.EnumType { | ||||
| 	return e.pbTyp | ||||
| } | ||||
| func (e *legacyEnumWrapper) Number() pref.EnumNumber { | ||||
| 	return e.num | ||||
| } | ||||
| func (e *legacyEnumWrapper) ProtoReflect() pref.Enum { | ||||
| 	return e | ||||
| } | ||||
| func (e *legacyEnumWrapper) protoUnwrap() interface{} { | ||||
| 	v := reflect.New(e.goTyp).Elem() | ||||
| 	v.SetInt(int64(e.num)) | ||||
| 	return v.Interface() | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	_ pref.Enum = (*legacyEnumWrapper)(nil) | ||||
| 	_ unwrapper = (*legacyEnumWrapper)(nil) | ||||
| ) | ||||
|  | ||||
| var legacyEnumDescCache sync.Map // map[reflect.Type]protoreflect.EnumDescriptor | ||||
|  | ||||
| // LegacyLoadEnumDesc returns an EnumDescriptor derived from the Go type, | ||||
| // which must be an int32 kind and not implement the v2 API already. | ||||
| // | ||||
| // This is exported for testing purposes. | ||||
| func LegacyLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { | ||||
| 	// Fast-path: check if an EnumDescriptor is cached for this concrete type. | ||||
| 	if ed, ok := legacyEnumDescCache.Load(t); ok { | ||||
| 		return ed.(pref.EnumDescriptor) | ||||
| 	} | ||||
|  | ||||
| 	// Slow-path: initialize EnumDescriptor from the raw descriptor. | ||||
| 	ev := reflect.Zero(t).Interface() | ||||
| 	if _, ok := ev.(pref.Enum); ok { | ||||
| 		panic(fmt.Sprintf("%v already implements proto.Enum", t)) | ||||
| 	} | ||||
| 	edV1, ok := ev.(enumV1) | ||||
| 	if !ok { | ||||
| 		return aberrantLoadEnumDesc(t) | ||||
| 	} | ||||
| 	b, idxs := edV1.EnumDescriptor() | ||||
|  | ||||
| 	var ed pref.EnumDescriptor | ||||
| 	if len(idxs) == 1 { | ||||
| 		ed = legacyLoadFileDesc(b).Enums().Get(idxs[0]) | ||||
| 	} else { | ||||
| 		md := legacyLoadFileDesc(b).Messages().Get(idxs[0]) | ||||
| 		for _, i := range idxs[1 : len(idxs)-1] { | ||||
| 			md = md.Messages().Get(i) | ||||
| 		} | ||||
| 		ed = md.Enums().Get(idxs[len(idxs)-1]) | ||||
| 	} | ||||
| 	if ed, ok := legacyEnumDescCache.LoadOrStore(t, ed); ok { | ||||
| 		return ed.(protoreflect.EnumDescriptor) | ||||
| 	} | ||||
| 	return ed | ||||
| } | ||||
|  | ||||
| var aberrantEnumDescCache sync.Map // map[reflect.Type]protoreflect.EnumDescriptor | ||||
|  | ||||
| // aberrantLoadEnumDesc returns an EnumDescriptor derived from the Go type, | ||||
| // which must not implement protoreflect.Enum or enumV1. | ||||
| // | ||||
| // If the type does not implement enumV1, then there is no reliable | ||||
| // way to derive the original protobuf type information. | ||||
| // We are unable to use the global enum registry since it is | ||||
| // unfortunately keyed by the protobuf full name, which we also do not know. | ||||
| // Thus, this produces some bogus enum descriptor based on the Go type name. | ||||
| func aberrantLoadEnumDesc(t reflect.Type) pref.EnumDescriptor { | ||||
| 	// Fast-path: check if an EnumDescriptor is cached for this concrete type. | ||||
| 	if ed, ok := aberrantEnumDescCache.Load(t); ok { | ||||
| 		return ed.(pref.EnumDescriptor) | ||||
| 	} | ||||
|  | ||||
| 	// Slow-path: construct a bogus, but unique EnumDescriptor. | ||||
| 	ed := &filedesc.Enum{L2: new(filedesc.EnumL2)} | ||||
| 	ed.L0.FullName = AberrantDeriveFullName(t) // e.g., github_com.user.repo.MyEnum | ||||
| 	ed.L0.ParentFile = filedesc.SurrogateProto3 | ||||
| 	ed.L2.Values.List = append(ed.L2.Values.List, filedesc.EnumValue{}) | ||||
|  | ||||
| 	// TODO: Use the presence of a UnmarshalJSON method to determine proto2? | ||||
|  | ||||
| 	vd := &ed.L2.Values.List[0] | ||||
| 	vd.L0.FullName = ed.L0.FullName + "_UNKNOWN" // e.g., github_com.user.repo.MyEnum_UNKNOWN | ||||
| 	vd.L0.ParentFile = ed.L0.ParentFile | ||||
| 	vd.L0.Parent = ed | ||||
|  | ||||
| 	// TODO: We could use the String method to obtain some enum value names by | ||||
| 	// starting at 0 and print the enum until it produces invalid identifiers. | ||||
| 	// An exhaustive query is clearly impractical, but can be best-effort. | ||||
|  | ||||
| 	if ed, ok := aberrantEnumDescCache.LoadOrStore(t, ed); ok { | ||||
| 		return ed.(pref.EnumDescriptor) | ||||
| 	} | ||||
| 	return ed | ||||
| } | ||||
|  | ||||
| // AberrantDeriveFullName derives a fully qualified protobuf name for the given Go type | ||||
| // The provided name is not guaranteed to be stable nor universally unique. | ||||
| // It should be sufficiently unique within a program. | ||||
| // | ||||
| // This is exported for testing purposes. | ||||
| func AberrantDeriveFullName(t reflect.Type) pref.FullName { | ||||
| 	sanitize := func(r rune) rune { | ||||
| 		switch { | ||||
| 		case r == '/': | ||||
| 			return '.' | ||||
| 		case 'a' <= r && r <= 'z', 'A' <= r && r <= 'Z', '0' <= r && r <= '9': | ||||
| 			return r | ||||
| 		default: | ||||
| 			return '_' | ||||
| 		} | ||||
| 	} | ||||
| 	prefix := strings.Map(sanitize, t.PkgPath()) | ||||
| 	suffix := strings.Map(sanitize, t.Name()) | ||||
| 	if suffix == "" { | ||||
| 		suffix = fmt.Sprintf("UnknownX%X", reflect.ValueOf(t).Pointer()) | ||||
| 	} | ||||
|  | ||||
| 	ss := append(strings.Split(prefix, "."), suffix) | ||||
| 	for i, s := range ss { | ||||
| 		if s == "" || ('0' <= s[0] && s[0] <= '9') { | ||||
| 			ss[i] = "x" + s | ||||
| 		} | ||||
| 	} | ||||
| 	return pref.FullName(strings.Join(ss, ".")) | ||||
| } | ||||
							
								
								
									
										92
									
								
								vendor/google.golang.org/protobuf/internal/impl/legacy_export.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								vendor/google.golang.org/protobuf/internal/impl/legacy_export.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| 	"encoding/json" | ||||
| 	"hash/crc32" | ||||
| 	"math" | ||||
| 	"reflect" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	piface "google.golang.org/protobuf/runtime/protoiface" | ||||
| ) | ||||
|  | ||||
| // These functions exist to support exported APIs in generated protobufs. | ||||
| // While these are deprecated, they cannot be removed for compatibility reasons. | ||||
|  | ||||
| // LegacyEnumName returns the name of enums used in legacy code. | ||||
| func (Export) LegacyEnumName(ed pref.EnumDescriptor) string { | ||||
| 	return legacyEnumName(ed) | ||||
| } | ||||
|  | ||||
| // LegacyMessageTypeOf returns the protoreflect.MessageType for m, | ||||
| // with name used as the message name if necessary. | ||||
| func (Export) LegacyMessageTypeOf(m piface.MessageV1, name pref.FullName) pref.MessageType { | ||||
| 	if mv := (Export{}).protoMessageV2Of(m); mv != nil { | ||||
| 		return mv.ProtoReflect().Type() | ||||
| 	} | ||||
| 	return legacyLoadMessageType(reflect.TypeOf(m), name) | ||||
| } | ||||
|  | ||||
| // UnmarshalJSONEnum unmarshals an enum from a JSON-encoded input. | ||||
| // The input can either be a string representing the enum value by name, | ||||
| // or a number representing the enum number itself. | ||||
| func (Export) UnmarshalJSONEnum(ed pref.EnumDescriptor, b []byte) (pref.EnumNumber, error) { | ||||
| 	if b[0] == '"' { | ||||
| 		var name pref.Name | ||||
| 		if err := json.Unmarshal(b, &name); err != nil { | ||||
| 			return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b) | ||||
| 		} | ||||
| 		ev := ed.Values().ByName(name) | ||||
| 		if ev == nil { | ||||
| 			return 0, errors.New("invalid value for enum %v: %s", ed.FullName(), name) | ||||
| 		} | ||||
| 		return ev.Number(), nil | ||||
| 	} else { | ||||
| 		var num pref.EnumNumber | ||||
| 		if err := json.Unmarshal(b, &num); err != nil { | ||||
| 			return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b) | ||||
| 		} | ||||
| 		return num, nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // CompressGZIP compresses the input as a GZIP-encoded file. | ||||
| // The current implementation does no compression. | ||||
| func (Export) CompressGZIP(in []byte) (out []byte) { | ||||
| 	// RFC 1952, section 2.3.1. | ||||
| 	var gzipHeader = [10]byte{0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff} | ||||
|  | ||||
| 	// RFC 1951, section 3.2.4. | ||||
| 	var blockHeader [5]byte | ||||
| 	const maxBlockSize = math.MaxUint16 | ||||
| 	numBlocks := 1 + len(in)/maxBlockSize | ||||
|  | ||||
| 	// RFC 1952, section 2.3.1. | ||||
| 	var gzipFooter [8]byte | ||||
| 	binary.LittleEndian.PutUint32(gzipFooter[0:4], crc32.ChecksumIEEE(in)) | ||||
| 	binary.LittleEndian.PutUint32(gzipFooter[4:8], uint32(len(in))) | ||||
|  | ||||
| 	// Encode the input without compression using raw DEFLATE blocks. | ||||
| 	out = make([]byte, 0, len(gzipHeader)+len(blockHeader)*numBlocks+len(in)+len(gzipFooter)) | ||||
| 	out = append(out, gzipHeader[:]...) | ||||
| 	for blockHeader[0] == 0 { | ||||
| 		blockSize := maxBlockSize | ||||
| 		if blockSize > len(in) { | ||||
| 			blockHeader[0] = 0x01 // final bit per RFC 1951, section 3.2.3. | ||||
| 			blockSize = len(in) | ||||
| 		} | ||||
| 		binary.LittleEndian.PutUint16(blockHeader[1:3], uint16(blockSize)^0x0000) | ||||
| 		binary.LittleEndian.PutUint16(blockHeader[3:5], uint16(blockSize)^0xffff) | ||||
| 		out = append(out, blockHeader[:]...) | ||||
| 		out = append(out, in[:blockSize]...) | ||||
| 		in = in[blockSize:] | ||||
| 	} | ||||
| 	out = append(out, gzipFooter[:]...) | ||||
| 	return out | ||||
| } | ||||
							
								
								
									
										176
									
								
								vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/descopts" | ||||
| 	"google.golang.org/protobuf/internal/encoding/messageset" | ||||
| 	ptag "google.golang.org/protobuf/internal/encoding/tag" | ||||
| 	"google.golang.org/protobuf/internal/filedesc" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	preg "google.golang.org/protobuf/reflect/protoregistry" | ||||
| 	piface "google.golang.org/protobuf/runtime/protoiface" | ||||
| ) | ||||
|  | ||||
| func (xi *ExtensionInfo) initToLegacy() { | ||||
| 	xd := xi.desc | ||||
| 	var parent piface.MessageV1 | ||||
| 	messageName := xd.ContainingMessage().FullName() | ||||
| 	if mt, _ := preg.GlobalTypes.FindMessageByName(messageName); mt != nil { | ||||
| 		// Create a new parent message and unwrap it if possible. | ||||
| 		mv := mt.New().Interface() | ||||
| 		t := reflect.TypeOf(mv) | ||||
| 		if mv, ok := mv.(unwrapper); ok { | ||||
| 			t = reflect.TypeOf(mv.protoUnwrap()) | ||||
| 		} | ||||
|  | ||||
| 		// Check whether the message implements the legacy v1 Message interface. | ||||
| 		mz := reflect.Zero(t).Interface() | ||||
| 		if mz, ok := mz.(piface.MessageV1); ok { | ||||
| 			parent = mz | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Determine the v1 extension type, which is unfortunately not the same as | ||||
| 	// the v2 ExtensionType.GoType. | ||||
| 	extType := xi.goType | ||||
| 	switch extType.Kind() { | ||||
| 	case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String: | ||||
| 		extType = reflect.PtrTo(extType) // T -> *T for singular scalar fields | ||||
| 	} | ||||
|  | ||||
| 	// Reconstruct the legacy enum full name. | ||||
| 	var enumName string | ||||
| 	if xd.Kind() == pref.EnumKind { | ||||
| 		enumName = legacyEnumName(xd.Enum()) | ||||
| 	} | ||||
|  | ||||
| 	// Derive the proto file that the extension was declared within. | ||||
| 	var filename string | ||||
| 	if fd := xd.ParentFile(); fd != nil { | ||||
| 		filename = fd.Path() | ||||
| 	} | ||||
|  | ||||
| 	// For MessageSet extensions, the name used is the parent message. | ||||
| 	name := xd.FullName() | ||||
| 	if messageset.IsMessageSetExtension(xd) { | ||||
| 		name = name.Parent() | ||||
| 	} | ||||
|  | ||||
| 	xi.ExtendedType = parent | ||||
| 	xi.ExtensionType = reflect.Zero(extType).Interface() | ||||
| 	xi.Field = int32(xd.Number()) | ||||
| 	xi.Name = string(name) | ||||
| 	xi.Tag = ptag.Marshal(xd, enumName) | ||||
| 	xi.Filename = filename | ||||
| } | ||||
|  | ||||
| // initFromLegacy initializes an ExtensionInfo from | ||||
| // the contents of the deprecated exported fields of the type. | ||||
| func (xi *ExtensionInfo) initFromLegacy() { | ||||
| 	// The v1 API returns "type incomplete" descriptors where only the | ||||
| 	// field number is specified. In such a case, use a placeholder. | ||||
| 	if xi.ExtendedType == nil || xi.ExtensionType == nil { | ||||
| 		xd := placeholderExtension{ | ||||
| 			name:   pref.FullName(xi.Name), | ||||
| 			number: pref.FieldNumber(xi.Field), | ||||
| 		} | ||||
| 		xi.desc = extensionTypeDescriptor{xd, xi} | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// Resolve enum or message dependencies. | ||||
| 	var ed pref.EnumDescriptor | ||||
| 	var md pref.MessageDescriptor | ||||
| 	t := reflect.TypeOf(xi.ExtensionType) | ||||
| 	isOptional := t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct | ||||
| 	isRepeated := t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 | ||||
| 	if isOptional || isRepeated { | ||||
| 		t = t.Elem() | ||||
| 	} | ||||
| 	switch v := reflect.Zero(t).Interface().(type) { | ||||
| 	case pref.Enum: | ||||
| 		ed = v.Descriptor() | ||||
| 	case enumV1: | ||||
| 		ed = LegacyLoadEnumDesc(t) | ||||
| 	case pref.ProtoMessage: | ||||
| 		md = v.ProtoReflect().Descriptor() | ||||
| 	case messageV1: | ||||
| 		md = LegacyLoadMessageDesc(t) | ||||
| 	} | ||||
|  | ||||
| 	// Derive basic field information from the struct tag. | ||||
| 	var evs pref.EnumValueDescriptors | ||||
| 	if ed != nil { | ||||
| 		evs = ed.Values() | ||||
| 	} | ||||
| 	fd := ptag.Unmarshal(xi.Tag, t, evs).(*filedesc.Field) | ||||
|  | ||||
| 	// Construct a v2 ExtensionType. | ||||
| 	xd := &filedesc.Extension{L2: new(filedesc.ExtensionL2)} | ||||
| 	xd.L0.ParentFile = filedesc.SurrogateProto2 | ||||
| 	xd.L0.FullName = pref.FullName(xi.Name) | ||||
| 	xd.L1.Number = pref.FieldNumber(xi.Field) | ||||
| 	xd.L1.Cardinality = fd.L1.Cardinality | ||||
| 	xd.L1.Kind = fd.L1.Kind | ||||
| 	xd.L2.IsPacked = fd.L1.IsPacked | ||||
| 	xd.L2.Default = fd.L1.Default | ||||
| 	xd.L1.Extendee = Export{}.MessageDescriptorOf(xi.ExtendedType) | ||||
| 	xd.L2.Enum = ed | ||||
| 	xd.L2.Message = md | ||||
|  | ||||
| 	// Derive real extension field name for MessageSets. | ||||
| 	if messageset.IsMessageSet(xd.L1.Extendee) && md.FullName() == xd.L0.FullName { | ||||
| 		xd.L0.FullName = xd.L0.FullName.Append(messageset.ExtensionName) | ||||
| 	} | ||||
|  | ||||
| 	tt := reflect.TypeOf(xi.ExtensionType) | ||||
| 	if isOptional { | ||||
| 		tt = tt.Elem() | ||||
| 	} | ||||
| 	xi.goType = tt | ||||
| 	xi.desc = extensionTypeDescriptor{xd, xi} | ||||
| } | ||||
|  | ||||
| type placeholderExtension struct { | ||||
| 	name   pref.FullName | ||||
| 	number pref.FieldNumber | ||||
| } | ||||
|  | ||||
| func (x placeholderExtension) ParentFile() pref.FileDescriptor            { return nil } | ||||
| func (x placeholderExtension) Parent() pref.Descriptor                    { return nil } | ||||
| func (x placeholderExtension) Index() int                                 { return 0 } | ||||
| func (x placeholderExtension) Syntax() pref.Syntax                        { return 0 } | ||||
| func (x placeholderExtension) Name() pref.Name                            { return x.name.Name() } | ||||
| func (x placeholderExtension) FullName() pref.FullName                    { return x.name } | ||||
| func (x placeholderExtension) IsPlaceholder() bool                        { return true } | ||||
| func (x placeholderExtension) Options() pref.ProtoMessage                 { return descopts.Field } | ||||
| func (x placeholderExtension) Number() pref.FieldNumber                   { return x.number } | ||||
| func (x placeholderExtension) Cardinality() pref.Cardinality              { return 0 } | ||||
| func (x placeholderExtension) Kind() pref.Kind                            { return 0 } | ||||
| func (x placeholderExtension) HasJSONName() bool                          { return false } | ||||
| func (x placeholderExtension) JSONName() string                           { return "[" + string(x.name) + "]" } | ||||
| func (x placeholderExtension) TextName() string                           { return "[" + string(x.name) + "]" } | ||||
| func (x placeholderExtension) HasPresence() bool                          { return false } | ||||
| func (x placeholderExtension) HasOptionalKeyword() bool                   { return false } | ||||
| func (x placeholderExtension) IsExtension() bool                          { return true } | ||||
| func (x placeholderExtension) IsWeak() bool                               { return false } | ||||
| func (x placeholderExtension) IsPacked() bool                             { return false } | ||||
| func (x placeholderExtension) IsList() bool                               { return false } | ||||
| func (x placeholderExtension) IsMap() bool                                { return false } | ||||
| func (x placeholderExtension) MapKey() pref.FieldDescriptor               { return nil } | ||||
| func (x placeholderExtension) MapValue() pref.FieldDescriptor             { return nil } | ||||
| func (x placeholderExtension) HasDefault() bool                           { return false } | ||||
| func (x placeholderExtension) Default() pref.Value                        { return pref.Value{} } | ||||
| func (x placeholderExtension) DefaultEnumValue() pref.EnumValueDescriptor { return nil } | ||||
| func (x placeholderExtension) ContainingOneof() pref.OneofDescriptor      { return nil } | ||||
| func (x placeholderExtension) ContainingMessage() pref.MessageDescriptor  { return nil } | ||||
| func (x placeholderExtension) Enum() pref.EnumDescriptor                  { return nil } | ||||
| func (x placeholderExtension) Message() pref.MessageDescriptor            { return nil } | ||||
| func (x placeholderExtension) ProtoType(pref.FieldDescriptor)             { return } | ||||
| func (x placeholderExtension) ProtoInternal(pragma.DoNotImplement)        { return } | ||||
							
								
								
									
										81
									
								
								vendor/google.golang.org/protobuf/internal/impl/legacy_file.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								vendor/google.golang.org/protobuf/internal/impl/legacy_file.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"compress/gzip" | ||||
| 	"io/ioutil" | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/filedesc" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	"google.golang.org/protobuf/reflect/protoregistry" | ||||
| ) | ||||
|  | ||||
| // Every enum and message type generated by protoc-gen-go since commit 2fc053c5 | ||||
| // on February 25th, 2016 has had a method to get the raw descriptor. | ||||
| // Types that were not generated by protoc-gen-go or were generated prior | ||||
| // to that version are not supported. | ||||
| // | ||||
| // The []byte returned is the encoded form of a FileDescriptorProto message | ||||
| // compressed using GZIP. The []int is the path from the top-level file | ||||
| // to the specific message or enum declaration. | ||||
| type ( | ||||
| 	enumV1 interface { | ||||
| 		EnumDescriptor() ([]byte, []int) | ||||
| 	} | ||||
| 	messageV1 interface { | ||||
| 		Descriptor() ([]byte, []int) | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| var legacyFileDescCache sync.Map // map[*byte]protoreflect.FileDescriptor | ||||
|  | ||||
| // legacyLoadFileDesc unmarshals b as a compressed FileDescriptorProto message. | ||||
| // | ||||
| // This assumes that b is immutable and that b does not refer to part of a | ||||
| // concatenated series of GZIP files (which would require shenanigans that | ||||
| // rely on the concatenation properties of both protobufs and GZIP). | ||||
| // File descriptors generated by protoc-gen-go do not rely on that property. | ||||
| func legacyLoadFileDesc(b []byte) protoreflect.FileDescriptor { | ||||
| 	// Fast-path: check whether we already have a cached file descriptor. | ||||
| 	if fd, ok := legacyFileDescCache.Load(&b[0]); ok { | ||||
| 		return fd.(protoreflect.FileDescriptor) | ||||
| 	} | ||||
|  | ||||
| 	// Slow-path: decompress and unmarshal the file descriptor proto. | ||||
| 	zr, err := gzip.NewReader(bytes.NewReader(b)) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	b2, err := ioutil.ReadAll(zr) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | ||||
| 	fd := filedesc.Builder{ | ||||
| 		RawDescriptor: b2, | ||||
| 		FileRegistry:  resolverOnly{protoregistry.GlobalFiles}, // do not register back to global registry | ||||
| 	}.Build().File | ||||
| 	if fd, ok := legacyFileDescCache.LoadOrStore(&b[0], fd); ok { | ||||
| 		return fd.(protoreflect.FileDescriptor) | ||||
| 	} | ||||
| 	return fd | ||||
| } | ||||
|  | ||||
| type resolverOnly struct { | ||||
| 	reg *protoregistry.Files | ||||
| } | ||||
|  | ||||
| func (r resolverOnly) FindFileByPath(path string) (protoreflect.FileDescriptor, error) { | ||||
| 	return r.reg.FindFileByPath(path) | ||||
| } | ||||
| func (r resolverOnly) FindDescriptorByName(name protoreflect.FullName) (protoreflect.Descriptor, error) { | ||||
| 	return r.reg.FindDescriptorByName(name) | ||||
| } | ||||
| func (resolverOnly) RegisterFile(protoreflect.FileDescriptor) error { | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										565
									
								
								vendor/google.golang.org/protobuf/internal/impl/legacy_message.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										565
									
								
								vendor/google.golang.org/protobuf/internal/impl/legacy_message.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,565 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/descopts" | ||||
| 	ptag "google.golang.org/protobuf/internal/encoding/tag" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	"google.golang.org/protobuf/internal/filedesc" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	"google.golang.org/protobuf/runtime/protoiface" | ||||
| 	piface "google.golang.org/protobuf/runtime/protoiface" | ||||
| ) | ||||
|  | ||||
| // legacyWrapMessage wraps v as a protoreflect.Message, | ||||
| // where v must be a *struct kind and not implement the v2 API already. | ||||
| func legacyWrapMessage(v reflect.Value) pref.Message { | ||||
| 	t := v.Type() | ||||
| 	if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct { | ||||
| 		return aberrantMessage{v: v} | ||||
| 	} | ||||
| 	mt := legacyLoadMessageInfo(t, "") | ||||
| 	return mt.MessageOf(v.Interface()) | ||||
| } | ||||
|  | ||||
| // legacyLoadMessageType dynamically loads a protoreflect.Type for t, | ||||
| // where t must be not implement the v2 API already. | ||||
| // The provided name is used if it cannot be determined from the message. | ||||
| func legacyLoadMessageType(t reflect.Type, name pref.FullName) protoreflect.MessageType { | ||||
| 	if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct { | ||||
| 		return aberrantMessageType{t} | ||||
| 	} | ||||
| 	return legacyLoadMessageInfo(t, name) | ||||
| } | ||||
|  | ||||
| var legacyMessageTypeCache sync.Map // map[reflect.Type]*MessageInfo | ||||
|  | ||||
| // legacyLoadMessageInfo dynamically loads a *MessageInfo for t, | ||||
| // where t must be a *struct kind and not implement the v2 API already. | ||||
| // The provided name is used if it cannot be determined from the message. | ||||
| func legacyLoadMessageInfo(t reflect.Type, name pref.FullName) *MessageInfo { | ||||
| 	// Fast-path: check if a MessageInfo is cached for this concrete type. | ||||
| 	if mt, ok := legacyMessageTypeCache.Load(t); ok { | ||||
| 		return mt.(*MessageInfo) | ||||
| 	} | ||||
|  | ||||
| 	// Slow-path: derive message descriptor and initialize MessageInfo. | ||||
| 	mi := &MessageInfo{ | ||||
| 		Desc:          legacyLoadMessageDesc(t, name), | ||||
| 		GoReflectType: t, | ||||
| 	} | ||||
|  | ||||
| 	var hasMarshal, hasUnmarshal bool | ||||
| 	v := reflect.Zero(t).Interface() | ||||
| 	if _, hasMarshal = v.(legacyMarshaler); hasMarshal { | ||||
| 		mi.methods.Marshal = legacyMarshal | ||||
|  | ||||
| 		// We have no way to tell whether the type's Marshal method | ||||
| 		// supports deterministic serialization or not, but this | ||||
| 		// preserves the v1 implementation's behavior of always | ||||
| 		// calling Marshal methods when present. | ||||
| 		mi.methods.Flags |= piface.SupportMarshalDeterministic | ||||
| 	} | ||||
| 	if _, hasUnmarshal = v.(legacyUnmarshaler); hasUnmarshal { | ||||
| 		mi.methods.Unmarshal = legacyUnmarshal | ||||
| 	} | ||||
| 	if _, hasMerge := v.(legacyMerger); hasMerge || (hasMarshal && hasUnmarshal) { | ||||
| 		mi.methods.Merge = legacyMerge | ||||
| 	} | ||||
|  | ||||
| 	if mi, ok := legacyMessageTypeCache.LoadOrStore(t, mi); ok { | ||||
| 		return mi.(*MessageInfo) | ||||
| 	} | ||||
| 	return mi | ||||
| } | ||||
|  | ||||
| var legacyMessageDescCache sync.Map // map[reflect.Type]protoreflect.MessageDescriptor | ||||
|  | ||||
| // LegacyLoadMessageDesc returns an MessageDescriptor derived from the Go type, | ||||
| // which should be a *struct kind and must not implement the v2 API already. | ||||
| // | ||||
| // This is exported for testing purposes. | ||||
| func LegacyLoadMessageDesc(t reflect.Type) pref.MessageDescriptor { | ||||
| 	return legacyLoadMessageDesc(t, "") | ||||
| } | ||||
| func legacyLoadMessageDesc(t reflect.Type, name pref.FullName) pref.MessageDescriptor { | ||||
| 	// Fast-path: check if a MessageDescriptor is cached for this concrete type. | ||||
| 	if mi, ok := legacyMessageDescCache.Load(t); ok { | ||||
| 		return mi.(pref.MessageDescriptor) | ||||
| 	} | ||||
|  | ||||
| 	// Slow-path: initialize MessageDescriptor from the raw descriptor. | ||||
| 	mv := reflect.Zero(t).Interface() | ||||
| 	if _, ok := mv.(pref.ProtoMessage); ok { | ||||
| 		panic(fmt.Sprintf("%v already implements proto.Message", t)) | ||||
| 	} | ||||
| 	mdV1, ok := mv.(messageV1) | ||||
| 	if !ok { | ||||
| 		return aberrantLoadMessageDesc(t, name) | ||||
| 	} | ||||
|  | ||||
| 	// If this is a dynamic message type where there isn't a 1-1 mapping between | ||||
| 	// Go and protobuf types, calling the Descriptor method on the zero value of | ||||
| 	// the message type isn't likely to work. If it panics, swallow the panic and | ||||
| 	// continue as if the Descriptor method wasn't present. | ||||
| 	b, idxs := func() ([]byte, []int) { | ||||
| 		defer func() { | ||||
| 			recover() | ||||
| 		}() | ||||
| 		return mdV1.Descriptor() | ||||
| 	}() | ||||
| 	if b == nil { | ||||
| 		return aberrantLoadMessageDesc(t, name) | ||||
| 	} | ||||
|  | ||||
| 	// If the Go type has no fields, then this might be a proto3 empty message | ||||
| 	// from before the size cache was added. If there are any fields, check to | ||||
| 	// see that at least one of them looks like something we generated. | ||||
| 	if t.Elem().Kind() == reflect.Struct { | ||||
| 		if nfield := t.Elem().NumField(); nfield > 0 { | ||||
| 			hasProtoField := false | ||||
| 			for i := 0; i < nfield; i++ { | ||||
| 				f := t.Elem().Field(i) | ||||
| 				if f.Tag.Get("protobuf") != "" || f.Tag.Get("protobuf_oneof") != "" || strings.HasPrefix(f.Name, "XXX_") { | ||||
| 					hasProtoField = true | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			if !hasProtoField { | ||||
| 				return aberrantLoadMessageDesc(t, name) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	md := legacyLoadFileDesc(b).Messages().Get(idxs[0]) | ||||
| 	for _, i := range idxs[1:] { | ||||
| 		md = md.Messages().Get(i) | ||||
| 	} | ||||
| 	if name != "" && md.FullName() != name { | ||||
| 		panic(fmt.Sprintf("mismatching message name: got %v, want %v", md.FullName(), name)) | ||||
| 	} | ||||
| 	if md, ok := legacyMessageDescCache.LoadOrStore(t, md); ok { | ||||
| 		return md.(protoreflect.MessageDescriptor) | ||||
| 	} | ||||
| 	return md | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	aberrantMessageDescLock  sync.Mutex | ||||
| 	aberrantMessageDescCache map[reflect.Type]protoreflect.MessageDescriptor | ||||
| ) | ||||
|  | ||||
| // aberrantLoadMessageDesc returns an MessageDescriptor derived from the Go type, | ||||
| // which must not implement protoreflect.ProtoMessage or messageV1. | ||||
| // | ||||
| // This is a best-effort derivation of the message descriptor using the protobuf | ||||
| // tags on the struct fields. | ||||
| func aberrantLoadMessageDesc(t reflect.Type, name pref.FullName) pref.MessageDescriptor { | ||||
| 	aberrantMessageDescLock.Lock() | ||||
| 	defer aberrantMessageDescLock.Unlock() | ||||
| 	if aberrantMessageDescCache == nil { | ||||
| 		aberrantMessageDescCache = make(map[reflect.Type]protoreflect.MessageDescriptor) | ||||
| 	} | ||||
| 	return aberrantLoadMessageDescReentrant(t, name) | ||||
| } | ||||
| func aberrantLoadMessageDescReentrant(t reflect.Type, name pref.FullName) pref.MessageDescriptor { | ||||
| 	// Fast-path: check if an MessageDescriptor is cached for this concrete type. | ||||
| 	if md, ok := aberrantMessageDescCache[t]; ok { | ||||
| 		return md | ||||
| 	} | ||||
|  | ||||
| 	// Slow-path: construct a descriptor from the Go struct type (best-effort). | ||||
| 	// Cache the MessageDescriptor early on so that we can resolve internal | ||||
| 	// cyclic references. | ||||
| 	md := &filedesc.Message{L2: new(filedesc.MessageL2)} | ||||
| 	md.L0.FullName = aberrantDeriveMessageName(t, name) | ||||
| 	md.L0.ParentFile = filedesc.SurrogateProto2 | ||||
| 	aberrantMessageDescCache[t] = md | ||||
|  | ||||
| 	if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct { | ||||
| 		return md | ||||
| 	} | ||||
|  | ||||
| 	// Try to determine if the message is using proto3 by checking scalars. | ||||
| 	for i := 0; i < t.Elem().NumField(); i++ { | ||||
| 		f := t.Elem().Field(i) | ||||
| 		if tag := f.Tag.Get("protobuf"); tag != "" { | ||||
| 			switch f.Type.Kind() { | ||||
| 			case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String: | ||||
| 				md.L0.ParentFile = filedesc.SurrogateProto3 | ||||
| 			} | ||||
| 			for _, s := range strings.Split(tag, ",") { | ||||
| 				if s == "proto3" { | ||||
| 					md.L0.ParentFile = filedesc.SurrogateProto3 | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Obtain a list of oneof wrapper types. | ||||
| 	var oneofWrappers []reflect.Type | ||||
| 	for _, method := range []string{"XXX_OneofFuncs", "XXX_OneofWrappers"} { | ||||
| 		if fn, ok := t.MethodByName(method); ok { | ||||
| 			for _, v := range fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))}) { | ||||
| 				if vs, ok := v.Interface().([]interface{}); ok { | ||||
| 					for _, v := range vs { | ||||
| 						oneofWrappers = append(oneofWrappers, reflect.TypeOf(v)) | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Obtain a list of the extension ranges. | ||||
| 	if fn, ok := t.MethodByName("ExtensionRangeArray"); ok { | ||||
| 		vs := fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[0] | ||||
| 		for i := 0; i < vs.Len(); i++ { | ||||
| 			v := vs.Index(i) | ||||
| 			md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, [2]pref.FieldNumber{ | ||||
| 				pref.FieldNumber(v.FieldByName("Start").Int()), | ||||
| 				pref.FieldNumber(v.FieldByName("End").Int() + 1), | ||||
| 			}) | ||||
| 			md.L2.ExtensionRangeOptions = append(md.L2.ExtensionRangeOptions, nil) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Derive the message fields by inspecting the struct fields. | ||||
| 	for i := 0; i < t.Elem().NumField(); i++ { | ||||
| 		f := t.Elem().Field(i) | ||||
| 		if tag := f.Tag.Get("protobuf"); tag != "" { | ||||
| 			tagKey := f.Tag.Get("protobuf_key") | ||||
| 			tagVal := f.Tag.Get("protobuf_val") | ||||
| 			aberrantAppendField(md, f.Type, tag, tagKey, tagVal) | ||||
| 		} | ||||
| 		if tag := f.Tag.Get("protobuf_oneof"); tag != "" { | ||||
| 			n := len(md.L2.Oneofs.List) | ||||
| 			md.L2.Oneofs.List = append(md.L2.Oneofs.List, filedesc.Oneof{}) | ||||
| 			od := &md.L2.Oneofs.List[n] | ||||
| 			od.L0.FullName = md.FullName().Append(pref.Name(tag)) | ||||
| 			od.L0.ParentFile = md.L0.ParentFile | ||||
| 			od.L0.Parent = md | ||||
| 			od.L0.Index = n | ||||
|  | ||||
| 			for _, t := range oneofWrappers { | ||||
| 				if t.Implements(f.Type) { | ||||
| 					f := t.Elem().Field(0) | ||||
| 					if tag := f.Tag.Get("protobuf"); tag != "" { | ||||
| 						aberrantAppendField(md, f.Type, tag, "", "") | ||||
| 						fd := &md.L2.Fields.List[len(md.L2.Fields.List)-1] | ||||
| 						fd.L1.ContainingOneof = od | ||||
| 						od.L1.Fields.List = append(od.L1.Fields.List, fd) | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return md | ||||
| } | ||||
|  | ||||
| func aberrantDeriveMessageName(t reflect.Type, name pref.FullName) pref.FullName { | ||||
| 	if name.IsValid() { | ||||
| 		return name | ||||
| 	} | ||||
| 	func() { | ||||
| 		defer func() { recover() }() // swallow possible nil panics | ||||
| 		if m, ok := reflect.Zero(t).Interface().(interface{ XXX_MessageName() string }); ok { | ||||
| 			name = pref.FullName(m.XXX_MessageName()) | ||||
| 		} | ||||
| 	}() | ||||
| 	if name.IsValid() { | ||||
| 		return name | ||||
| 	} | ||||
| 	if t.Kind() == reflect.Ptr { | ||||
| 		t = t.Elem() | ||||
| 	} | ||||
| 	return AberrantDeriveFullName(t) | ||||
| } | ||||
|  | ||||
| func aberrantAppendField(md *filedesc.Message, goType reflect.Type, tag, tagKey, tagVal string) { | ||||
| 	t := goType | ||||
| 	isOptional := t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct | ||||
| 	isRepeated := t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 | ||||
| 	if isOptional || isRepeated { | ||||
| 		t = t.Elem() | ||||
| 	} | ||||
| 	fd := ptag.Unmarshal(tag, t, placeholderEnumValues{}).(*filedesc.Field) | ||||
|  | ||||
| 	// Append field descriptor to the message. | ||||
| 	n := len(md.L2.Fields.List) | ||||
| 	md.L2.Fields.List = append(md.L2.Fields.List, *fd) | ||||
| 	fd = &md.L2.Fields.List[n] | ||||
| 	fd.L0.FullName = md.FullName().Append(fd.Name()) | ||||
| 	fd.L0.ParentFile = md.L0.ParentFile | ||||
| 	fd.L0.Parent = md | ||||
| 	fd.L0.Index = n | ||||
|  | ||||
| 	if fd.L1.IsWeak || fd.L1.HasPacked { | ||||
| 		fd.L1.Options = func() pref.ProtoMessage { | ||||
| 			opts := descopts.Field.ProtoReflect().New() | ||||
| 			if fd.L1.IsWeak { | ||||
| 				opts.Set(opts.Descriptor().Fields().ByName("weak"), protoreflect.ValueOfBool(true)) | ||||
| 			} | ||||
| 			if fd.L1.HasPacked { | ||||
| 				opts.Set(opts.Descriptor().Fields().ByName("packed"), protoreflect.ValueOfBool(fd.L1.IsPacked)) | ||||
| 			} | ||||
| 			return opts.Interface() | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Populate Enum and Message. | ||||
| 	if fd.Enum() == nil && fd.Kind() == pref.EnumKind { | ||||
| 		switch v := reflect.Zero(t).Interface().(type) { | ||||
| 		case pref.Enum: | ||||
| 			fd.L1.Enum = v.Descriptor() | ||||
| 		default: | ||||
| 			fd.L1.Enum = LegacyLoadEnumDesc(t) | ||||
| 		} | ||||
| 	} | ||||
| 	if fd.Message() == nil && (fd.Kind() == pref.MessageKind || fd.Kind() == pref.GroupKind) { | ||||
| 		switch v := reflect.Zero(t).Interface().(type) { | ||||
| 		case pref.ProtoMessage: | ||||
| 			fd.L1.Message = v.ProtoReflect().Descriptor() | ||||
| 		case messageV1: | ||||
| 			fd.L1.Message = LegacyLoadMessageDesc(t) | ||||
| 		default: | ||||
| 			if t.Kind() == reflect.Map { | ||||
| 				n := len(md.L1.Messages.List) | ||||
| 				md.L1.Messages.List = append(md.L1.Messages.List, filedesc.Message{L2: new(filedesc.MessageL2)}) | ||||
| 				md2 := &md.L1.Messages.List[n] | ||||
| 				md2.L0.FullName = md.FullName().Append(pref.Name(strs.MapEntryName(string(fd.Name())))) | ||||
| 				md2.L0.ParentFile = md.L0.ParentFile | ||||
| 				md2.L0.Parent = md | ||||
| 				md2.L0.Index = n | ||||
|  | ||||
| 				md2.L1.IsMapEntry = true | ||||
| 				md2.L2.Options = func() pref.ProtoMessage { | ||||
| 					opts := descopts.Message.ProtoReflect().New() | ||||
| 					opts.Set(opts.Descriptor().Fields().ByName("map_entry"), protoreflect.ValueOfBool(true)) | ||||
| 					return opts.Interface() | ||||
| 				} | ||||
|  | ||||
| 				aberrantAppendField(md2, t.Key(), tagKey, "", "") | ||||
| 				aberrantAppendField(md2, t.Elem(), tagVal, "", "") | ||||
|  | ||||
| 				fd.L1.Message = md2 | ||||
| 				break | ||||
| 			} | ||||
| 			fd.L1.Message = aberrantLoadMessageDescReentrant(t, "") | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type placeholderEnumValues struct { | ||||
| 	protoreflect.EnumValueDescriptors | ||||
| } | ||||
|  | ||||
| func (placeholderEnumValues) ByNumber(n pref.EnumNumber) pref.EnumValueDescriptor { | ||||
| 	return filedesc.PlaceholderEnumValue(pref.FullName(fmt.Sprintf("UNKNOWN_%d", n))) | ||||
| } | ||||
|  | ||||
| // legacyMarshaler is the proto.Marshaler interface superseded by protoiface.Methoder. | ||||
| type legacyMarshaler interface { | ||||
| 	Marshal() ([]byte, error) | ||||
| } | ||||
|  | ||||
| // legacyUnmarshaler is the proto.Unmarshaler interface superseded by protoiface.Methoder. | ||||
| type legacyUnmarshaler interface { | ||||
| 	Unmarshal([]byte) error | ||||
| } | ||||
|  | ||||
| // legacyMerger is the proto.Merger interface superseded by protoiface.Methoder. | ||||
| type legacyMerger interface { | ||||
| 	Merge(protoiface.MessageV1) | ||||
| } | ||||
|  | ||||
| var aberrantProtoMethods = &piface.Methods{ | ||||
| 	Marshal:   legacyMarshal, | ||||
| 	Unmarshal: legacyUnmarshal, | ||||
| 	Merge:     legacyMerge, | ||||
|  | ||||
| 	// We have no way to tell whether the type's Marshal method | ||||
| 	// supports deterministic serialization or not, but this | ||||
| 	// preserves the v1 implementation's behavior of always | ||||
| 	// calling Marshal methods when present. | ||||
| 	Flags: piface.SupportMarshalDeterministic, | ||||
| } | ||||
|  | ||||
| func legacyMarshal(in piface.MarshalInput) (piface.MarshalOutput, error) { | ||||
| 	v := in.Message.(unwrapper).protoUnwrap() | ||||
| 	marshaler, ok := v.(legacyMarshaler) | ||||
| 	if !ok { | ||||
| 		return piface.MarshalOutput{}, errors.New("%T does not implement Marshal", v) | ||||
| 	} | ||||
| 	out, err := marshaler.Marshal() | ||||
| 	if in.Buf != nil { | ||||
| 		out = append(in.Buf, out...) | ||||
| 	} | ||||
| 	return piface.MarshalOutput{ | ||||
| 		Buf: out, | ||||
| 	}, err | ||||
| } | ||||
|  | ||||
| func legacyUnmarshal(in piface.UnmarshalInput) (piface.UnmarshalOutput, error) { | ||||
| 	v := in.Message.(unwrapper).protoUnwrap() | ||||
| 	unmarshaler, ok := v.(legacyUnmarshaler) | ||||
| 	if !ok { | ||||
| 		return piface.UnmarshalOutput{}, errors.New("%T does not implement Unmarshal", v) | ||||
| 	} | ||||
| 	return piface.UnmarshalOutput{}, unmarshaler.Unmarshal(in.Buf) | ||||
| } | ||||
|  | ||||
| func legacyMerge(in piface.MergeInput) piface.MergeOutput { | ||||
| 	// Check whether this supports the legacy merger. | ||||
| 	dstv := in.Destination.(unwrapper).protoUnwrap() | ||||
| 	merger, ok := dstv.(legacyMerger) | ||||
| 	if ok { | ||||
| 		merger.Merge(Export{}.ProtoMessageV1Of(in.Source)) | ||||
| 		return piface.MergeOutput{Flags: piface.MergeComplete} | ||||
| 	} | ||||
|  | ||||
| 	// If legacy merger is unavailable, implement merge in terms of | ||||
| 	// a marshal and unmarshal operation. | ||||
| 	srcv := in.Source.(unwrapper).protoUnwrap() | ||||
| 	marshaler, ok := srcv.(legacyMarshaler) | ||||
| 	if !ok { | ||||
| 		return piface.MergeOutput{} | ||||
| 	} | ||||
| 	dstv = in.Destination.(unwrapper).protoUnwrap() | ||||
| 	unmarshaler, ok := dstv.(legacyUnmarshaler) | ||||
| 	if !ok { | ||||
| 		return piface.MergeOutput{} | ||||
| 	} | ||||
| 	if !in.Source.IsValid() { | ||||
| 		// Legacy Marshal methods may not function on nil messages. | ||||
| 		// Check for a typed nil source only after we confirm that | ||||
| 		// legacy Marshal/Unmarshal methods are present, for | ||||
| 		// consistency. | ||||
| 		return piface.MergeOutput{Flags: piface.MergeComplete} | ||||
| 	} | ||||
| 	b, err := marshaler.Marshal() | ||||
| 	if err != nil { | ||||
| 		return piface.MergeOutput{} | ||||
| 	} | ||||
| 	err = unmarshaler.Unmarshal(b) | ||||
| 	if err != nil { | ||||
| 		return piface.MergeOutput{} | ||||
| 	} | ||||
| 	return piface.MergeOutput{Flags: piface.MergeComplete} | ||||
| } | ||||
|  | ||||
| // aberrantMessageType implements MessageType for all types other than pointer-to-struct. | ||||
| type aberrantMessageType struct { | ||||
| 	t reflect.Type | ||||
| } | ||||
|  | ||||
| func (mt aberrantMessageType) New() pref.Message { | ||||
| 	if mt.t.Kind() == reflect.Ptr { | ||||
| 		return aberrantMessage{reflect.New(mt.t.Elem())} | ||||
| 	} | ||||
| 	return aberrantMessage{reflect.Zero(mt.t)} | ||||
| } | ||||
| func (mt aberrantMessageType) Zero() pref.Message { | ||||
| 	return aberrantMessage{reflect.Zero(mt.t)} | ||||
| } | ||||
| func (mt aberrantMessageType) GoType() reflect.Type { | ||||
| 	return mt.t | ||||
| } | ||||
| func (mt aberrantMessageType) Descriptor() pref.MessageDescriptor { | ||||
| 	return LegacyLoadMessageDesc(mt.t) | ||||
| } | ||||
|  | ||||
| // aberrantMessage implements Message for all types other than pointer-to-struct. | ||||
| // | ||||
| // When the underlying type implements legacyMarshaler or legacyUnmarshaler, | ||||
| // the aberrant Message can be marshaled or unmarshaled. Otherwise, there is | ||||
| // not much that can be done with values of this type. | ||||
| type aberrantMessage struct { | ||||
| 	v reflect.Value | ||||
| } | ||||
|  | ||||
| // Reset implements the v1 proto.Message.Reset method. | ||||
| func (m aberrantMessage) Reset() { | ||||
| 	if mr, ok := m.v.Interface().(interface{ Reset() }); ok { | ||||
| 		mr.Reset() | ||||
| 		return | ||||
| 	} | ||||
| 	if m.v.Kind() == reflect.Ptr && !m.v.IsNil() { | ||||
| 		m.v.Elem().Set(reflect.Zero(m.v.Type().Elem())) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (m aberrantMessage) ProtoReflect() pref.Message { | ||||
| 	return m | ||||
| } | ||||
|  | ||||
| func (m aberrantMessage) Descriptor() pref.MessageDescriptor { | ||||
| 	return LegacyLoadMessageDesc(m.v.Type()) | ||||
| } | ||||
| func (m aberrantMessage) Type() pref.MessageType { | ||||
| 	return aberrantMessageType{m.v.Type()} | ||||
| } | ||||
| func (m aberrantMessage) New() pref.Message { | ||||
| 	if m.v.Type().Kind() == reflect.Ptr { | ||||
| 		return aberrantMessage{reflect.New(m.v.Type().Elem())} | ||||
| 	} | ||||
| 	return aberrantMessage{reflect.Zero(m.v.Type())} | ||||
| } | ||||
| func (m aberrantMessage) Interface() pref.ProtoMessage { | ||||
| 	return m | ||||
| } | ||||
| func (m aberrantMessage) Range(f func(pref.FieldDescriptor, pref.Value) bool) { | ||||
| 	return | ||||
| } | ||||
| func (m aberrantMessage) Has(pref.FieldDescriptor) bool { | ||||
| 	return false | ||||
| } | ||||
| func (m aberrantMessage) Clear(pref.FieldDescriptor) { | ||||
| 	panic("invalid Message.Clear on " + string(m.Descriptor().FullName())) | ||||
| } | ||||
| func (m aberrantMessage) Get(fd pref.FieldDescriptor) pref.Value { | ||||
| 	if fd.Default().IsValid() { | ||||
| 		return fd.Default() | ||||
| 	} | ||||
| 	panic("invalid Message.Get on " + string(m.Descriptor().FullName())) | ||||
| } | ||||
| func (m aberrantMessage) Set(pref.FieldDescriptor, pref.Value) { | ||||
| 	panic("invalid Message.Set on " + string(m.Descriptor().FullName())) | ||||
| } | ||||
| func (m aberrantMessage) Mutable(pref.FieldDescriptor) pref.Value { | ||||
| 	panic("invalid Message.Mutable on " + string(m.Descriptor().FullName())) | ||||
| } | ||||
| func (m aberrantMessage) NewField(pref.FieldDescriptor) pref.Value { | ||||
| 	panic("invalid Message.NewField on " + string(m.Descriptor().FullName())) | ||||
| } | ||||
| func (m aberrantMessage) WhichOneof(pref.OneofDescriptor) pref.FieldDescriptor { | ||||
| 	panic("invalid Message.WhichOneof descriptor on " + string(m.Descriptor().FullName())) | ||||
| } | ||||
| func (m aberrantMessage) GetUnknown() pref.RawFields { | ||||
| 	return nil | ||||
| } | ||||
| func (m aberrantMessage) SetUnknown(pref.RawFields) { | ||||
| 	// SetUnknown discards its input on messages which don't support unknown field storage. | ||||
| } | ||||
| func (m aberrantMessage) IsValid() bool { | ||||
| 	if m.v.Kind() == reflect.Ptr { | ||||
| 		return !m.v.IsNil() | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| func (m aberrantMessage) ProtoMethods() *piface.Methods { | ||||
| 	return aberrantProtoMethods | ||||
| } | ||||
| func (m aberrantMessage) protoUnwrap() interface{} { | ||||
| 	return m.v.Interface() | ||||
| } | ||||
							
								
								
									
										176
									
								
								vendor/google.golang.org/protobuf/internal/impl/merge.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								vendor/google.golang.org/protobuf/internal/impl/merge.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| // Copyright 2020 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
|  | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	piface "google.golang.org/protobuf/runtime/protoiface" | ||||
| ) | ||||
|  | ||||
| type mergeOptions struct{} | ||||
|  | ||||
| func (o mergeOptions) Merge(dst, src proto.Message) { | ||||
| 	proto.Merge(dst, src) | ||||
| } | ||||
|  | ||||
| // merge is protoreflect.Methods.Merge. | ||||
| func (mi *MessageInfo) merge(in piface.MergeInput) piface.MergeOutput { | ||||
| 	dp, ok := mi.getPointer(in.Destination) | ||||
| 	if !ok { | ||||
| 		return piface.MergeOutput{} | ||||
| 	} | ||||
| 	sp, ok := mi.getPointer(in.Source) | ||||
| 	if !ok { | ||||
| 		return piface.MergeOutput{} | ||||
| 	} | ||||
| 	mi.mergePointer(dp, sp, mergeOptions{}) | ||||
| 	return piface.MergeOutput{Flags: piface.MergeComplete} | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) { | ||||
| 	mi.init() | ||||
| 	if dst.IsNil() { | ||||
| 		panic(fmt.Sprintf("invalid value: merging into nil message")) | ||||
| 	} | ||||
| 	if src.IsNil() { | ||||
| 		return | ||||
| 	} | ||||
| 	for _, f := range mi.orderedCoderFields { | ||||
| 		if f.funcs.merge == nil { | ||||
| 			continue | ||||
| 		} | ||||
| 		sfptr := src.Apply(f.offset) | ||||
| 		if f.isPointer && sfptr.Elem().IsNil() { | ||||
| 			continue | ||||
| 		} | ||||
| 		f.funcs.merge(dst.Apply(f.offset), sfptr, f, opts) | ||||
| 	} | ||||
| 	if mi.extensionOffset.IsValid() { | ||||
| 		sext := src.Apply(mi.extensionOffset).Extensions() | ||||
| 		dext := dst.Apply(mi.extensionOffset).Extensions() | ||||
| 		if *dext == nil { | ||||
| 			*dext = make(map[int32]ExtensionField) | ||||
| 		} | ||||
| 		for num, sx := range *sext { | ||||
| 			xt := sx.Type() | ||||
| 			xi := getExtensionFieldInfo(xt) | ||||
| 			if xi.funcs.merge == nil { | ||||
| 				continue | ||||
| 			} | ||||
| 			dx := (*dext)[num] | ||||
| 			var dv pref.Value | ||||
| 			if dx.Type() == sx.Type() { | ||||
| 				dv = dx.Value() | ||||
| 			} | ||||
| 			if !dv.IsValid() && xi.unmarshalNeedsValue { | ||||
| 				dv = xt.New() | ||||
| 			} | ||||
| 			dv = xi.funcs.merge(dv, sx.Value(), opts) | ||||
| 			dx.Set(sx.Type(), dv) | ||||
| 			(*dext)[num] = dx | ||||
| 		} | ||||
| 	} | ||||
| 	if mi.unknownOffset.IsValid() { | ||||
| 		su := mi.getUnknownBytes(src) | ||||
| 		if su != nil && len(*su) > 0 { | ||||
| 			du := mi.mutableUnknownBytes(dst) | ||||
| 			*du = append(*du, *su...) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeScalarValue(dst, src pref.Value, opts mergeOptions) pref.Value { | ||||
| 	return src | ||||
| } | ||||
|  | ||||
| func mergeBytesValue(dst, src pref.Value, opts mergeOptions) pref.Value { | ||||
| 	return pref.ValueOfBytes(append(emptyBuf[:], src.Bytes()...)) | ||||
| } | ||||
|  | ||||
| func mergeListValue(dst, src pref.Value, opts mergeOptions) pref.Value { | ||||
| 	dstl := dst.List() | ||||
| 	srcl := src.List() | ||||
| 	for i, llen := 0, srcl.Len(); i < llen; i++ { | ||||
| 		dstl.Append(srcl.Get(i)) | ||||
| 	} | ||||
| 	return dst | ||||
| } | ||||
|  | ||||
| func mergeBytesListValue(dst, src pref.Value, opts mergeOptions) pref.Value { | ||||
| 	dstl := dst.List() | ||||
| 	srcl := src.List() | ||||
| 	for i, llen := 0, srcl.Len(); i < llen; i++ { | ||||
| 		sb := srcl.Get(i).Bytes() | ||||
| 		db := append(emptyBuf[:], sb...) | ||||
| 		dstl.Append(pref.ValueOfBytes(db)) | ||||
| 	} | ||||
| 	return dst | ||||
| } | ||||
|  | ||||
| func mergeMessageListValue(dst, src pref.Value, opts mergeOptions) pref.Value { | ||||
| 	dstl := dst.List() | ||||
| 	srcl := src.List() | ||||
| 	for i, llen := 0, srcl.Len(); i < llen; i++ { | ||||
| 		sm := srcl.Get(i).Message() | ||||
| 		dm := proto.Clone(sm.Interface()).ProtoReflect() | ||||
| 		dstl.Append(pref.ValueOfMessage(dm)) | ||||
| 	} | ||||
| 	return dst | ||||
| } | ||||
|  | ||||
| func mergeMessageValue(dst, src pref.Value, opts mergeOptions) pref.Value { | ||||
| 	opts.Merge(dst.Message().Interface(), src.Message().Interface()) | ||||
| 	return dst | ||||
| } | ||||
|  | ||||
| func mergeMessage(dst, src pointer, f *coderFieldInfo, opts mergeOptions) { | ||||
| 	if f.mi != nil { | ||||
| 		if dst.Elem().IsNil() { | ||||
| 			dst.SetPointer(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem()))) | ||||
| 		} | ||||
| 		f.mi.mergePointer(dst.Elem(), src.Elem(), opts) | ||||
| 	} else { | ||||
| 		dm := dst.AsValueOf(f.ft).Elem() | ||||
| 		sm := src.AsValueOf(f.ft).Elem() | ||||
| 		if dm.IsNil() { | ||||
| 			dm.Set(reflect.New(f.ft.Elem())) | ||||
| 		} | ||||
| 		opts.Merge(asMessage(dm), asMessage(sm)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeMessageSlice(dst, src pointer, f *coderFieldInfo, opts mergeOptions) { | ||||
| 	for _, sp := range src.PointerSlice() { | ||||
| 		dm := reflect.New(f.ft.Elem().Elem()) | ||||
| 		if f.mi != nil { | ||||
| 			f.mi.mergePointer(pointerOfValue(dm), sp, opts) | ||||
| 		} else { | ||||
| 			opts.Merge(asMessage(dm), asMessage(sp.AsValueOf(f.ft.Elem().Elem()))) | ||||
| 		} | ||||
| 		dst.AppendPointerSlice(pointerOfValue(dm)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeBytes(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	*dst.Bytes() = append(emptyBuf[:], *src.Bytes()...) | ||||
| } | ||||
|  | ||||
| func mergeBytesNoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	v := *src.Bytes() | ||||
| 	if len(v) > 0 { | ||||
| 		*dst.Bytes() = append(emptyBuf[:], v...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeBytesSlice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	ds := dst.BytesSlice() | ||||
| 	for _, v := range *src.BytesSlice() { | ||||
| 		*ds = append(*ds, append(emptyBuf[:], v...)) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										209
									
								
								vendor/google.golang.org/protobuf/internal/impl/merge_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								vendor/google.golang.org/protobuf/internal/impl/merge_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,209 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-types. DO NOT EDIT. | ||||
|  | ||||
| package impl | ||||
|  | ||||
| import () | ||||
|  | ||||
| func mergeBool(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	*dst.Bool() = *src.Bool() | ||||
| } | ||||
|  | ||||
| func mergeBoolNoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	v := *src.Bool() | ||||
| 	if v != false { | ||||
| 		*dst.Bool() = v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeBoolPtr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	p := *src.BoolPtr() | ||||
| 	if p != nil { | ||||
| 		v := *p | ||||
| 		*dst.BoolPtr() = &v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeBoolSlice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	ds := dst.BoolSlice() | ||||
| 	ss := src.BoolSlice() | ||||
| 	*ds = append(*ds, *ss...) | ||||
| } | ||||
|  | ||||
| func mergeInt32(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	*dst.Int32() = *src.Int32() | ||||
| } | ||||
|  | ||||
| func mergeInt32NoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	v := *src.Int32() | ||||
| 	if v != 0 { | ||||
| 		*dst.Int32() = v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeInt32Ptr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	p := *src.Int32Ptr() | ||||
| 	if p != nil { | ||||
| 		v := *p | ||||
| 		*dst.Int32Ptr() = &v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeInt32Slice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	ds := dst.Int32Slice() | ||||
| 	ss := src.Int32Slice() | ||||
| 	*ds = append(*ds, *ss...) | ||||
| } | ||||
|  | ||||
| func mergeUint32(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	*dst.Uint32() = *src.Uint32() | ||||
| } | ||||
|  | ||||
| func mergeUint32NoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	v := *src.Uint32() | ||||
| 	if v != 0 { | ||||
| 		*dst.Uint32() = v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeUint32Ptr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	p := *src.Uint32Ptr() | ||||
| 	if p != nil { | ||||
| 		v := *p | ||||
| 		*dst.Uint32Ptr() = &v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeUint32Slice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	ds := dst.Uint32Slice() | ||||
| 	ss := src.Uint32Slice() | ||||
| 	*ds = append(*ds, *ss...) | ||||
| } | ||||
|  | ||||
| func mergeInt64(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	*dst.Int64() = *src.Int64() | ||||
| } | ||||
|  | ||||
| func mergeInt64NoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	v := *src.Int64() | ||||
| 	if v != 0 { | ||||
| 		*dst.Int64() = v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeInt64Ptr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	p := *src.Int64Ptr() | ||||
| 	if p != nil { | ||||
| 		v := *p | ||||
| 		*dst.Int64Ptr() = &v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeInt64Slice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	ds := dst.Int64Slice() | ||||
| 	ss := src.Int64Slice() | ||||
| 	*ds = append(*ds, *ss...) | ||||
| } | ||||
|  | ||||
| func mergeUint64(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	*dst.Uint64() = *src.Uint64() | ||||
| } | ||||
|  | ||||
| func mergeUint64NoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	v := *src.Uint64() | ||||
| 	if v != 0 { | ||||
| 		*dst.Uint64() = v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeUint64Ptr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	p := *src.Uint64Ptr() | ||||
| 	if p != nil { | ||||
| 		v := *p | ||||
| 		*dst.Uint64Ptr() = &v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeUint64Slice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	ds := dst.Uint64Slice() | ||||
| 	ss := src.Uint64Slice() | ||||
| 	*ds = append(*ds, *ss...) | ||||
| } | ||||
|  | ||||
| func mergeFloat32(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	*dst.Float32() = *src.Float32() | ||||
| } | ||||
|  | ||||
| func mergeFloat32NoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	v := *src.Float32() | ||||
| 	if v != 0 { | ||||
| 		*dst.Float32() = v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeFloat32Ptr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	p := *src.Float32Ptr() | ||||
| 	if p != nil { | ||||
| 		v := *p | ||||
| 		*dst.Float32Ptr() = &v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeFloat32Slice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	ds := dst.Float32Slice() | ||||
| 	ss := src.Float32Slice() | ||||
| 	*ds = append(*ds, *ss...) | ||||
| } | ||||
|  | ||||
| func mergeFloat64(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	*dst.Float64() = *src.Float64() | ||||
| } | ||||
|  | ||||
| func mergeFloat64NoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	v := *src.Float64() | ||||
| 	if v != 0 { | ||||
| 		*dst.Float64() = v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeFloat64Ptr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	p := *src.Float64Ptr() | ||||
| 	if p != nil { | ||||
| 		v := *p | ||||
| 		*dst.Float64Ptr() = &v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeFloat64Slice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	ds := dst.Float64Slice() | ||||
| 	ss := src.Float64Slice() | ||||
| 	*ds = append(*ds, *ss...) | ||||
| } | ||||
|  | ||||
| func mergeString(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	*dst.String() = *src.String() | ||||
| } | ||||
|  | ||||
| func mergeStringNoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	v := *src.String() | ||||
| 	if v != "" { | ||||
| 		*dst.String() = v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeStringPtr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	p := *src.StringPtr() | ||||
| 	if p != nil { | ||||
| 		v := *p | ||||
| 		*dst.StringPtr() = &v | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func mergeStringSlice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) { | ||||
| 	ds := dst.StringSlice() | ||||
| 	ss := src.StringSlice() | ||||
| 	*ds = append(*ds, *ss...) | ||||
| } | ||||
							
								
								
									
										276
									
								
								vendor/google.golang.org/protobuf/internal/impl/message.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										276
									
								
								vendor/google.golang.org/protobuf/internal/impl/message.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,276 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 	"sync/atomic" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	preg "google.golang.org/protobuf/reflect/protoregistry" | ||||
| ) | ||||
|  | ||||
| // MessageInfo provides protobuf related functionality for a given Go type | ||||
| // that represents a message. A given instance of MessageInfo is tied to | ||||
| // exactly one Go type, which must be a pointer to a struct type. | ||||
| // | ||||
| // The exported fields must be populated before any methods are called | ||||
| // and cannot be mutated after set. | ||||
| type MessageInfo struct { | ||||
| 	// GoReflectType is the underlying message Go type and must be populated. | ||||
| 	GoReflectType reflect.Type // pointer to struct | ||||
|  | ||||
| 	// Desc is the underlying message descriptor type and must be populated. | ||||
| 	Desc pref.MessageDescriptor | ||||
|  | ||||
| 	// Exporter must be provided in a purego environment in order to provide | ||||
| 	// access to unexported fields. | ||||
| 	Exporter exporter | ||||
|  | ||||
| 	// OneofWrappers is list of pointers to oneof wrapper struct types. | ||||
| 	OneofWrappers []interface{} | ||||
|  | ||||
| 	initMu   sync.Mutex // protects all unexported fields | ||||
| 	initDone uint32 | ||||
|  | ||||
| 	reflectMessageInfo // for reflection implementation | ||||
| 	coderMessageInfo   // for fast-path method implementations | ||||
| } | ||||
|  | ||||
| // exporter is a function that returns a reference to the ith field of v, | ||||
| // where v is a pointer to a struct. It returns nil if it does not support | ||||
| // exporting the requested field (e.g., already exported). | ||||
| type exporter func(v interface{}, i int) interface{} | ||||
|  | ||||
| // getMessageInfo returns the MessageInfo for any message type that | ||||
| // is generated by our implementation of protoc-gen-go (for v2 and on). | ||||
| // If it is unable to obtain a MessageInfo, it returns nil. | ||||
| func getMessageInfo(mt reflect.Type) *MessageInfo { | ||||
| 	m, ok := reflect.Zero(mt).Interface().(pref.ProtoMessage) | ||||
| 	if !ok { | ||||
| 		return nil | ||||
| 	} | ||||
| 	mr, ok := m.ProtoReflect().(interface{ ProtoMessageInfo() *MessageInfo }) | ||||
| 	if !ok { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return mr.ProtoMessageInfo() | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) init() { | ||||
| 	// This function is called in the hot path. Inline the sync.Once logic, | ||||
| 	// since allocating a closure for Once.Do is expensive. | ||||
| 	// Keep init small to ensure that it can be inlined. | ||||
| 	if atomic.LoadUint32(&mi.initDone) == 0 { | ||||
| 		mi.initOnce() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) initOnce() { | ||||
| 	mi.initMu.Lock() | ||||
| 	defer mi.initMu.Unlock() | ||||
| 	if mi.initDone == 1 { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	t := mi.GoReflectType | ||||
| 	if t.Kind() != reflect.Ptr && t.Elem().Kind() != reflect.Struct { | ||||
| 		panic(fmt.Sprintf("got %v, want *struct kind", t)) | ||||
| 	} | ||||
| 	t = t.Elem() | ||||
|  | ||||
| 	si := mi.makeStructInfo(t) | ||||
| 	mi.makeReflectFuncs(t, si) | ||||
| 	mi.makeCoderMethods(t, si) | ||||
|  | ||||
| 	atomic.StoreUint32(&mi.initDone, 1) | ||||
| } | ||||
|  | ||||
| // getPointer returns the pointer for a message, which should be of | ||||
| // the type of the MessageInfo. If the message is of a different type, | ||||
| // it returns ok==false. | ||||
| func (mi *MessageInfo) getPointer(m pref.Message) (p pointer, ok bool) { | ||||
| 	switch m := m.(type) { | ||||
| 	case *messageState: | ||||
| 		return m.pointer(), m.messageInfo() == mi | ||||
| 	case *messageReflectWrapper: | ||||
| 		return m.pointer(), m.messageInfo() == mi | ||||
| 	} | ||||
| 	return pointer{}, false | ||||
| } | ||||
|  | ||||
| type ( | ||||
| 	SizeCache       = int32 | ||||
| 	WeakFields      = map[int32]protoreflect.ProtoMessage | ||||
| 	UnknownFields   = unknownFieldsA // TODO: switch to unknownFieldsB | ||||
| 	unknownFieldsA  = []byte | ||||
| 	unknownFieldsB  = *[]byte | ||||
| 	ExtensionFields = map[int32]ExtensionField | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	sizecacheType       = reflect.TypeOf(SizeCache(0)) | ||||
| 	weakFieldsType      = reflect.TypeOf(WeakFields(nil)) | ||||
| 	unknownFieldsAType  = reflect.TypeOf(unknownFieldsA(nil)) | ||||
| 	unknownFieldsBType  = reflect.TypeOf(unknownFieldsB(nil)) | ||||
| 	extensionFieldsType = reflect.TypeOf(ExtensionFields(nil)) | ||||
| ) | ||||
|  | ||||
| type structInfo struct { | ||||
| 	sizecacheOffset offset | ||||
| 	sizecacheType   reflect.Type | ||||
| 	weakOffset      offset | ||||
| 	weakType        reflect.Type | ||||
| 	unknownOffset   offset | ||||
| 	unknownType     reflect.Type | ||||
| 	extensionOffset offset | ||||
| 	extensionType   reflect.Type | ||||
|  | ||||
| 	fieldsByNumber        map[pref.FieldNumber]reflect.StructField | ||||
| 	oneofsByName          map[pref.Name]reflect.StructField | ||||
| 	oneofWrappersByType   map[reflect.Type]pref.FieldNumber | ||||
| 	oneofWrappersByNumber map[pref.FieldNumber]reflect.Type | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) makeStructInfo(t reflect.Type) structInfo { | ||||
| 	si := structInfo{ | ||||
| 		sizecacheOffset: invalidOffset, | ||||
| 		weakOffset:      invalidOffset, | ||||
| 		unknownOffset:   invalidOffset, | ||||
| 		extensionOffset: invalidOffset, | ||||
|  | ||||
| 		fieldsByNumber:        map[pref.FieldNumber]reflect.StructField{}, | ||||
| 		oneofsByName:          map[pref.Name]reflect.StructField{}, | ||||
| 		oneofWrappersByType:   map[reflect.Type]pref.FieldNumber{}, | ||||
| 		oneofWrappersByNumber: map[pref.FieldNumber]reflect.Type{}, | ||||
| 	} | ||||
|  | ||||
| fieldLoop: | ||||
| 	for i := 0; i < t.NumField(); i++ { | ||||
| 		switch f := t.Field(i); f.Name { | ||||
| 		case genid.SizeCache_goname, genid.SizeCacheA_goname: | ||||
| 			if f.Type == sizecacheType { | ||||
| 				si.sizecacheOffset = offsetOf(f, mi.Exporter) | ||||
| 				si.sizecacheType = f.Type | ||||
| 			} | ||||
| 		case genid.WeakFields_goname, genid.WeakFieldsA_goname: | ||||
| 			if f.Type == weakFieldsType { | ||||
| 				si.weakOffset = offsetOf(f, mi.Exporter) | ||||
| 				si.weakType = f.Type | ||||
| 			} | ||||
| 		case genid.UnknownFields_goname, genid.UnknownFieldsA_goname: | ||||
| 			if f.Type == unknownFieldsAType || f.Type == unknownFieldsBType { | ||||
| 				si.unknownOffset = offsetOf(f, mi.Exporter) | ||||
| 				si.unknownType = f.Type | ||||
| 			} | ||||
| 		case genid.ExtensionFields_goname, genid.ExtensionFieldsA_goname, genid.ExtensionFieldsB_goname: | ||||
| 			if f.Type == extensionFieldsType { | ||||
| 				si.extensionOffset = offsetOf(f, mi.Exporter) | ||||
| 				si.extensionType = f.Type | ||||
| 			} | ||||
| 		default: | ||||
| 			for _, s := range strings.Split(f.Tag.Get("protobuf"), ",") { | ||||
| 				if len(s) > 0 && strings.Trim(s, "0123456789") == "" { | ||||
| 					n, _ := strconv.ParseUint(s, 10, 64) | ||||
| 					si.fieldsByNumber[pref.FieldNumber(n)] = f | ||||
| 					continue fieldLoop | ||||
| 				} | ||||
| 			} | ||||
| 			if s := f.Tag.Get("protobuf_oneof"); len(s) > 0 { | ||||
| 				si.oneofsByName[pref.Name(s)] = f | ||||
| 				continue fieldLoop | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Derive a mapping of oneof wrappers to fields. | ||||
| 	oneofWrappers := mi.OneofWrappers | ||||
| 	for _, method := range []string{"XXX_OneofFuncs", "XXX_OneofWrappers"} { | ||||
| 		if fn, ok := reflect.PtrTo(t).MethodByName(method); ok { | ||||
| 			for _, v := range fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))}) { | ||||
| 				if vs, ok := v.Interface().([]interface{}); ok { | ||||
| 					oneofWrappers = vs | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	for _, v := range oneofWrappers { | ||||
| 		tf := reflect.TypeOf(v).Elem() | ||||
| 		f := tf.Field(0) | ||||
| 		for _, s := range strings.Split(f.Tag.Get("protobuf"), ",") { | ||||
| 			if len(s) > 0 && strings.Trim(s, "0123456789") == "" { | ||||
| 				n, _ := strconv.ParseUint(s, 10, 64) | ||||
| 				si.oneofWrappersByType[tf] = pref.FieldNumber(n) | ||||
| 				si.oneofWrappersByNumber[pref.FieldNumber(n)] = tf | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return si | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) New() protoreflect.Message { | ||||
| 	return mi.MessageOf(reflect.New(mi.GoReflectType.Elem()).Interface()) | ||||
| } | ||||
| func (mi *MessageInfo) Zero() protoreflect.Message { | ||||
| 	return mi.MessageOf(reflect.Zero(mi.GoReflectType).Interface()) | ||||
| } | ||||
| func (mi *MessageInfo) Descriptor() protoreflect.MessageDescriptor { | ||||
| 	return mi.Desc | ||||
| } | ||||
| func (mi *MessageInfo) Enum(i int) protoreflect.EnumType { | ||||
| 	mi.init() | ||||
| 	fd := mi.Desc.Fields().Get(i) | ||||
| 	return Export{}.EnumTypeOf(mi.fieldTypes[fd.Number()]) | ||||
| } | ||||
| func (mi *MessageInfo) Message(i int) protoreflect.MessageType { | ||||
| 	mi.init() | ||||
| 	fd := mi.Desc.Fields().Get(i) | ||||
| 	switch { | ||||
| 	case fd.IsWeak(): | ||||
| 		mt, _ := preg.GlobalTypes.FindMessageByName(fd.Message().FullName()) | ||||
| 		return mt | ||||
| 	case fd.IsMap(): | ||||
| 		return mapEntryType{fd.Message(), mi.fieldTypes[fd.Number()]} | ||||
| 	default: | ||||
| 		return Export{}.MessageTypeOf(mi.fieldTypes[fd.Number()]) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type mapEntryType struct { | ||||
| 	desc    protoreflect.MessageDescriptor | ||||
| 	valType interface{} // zero value of enum or message type | ||||
| } | ||||
|  | ||||
| func (mt mapEntryType) New() protoreflect.Message { | ||||
| 	return nil | ||||
| } | ||||
| func (mt mapEntryType) Zero() protoreflect.Message { | ||||
| 	return nil | ||||
| } | ||||
| func (mt mapEntryType) Descriptor() protoreflect.MessageDescriptor { | ||||
| 	return mt.desc | ||||
| } | ||||
| func (mt mapEntryType) Enum(i int) protoreflect.EnumType { | ||||
| 	fd := mt.desc.Fields().Get(i) | ||||
| 	if fd.Enum() == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return Export{}.EnumTypeOf(mt.valType) | ||||
| } | ||||
| func (mt mapEntryType) Message(i int) protoreflect.MessageType { | ||||
| 	fd := mt.desc.Fields().Get(i) | ||||
| 	if fd.Message() == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return Export{}.MessageTypeOf(mt.valType) | ||||
| } | ||||
							
								
								
									
										465
									
								
								vendor/google.golang.org/protobuf/internal/impl/message_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										465
									
								
								vendor/google.golang.org/protobuf/internal/impl/message_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,465 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/detrand" | ||||
| 	"google.golang.org/protobuf/internal/pragma" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| type reflectMessageInfo struct { | ||||
| 	fields map[pref.FieldNumber]*fieldInfo | ||||
| 	oneofs map[pref.Name]*oneofInfo | ||||
|  | ||||
| 	// fieldTypes contains the zero value of an enum or message field. | ||||
| 	// For lists, it contains the element type. | ||||
| 	// For maps, it contains the entry value type. | ||||
| 	fieldTypes map[pref.FieldNumber]interface{} | ||||
|  | ||||
| 	// denseFields is a subset of fields where: | ||||
| 	//	0 < fieldDesc.Number() < len(denseFields) | ||||
| 	// It provides faster access to the fieldInfo, but may be incomplete. | ||||
| 	denseFields []*fieldInfo | ||||
|  | ||||
| 	// rangeInfos is a list of all fields (not belonging to a oneof) and oneofs. | ||||
| 	rangeInfos []interface{} // either *fieldInfo or *oneofInfo | ||||
|  | ||||
| 	getUnknown   func(pointer) pref.RawFields | ||||
| 	setUnknown   func(pointer, pref.RawFields) | ||||
| 	extensionMap func(pointer) *extensionMap | ||||
|  | ||||
| 	nilMessage atomicNilMessage | ||||
| } | ||||
|  | ||||
| // makeReflectFuncs generates the set of functions to support reflection. | ||||
| func (mi *MessageInfo) makeReflectFuncs(t reflect.Type, si structInfo) { | ||||
| 	mi.makeKnownFieldsFunc(si) | ||||
| 	mi.makeUnknownFieldsFunc(t, si) | ||||
| 	mi.makeExtensionFieldsFunc(t, si) | ||||
| 	mi.makeFieldTypes(si) | ||||
| } | ||||
|  | ||||
| // makeKnownFieldsFunc generates functions for operations that can be performed | ||||
| // on each protobuf message field. It takes in a reflect.Type representing the | ||||
| // Go struct and matches message fields with struct fields. | ||||
| // | ||||
| // This code assumes that the struct is well-formed and panics if there are | ||||
| // any discrepancies. | ||||
| func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) { | ||||
| 	mi.fields = map[pref.FieldNumber]*fieldInfo{} | ||||
| 	md := mi.Desc | ||||
| 	fds := md.Fields() | ||||
| 	for i := 0; i < fds.Len(); i++ { | ||||
| 		fd := fds.Get(i) | ||||
| 		fs := si.fieldsByNumber[fd.Number()] | ||||
| 		isOneof := fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic() | ||||
| 		if isOneof { | ||||
| 			fs = si.oneofsByName[fd.ContainingOneof().Name()] | ||||
| 		} | ||||
| 		var fi fieldInfo | ||||
| 		switch { | ||||
| 		case fs.Type == nil: | ||||
| 			fi = fieldInfoForMissing(fd) // never occurs for officially generated message types | ||||
| 		case isOneof: | ||||
| 			fi = fieldInfoForOneof(fd, fs, mi.Exporter, si.oneofWrappersByNumber[fd.Number()]) | ||||
| 		case fd.IsMap(): | ||||
| 			fi = fieldInfoForMap(fd, fs, mi.Exporter) | ||||
| 		case fd.IsList(): | ||||
| 			fi = fieldInfoForList(fd, fs, mi.Exporter) | ||||
| 		case fd.IsWeak(): | ||||
| 			fi = fieldInfoForWeakMessage(fd, si.weakOffset) | ||||
| 		case fd.Message() != nil: | ||||
| 			fi = fieldInfoForMessage(fd, fs, mi.Exporter) | ||||
| 		default: | ||||
| 			fi = fieldInfoForScalar(fd, fs, mi.Exporter) | ||||
| 		} | ||||
| 		mi.fields[fd.Number()] = &fi | ||||
| 	} | ||||
|  | ||||
| 	mi.oneofs = map[pref.Name]*oneofInfo{} | ||||
| 	for i := 0; i < md.Oneofs().Len(); i++ { | ||||
| 		od := md.Oneofs().Get(i) | ||||
| 		mi.oneofs[od.Name()] = makeOneofInfo(od, si, mi.Exporter) | ||||
| 	} | ||||
|  | ||||
| 	mi.denseFields = make([]*fieldInfo, fds.Len()*2) | ||||
| 	for i := 0; i < fds.Len(); i++ { | ||||
| 		if fd := fds.Get(i); int(fd.Number()) < len(mi.denseFields) { | ||||
| 			mi.denseFields[fd.Number()] = mi.fields[fd.Number()] | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < fds.Len(); { | ||||
| 		fd := fds.Get(i) | ||||
| 		if od := fd.ContainingOneof(); od != nil && !od.IsSynthetic() { | ||||
| 			mi.rangeInfos = append(mi.rangeInfos, mi.oneofs[od.Name()]) | ||||
| 			i += od.Fields().Len() | ||||
| 		} else { | ||||
| 			mi.rangeInfos = append(mi.rangeInfos, mi.fields[fd.Number()]) | ||||
| 			i++ | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Introduce instability to iteration order, but keep it deterministic. | ||||
| 	if len(mi.rangeInfos) > 1 && detrand.Bool() { | ||||
| 		i := detrand.Intn(len(mi.rangeInfos) - 1) | ||||
| 		mi.rangeInfos[i], mi.rangeInfos[i+1] = mi.rangeInfos[i+1], mi.rangeInfos[i] | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) { | ||||
| 	switch { | ||||
| 	case si.unknownOffset.IsValid() && si.unknownType == unknownFieldsAType: | ||||
| 		// Handle as []byte. | ||||
| 		mi.getUnknown = func(p pointer) pref.RawFields { | ||||
| 			if p.IsNil() { | ||||
| 				return nil | ||||
| 			} | ||||
| 			return *p.Apply(mi.unknownOffset).Bytes() | ||||
| 		} | ||||
| 		mi.setUnknown = func(p pointer, b pref.RawFields) { | ||||
| 			if p.IsNil() { | ||||
| 				panic("invalid SetUnknown on nil Message") | ||||
| 			} | ||||
| 			*p.Apply(mi.unknownOffset).Bytes() = b | ||||
| 		} | ||||
| 	case si.unknownOffset.IsValid() && si.unknownType == unknownFieldsBType: | ||||
| 		// Handle as *[]byte. | ||||
| 		mi.getUnknown = func(p pointer) pref.RawFields { | ||||
| 			if p.IsNil() { | ||||
| 				return nil | ||||
| 			} | ||||
| 			bp := p.Apply(mi.unknownOffset).BytesPtr() | ||||
| 			if *bp == nil { | ||||
| 				return nil | ||||
| 			} | ||||
| 			return **bp | ||||
| 		} | ||||
| 		mi.setUnknown = func(p pointer, b pref.RawFields) { | ||||
| 			if p.IsNil() { | ||||
| 				panic("invalid SetUnknown on nil Message") | ||||
| 			} | ||||
| 			bp := p.Apply(mi.unknownOffset).BytesPtr() | ||||
| 			if *bp == nil { | ||||
| 				*bp = new([]byte) | ||||
| 			} | ||||
| 			**bp = b | ||||
| 		} | ||||
| 	default: | ||||
| 		mi.getUnknown = func(pointer) pref.RawFields { | ||||
| 			return nil | ||||
| 		} | ||||
| 		mi.setUnknown = func(p pointer, _ pref.RawFields) { | ||||
| 			if p.IsNil() { | ||||
| 				panic("invalid SetUnknown on nil Message") | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) makeExtensionFieldsFunc(t reflect.Type, si structInfo) { | ||||
| 	if si.extensionOffset.IsValid() { | ||||
| 		mi.extensionMap = func(p pointer) *extensionMap { | ||||
| 			if p.IsNil() { | ||||
| 				return (*extensionMap)(nil) | ||||
| 			} | ||||
| 			v := p.Apply(si.extensionOffset).AsValueOf(extensionFieldsType) | ||||
| 			return (*extensionMap)(v.Interface().(*map[int32]ExtensionField)) | ||||
| 		} | ||||
| 	} else { | ||||
| 		mi.extensionMap = func(pointer) *extensionMap { | ||||
| 			return (*extensionMap)(nil) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| func (mi *MessageInfo) makeFieldTypes(si structInfo) { | ||||
| 	md := mi.Desc | ||||
| 	fds := md.Fields() | ||||
| 	for i := 0; i < fds.Len(); i++ { | ||||
| 		var ft reflect.Type | ||||
| 		fd := fds.Get(i) | ||||
| 		fs := si.fieldsByNumber[fd.Number()] | ||||
| 		isOneof := fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic() | ||||
| 		if isOneof { | ||||
| 			fs = si.oneofsByName[fd.ContainingOneof().Name()] | ||||
| 		} | ||||
| 		var isMessage bool | ||||
| 		switch { | ||||
| 		case fs.Type == nil: | ||||
| 			continue // never occurs for officially generated message types | ||||
| 		case isOneof: | ||||
| 			if fd.Enum() != nil || fd.Message() != nil { | ||||
| 				ft = si.oneofWrappersByNumber[fd.Number()].Field(0).Type | ||||
| 			} | ||||
| 		case fd.IsMap(): | ||||
| 			if fd.MapValue().Enum() != nil || fd.MapValue().Message() != nil { | ||||
| 				ft = fs.Type.Elem() | ||||
| 			} | ||||
| 			isMessage = fd.MapValue().Message() != nil | ||||
| 		case fd.IsList(): | ||||
| 			if fd.Enum() != nil || fd.Message() != nil { | ||||
| 				ft = fs.Type.Elem() | ||||
| 			} | ||||
| 			isMessage = fd.Message() != nil | ||||
| 		case fd.Enum() != nil: | ||||
| 			ft = fs.Type | ||||
| 			if fd.HasPresence() && ft.Kind() == reflect.Ptr { | ||||
| 				ft = ft.Elem() | ||||
| 			} | ||||
| 		case fd.Message() != nil: | ||||
| 			ft = fs.Type | ||||
| 			if fd.IsWeak() { | ||||
| 				ft = nil | ||||
| 			} | ||||
| 			isMessage = true | ||||
| 		} | ||||
| 		if isMessage && ft != nil && ft.Kind() != reflect.Ptr { | ||||
| 			ft = reflect.PtrTo(ft) // never occurs for officially generated message types | ||||
| 		} | ||||
| 		if ft != nil { | ||||
| 			if mi.fieldTypes == nil { | ||||
| 				mi.fieldTypes = make(map[pref.FieldNumber]interface{}) | ||||
| 			} | ||||
| 			mi.fieldTypes[fd.Number()] = reflect.Zero(ft).Interface() | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type extensionMap map[int32]ExtensionField | ||||
|  | ||||
| func (m *extensionMap) Range(f func(pref.FieldDescriptor, pref.Value) bool) { | ||||
| 	if m != nil { | ||||
| 		for _, x := range *m { | ||||
| 			xd := x.Type().TypeDescriptor() | ||||
| 			v := x.Value() | ||||
| 			if xd.IsList() && v.List().Len() == 0 { | ||||
| 				continue | ||||
| 			} | ||||
| 			if !f(xd, v) { | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| func (m *extensionMap) Has(xt pref.ExtensionType) (ok bool) { | ||||
| 	if m == nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	xd := xt.TypeDescriptor() | ||||
| 	x, ok := (*m)[int32(xd.Number())] | ||||
| 	if !ok { | ||||
| 		return false | ||||
| 	} | ||||
| 	switch { | ||||
| 	case xd.IsList(): | ||||
| 		return x.Value().List().Len() > 0 | ||||
| 	case xd.IsMap(): | ||||
| 		return x.Value().Map().Len() > 0 | ||||
| 	case xd.Message() != nil: | ||||
| 		return x.Value().Message().IsValid() | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
| func (m *extensionMap) Clear(xt pref.ExtensionType) { | ||||
| 	delete(*m, int32(xt.TypeDescriptor().Number())) | ||||
| } | ||||
| func (m *extensionMap) Get(xt pref.ExtensionType) pref.Value { | ||||
| 	xd := xt.TypeDescriptor() | ||||
| 	if m != nil { | ||||
| 		if x, ok := (*m)[int32(xd.Number())]; ok { | ||||
| 			return x.Value() | ||||
| 		} | ||||
| 	} | ||||
| 	return xt.Zero() | ||||
| } | ||||
| func (m *extensionMap) Set(xt pref.ExtensionType, v pref.Value) { | ||||
| 	xd := xt.TypeDescriptor() | ||||
| 	isValid := true | ||||
| 	switch { | ||||
| 	case !xt.IsValidValue(v): | ||||
| 		isValid = false | ||||
| 	case xd.IsList(): | ||||
| 		isValid = v.List().IsValid() | ||||
| 	case xd.IsMap(): | ||||
| 		isValid = v.Map().IsValid() | ||||
| 	case xd.Message() != nil: | ||||
| 		isValid = v.Message().IsValid() | ||||
| 	} | ||||
| 	if !isValid { | ||||
| 		panic(fmt.Sprintf("%v: assigning invalid value", xt.TypeDescriptor().FullName())) | ||||
| 	} | ||||
|  | ||||
| 	if *m == nil { | ||||
| 		*m = make(map[int32]ExtensionField) | ||||
| 	} | ||||
| 	var x ExtensionField | ||||
| 	x.Set(xt, v) | ||||
| 	(*m)[int32(xd.Number())] = x | ||||
| } | ||||
| func (m *extensionMap) Mutable(xt pref.ExtensionType) pref.Value { | ||||
| 	xd := xt.TypeDescriptor() | ||||
| 	if xd.Kind() != pref.MessageKind && xd.Kind() != pref.GroupKind && !xd.IsList() && !xd.IsMap() { | ||||
| 		panic("invalid Mutable on field with non-composite type") | ||||
| 	} | ||||
| 	if x, ok := (*m)[int32(xd.Number())]; ok { | ||||
| 		return x.Value() | ||||
| 	} | ||||
| 	v := xt.New() | ||||
| 	m.Set(xt, v) | ||||
| 	return v | ||||
| } | ||||
|  | ||||
| // MessageState is a data structure that is nested as the first field in a | ||||
| // concrete message. It provides a way to implement the ProtoReflect method | ||||
| // in an allocation-free way without needing to have a shadow Go type generated | ||||
| // for every message type. This technique only works using unsafe. | ||||
| // | ||||
| // | ||||
| // Example generated code: | ||||
| // | ||||
| //	type M struct { | ||||
| //		state protoimpl.MessageState | ||||
| // | ||||
| //		Field1 int32 | ||||
| //		Field2 string | ||||
| //		Field3 *BarMessage | ||||
| //		... | ||||
| //	} | ||||
| // | ||||
| //	func (m *M) ProtoReflect() protoreflect.Message { | ||||
| //		mi := &file_fizz_buzz_proto_msgInfos[5] | ||||
| //		if protoimpl.UnsafeEnabled && m != nil { | ||||
| //			ms := protoimpl.X.MessageStateOf(Pointer(m)) | ||||
| //			if ms.LoadMessageInfo() == nil { | ||||
| //				ms.StoreMessageInfo(mi) | ||||
| //			} | ||||
| //			return ms | ||||
| //		} | ||||
| //		return mi.MessageOf(m) | ||||
| //	} | ||||
| // | ||||
| // The MessageState type holds a *MessageInfo, which must be atomically set to | ||||
| // the message info associated with a given message instance. | ||||
| // By unsafely converting a *M into a *MessageState, the MessageState object | ||||
| // has access to all the information needed to implement protobuf reflection. | ||||
| // It has access to the message info as its first field, and a pointer to the | ||||
| // MessageState is identical to a pointer to the concrete message value. | ||||
| // | ||||
| // | ||||
| // Requirements: | ||||
| //	• The type M must implement protoreflect.ProtoMessage. | ||||
| //	• The address of m must not be nil. | ||||
| //	• The address of m and the address of m.state must be equal, | ||||
| //	even though they are different Go types. | ||||
| type MessageState struct { | ||||
| 	pragma.NoUnkeyedLiterals | ||||
| 	pragma.DoNotCompare | ||||
| 	pragma.DoNotCopy | ||||
|  | ||||
| 	atomicMessageInfo *MessageInfo | ||||
| } | ||||
|  | ||||
| type messageState MessageState | ||||
|  | ||||
| var ( | ||||
| 	_ pref.Message = (*messageState)(nil) | ||||
| 	_ unwrapper    = (*messageState)(nil) | ||||
| ) | ||||
|  | ||||
| // messageDataType is a tuple of a pointer to the message data and | ||||
| // a pointer to the message type. It is a generalized way of providing a | ||||
| // reflective view over a message instance. The disadvantage of this approach | ||||
| // is the need to allocate this tuple of 16B. | ||||
| type messageDataType struct { | ||||
| 	p  pointer | ||||
| 	mi *MessageInfo | ||||
| } | ||||
|  | ||||
| type ( | ||||
| 	messageReflectWrapper messageDataType | ||||
| 	messageIfaceWrapper   messageDataType | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	_ pref.Message      = (*messageReflectWrapper)(nil) | ||||
| 	_ unwrapper         = (*messageReflectWrapper)(nil) | ||||
| 	_ pref.ProtoMessage = (*messageIfaceWrapper)(nil) | ||||
| 	_ unwrapper         = (*messageIfaceWrapper)(nil) | ||||
| ) | ||||
|  | ||||
| // MessageOf returns a reflective view over a message. The input must be a | ||||
| // pointer to a named Go struct. If the provided type has a ProtoReflect method, | ||||
| // it must be implemented by calling this method. | ||||
| func (mi *MessageInfo) MessageOf(m interface{}) pref.Message { | ||||
| 	if reflect.TypeOf(m) != mi.GoReflectType { | ||||
| 		panic(fmt.Sprintf("type mismatch: got %T, want %v", m, mi.GoReflectType)) | ||||
| 	} | ||||
| 	p := pointerOfIface(m) | ||||
| 	if p.IsNil() { | ||||
| 		return mi.nilMessage.Init(mi) | ||||
| 	} | ||||
| 	return &messageReflectWrapper{p, mi} | ||||
| } | ||||
|  | ||||
| func (m *messageReflectWrapper) pointer() pointer          { return m.p } | ||||
| func (m *messageReflectWrapper) messageInfo() *MessageInfo { return m.mi } | ||||
|  | ||||
| // Reset implements the v1 proto.Message.Reset method. | ||||
| func (m *messageIfaceWrapper) Reset() { | ||||
| 	if mr, ok := m.protoUnwrap().(interface{ Reset() }); ok { | ||||
| 		mr.Reset() | ||||
| 		return | ||||
| 	} | ||||
| 	rv := reflect.ValueOf(m.protoUnwrap()) | ||||
| 	if rv.Kind() == reflect.Ptr && !rv.IsNil() { | ||||
| 		rv.Elem().Set(reflect.Zero(rv.Type().Elem())) | ||||
| 	} | ||||
| } | ||||
| func (m *messageIfaceWrapper) ProtoReflect() pref.Message { | ||||
| 	return (*messageReflectWrapper)(m) | ||||
| } | ||||
| func (m *messageIfaceWrapper) protoUnwrap() interface{} { | ||||
| 	return m.p.AsIfaceOf(m.mi.GoReflectType.Elem()) | ||||
| } | ||||
|  | ||||
| // checkField verifies that the provided field descriptor is valid. | ||||
| // Exactly one of the returned values is populated. | ||||
| func (mi *MessageInfo) checkField(fd pref.FieldDescriptor) (*fieldInfo, pref.ExtensionType) { | ||||
| 	var fi *fieldInfo | ||||
| 	if n := fd.Number(); 0 < n && int(n) < len(mi.denseFields) { | ||||
| 		fi = mi.denseFields[n] | ||||
| 	} else { | ||||
| 		fi = mi.fields[n] | ||||
| 	} | ||||
| 	if fi != nil { | ||||
| 		if fi.fieldDesc != fd { | ||||
| 			if got, want := fd.FullName(), fi.fieldDesc.FullName(); got != want { | ||||
| 				panic(fmt.Sprintf("mismatching field: got %v, want %v", got, want)) | ||||
| 			} | ||||
| 			panic(fmt.Sprintf("mismatching field: %v", fd.FullName())) | ||||
| 		} | ||||
| 		return fi, nil | ||||
| 	} | ||||
|  | ||||
| 	if fd.IsExtension() { | ||||
| 		if got, want := fd.ContainingMessage().FullName(), mi.Desc.FullName(); got != want { | ||||
| 			// TODO: Should this be exact containing message descriptor match? | ||||
| 			panic(fmt.Sprintf("extension %v has mismatching containing message: got %v, want %v", fd.FullName(), got, want)) | ||||
| 		} | ||||
| 		if !mi.Desc.ExtensionRanges().Has(fd.Number()) { | ||||
| 			panic(fmt.Sprintf("extension %v extends %v outside the extension range", fd.FullName(), mi.Desc.FullName())) | ||||
| 		} | ||||
| 		xtd, ok := fd.(pref.ExtensionTypeDescriptor) | ||||
| 		if !ok { | ||||
| 			panic(fmt.Sprintf("extension %v does not implement protoreflect.ExtensionTypeDescriptor", fd.FullName())) | ||||
| 		} | ||||
| 		return nil, xtd.Type() | ||||
| 	} | ||||
| 	panic(fmt.Sprintf("field %v is invalid", fd.FullName())) | ||||
| } | ||||
							
								
								
									
										543
									
								
								vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										543
									
								
								vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,543 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"math" | ||||
| 	"reflect" | ||||
| 	"sync" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/flags" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	preg "google.golang.org/protobuf/reflect/protoregistry" | ||||
| ) | ||||
|  | ||||
| type fieldInfo struct { | ||||
| 	fieldDesc pref.FieldDescriptor | ||||
|  | ||||
| 	// These fields are used for protobuf reflection support. | ||||
| 	has        func(pointer) bool | ||||
| 	clear      func(pointer) | ||||
| 	get        func(pointer) pref.Value | ||||
| 	set        func(pointer, pref.Value) | ||||
| 	mutable    func(pointer) pref.Value | ||||
| 	newMessage func() pref.Message | ||||
| 	newField   func() pref.Value | ||||
| } | ||||
|  | ||||
| func fieldInfoForMissing(fd pref.FieldDescriptor) fieldInfo { | ||||
| 	// This never occurs for generated message types. | ||||
| 	// It implies that a hand-crafted type has missing Go fields | ||||
| 	// for specific protobuf message fields. | ||||
| 	return fieldInfo{ | ||||
| 		fieldDesc: fd, | ||||
| 		has: func(p pointer) bool { | ||||
| 			return false | ||||
| 		}, | ||||
| 		clear: func(p pointer) { | ||||
| 			panic("missing Go struct field for " + string(fd.FullName())) | ||||
| 		}, | ||||
| 		get: func(p pointer) pref.Value { | ||||
| 			return fd.Default() | ||||
| 		}, | ||||
| 		set: func(p pointer, v pref.Value) { | ||||
| 			panic("missing Go struct field for " + string(fd.FullName())) | ||||
| 		}, | ||||
| 		mutable: func(p pointer) pref.Value { | ||||
| 			panic("missing Go struct field for " + string(fd.FullName())) | ||||
| 		}, | ||||
| 		newMessage: func() pref.Message { | ||||
| 			panic("missing Go struct field for " + string(fd.FullName())) | ||||
| 		}, | ||||
| 		newField: func() pref.Value { | ||||
| 			if v := fd.Default(); v.IsValid() { | ||||
| 				return v | ||||
| 			} | ||||
| 			panic("missing Go struct field for " + string(fd.FullName())) | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x exporter, ot reflect.Type) fieldInfo { | ||||
| 	ft := fs.Type | ||||
| 	if ft.Kind() != reflect.Interface { | ||||
| 		panic(fmt.Sprintf("field %v has invalid type: got %v, want interface kind", fd.FullName(), ft)) | ||||
| 	} | ||||
| 	if ot.Kind() != reflect.Struct { | ||||
| 		panic(fmt.Sprintf("field %v has invalid type: got %v, want struct kind", fd.FullName(), ot)) | ||||
| 	} | ||||
| 	if !reflect.PtrTo(ot).Implements(ft) { | ||||
| 		panic(fmt.Sprintf("field %v has invalid type: %v does not implement %v", fd.FullName(), ot, ft)) | ||||
| 	} | ||||
| 	conv := NewConverter(ot.Field(0).Type, fd) | ||||
| 	isMessage := fd.Message() != nil | ||||
|  | ||||
| 	// TODO: Implement unsafe fast path? | ||||
| 	fieldOffset := offsetOf(fs, x) | ||||
| 	return fieldInfo{ | ||||
| 		// NOTE: The logic below intentionally assumes that oneof fields are | ||||
| 		// well-formatted. That is, the oneof interface never contains a | ||||
| 		// typed nil pointer to one of the wrapper structs. | ||||
|  | ||||
| 		fieldDesc: fd, | ||||
| 		has: func(p pointer) bool { | ||||
| 			if p.IsNil() { | ||||
| 				return false | ||||
| 			} | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if rv.IsNil() || rv.Elem().Type().Elem() != ot || rv.Elem().IsNil() { | ||||
| 				return false | ||||
| 			} | ||||
| 			return true | ||||
| 		}, | ||||
| 		clear: func(p pointer) { | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if rv.IsNil() || rv.Elem().Type().Elem() != ot { | ||||
| 				// NOTE: We intentionally don't check for rv.Elem().IsNil() | ||||
| 				// so that (*OneofWrapperType)(nil) gets cleared to nil. | ||||
| 				return | ||||
| 			} | ||||
| 			rv.Set(reflect.Zero(rv.Type())) | ||||
| 		}, | ||||
| 		get: func(p pointer) pref.Value { | ||||
| 			if p.IsNil() { | ||||
| 				return conv.Zero() | ||||
| 			} | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if rv.IsNil() || rv.Elem().Type().Elem() != ot || rv.Elem().IsNil() { | ||||
| 				return conv.Zero() | ||||
| 			} | ||||
| 			rv = rv.Elem().Elem().Field(0) | ||||
| 			return conv.PBValueOf(rv) | ||||
| 		}, | ||||
| 		set: func(p pointer, v pref.Value) { | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if rv.IsNil() || rv.Elem().Type().Elem() != ot || rv.Elem().IsNil() { | ||||
| 				rv.Set(reflect.New(ot)) | ||||
| 			} | ||||
| 			rv = rv.Elem().Elem().Field(0) | ||||
| 			rv.Set(conv.GoValueOf(v)) | ||||
| 		}, | ||||
| 		mutable: func(p pointer) pref.Value { | ||||
| 			if !isMessage { | ||||
| 				panic(fmt.Sprintf("field %v with invalid Mutable call on field with non-composite type", fd.FullName())) | ||||
| 			} | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if rv.IsNil() || rv.Elem().Type().Elem() != ot || rv.Elem().IsNil() { | ||||
| 				rv.Set(reflect.New(ot)) | ||||
| 			} | ||||
| 			rv = rv.Elem().Elem().Field(0) | ||||
| 			if rv.Kind() == reflect.Ptr && rv.IsNil() { | ||||
| 				rv.Set(conv.GoValueOf(pref.ValueOfMessage(conv.New().Message()))) | ||||
| 			} | ||||
| 			return conv.PBValueOf(rv) | ||||
| 		}, | ||||
| 		newMessage: func() pref.Message { | ||||
| 			return conv.New().Message() | ||||
| 		}, | ||||
| 		newField: func() pref.Value { | ||||
| 			return conv.New() | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { | ||||
| 	ft := fs.Type | ||||
| 	if ft.Kind() != reflect.Map { | ||||
| 		panic(fmt.Sprintf("field %v has invalid type: got %v, want map kind", fd.FullName(), ft)) | ||||
| 	} | ||||
| 	conv := NewConverter(ft, fd) | ||||
|  | ||||
| 	// TODO: Implement unsafe fast path? | ||||
| 	fieldOffset := offsetOf(fs, x) | ||||
| 	return fieldInfo{ | ||||
| 		fieldDesc: fd, | ||||
| 		has: func(p pointer) bool { | ||||
| 			if p.IsNil() { | ||||
| 				return false | ||||
| 			} | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			return rv.Len() > 0 | ||||
| 		}, | ||||
| 		clear: func(p pointer) { | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			rv.Set(reflect.Zero(rv.Type())) | ||||
| 		}, | ||||
| 		get: func(p pointer) pref.Value { | ||||
| 			if p.IsNil() { | ||||
| 				return conv.Zero() | ||||
| 			} | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if rv.Len() == 0 { | ||||
| 				return conv.Zero() | ||||
| 			} | ||||
| 			return conv.PBValueOf(rv) | ||||
| 		}, | ||||
| 		set: func(p pointer, v pref.Value) { | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			pv := conv.GoValueOf(v) | ||||
| 			if pv.IsNil() { | ||||
| 				panic(fmt.Sprintf("map field %v cannot be set with read-only value", fd.FullName())) | ||||
| 			} | ||||
| 			rv.Set(pv) | ||||
| 		}, | ||||
| 		mutable: func(p pointer) pref.Value { | ||||
| 			v := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if v.IsNil() { | ||||
| 				v.Set(reflect.MakeMap(fs.Type)) | ||||
| 			} | ||||
| 			return conv.PBValueOf(v) | ||||
| 		}, | ||||
| 		newField: func() pref.Value { | ||||
| 			return conv.New() | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { | ||||
| 	ft := fs.Type | ||||
| 	if ft.Kind() != reflect.Slice { | ||||
| 		panic(fmt.Sprintf("field %v has invalid type: got %v, want slice kind", fd.FullName(), ft)) | ||||
| 	} | ||||
| 	conv := NewConverter(reflect.PtrTo(ft), fd) | ||||
|  | ||||
| 	// TODO: Implement unsafe fast path? | ||||
| 	fieldOffset := offsetOf(fs, x) | ||||
| 	return fieldInfo{ | ||||
| 		fieldDesc: fd, | ||||
| 		has: func(p pointer) bool { | ||||
| 			if p.IsNil() { | ||||
| 				return false | ||||
| 			} | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			return rv.Len() > 0 | ||||
| 		}, | ||||
| 		clear: func(p pointer) { | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			rv.Set(reflect.Zero(rv.Type())) | ||||
| 		}, | ||||
| 		get: func(p pointer) pref.Value { | ||||
| 			if p.IsNil() { | ||||
| 				return conv.Zero() | ||||
| 			} | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type) | ||||
| 			if rv.Elem().Len() == 0 { | ||||
| 				return conv.Zero() | ||||
| 			} | ||||
| 			return conv.PBValueOf(rv) | ||||
| 		}, | ||||
| 		set: func(p pointer, v pref.Value) { | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			pv := conv.GoValueOf(v) | ||||
| 			if pv.IsNil() { | ||||
| 				panic(fmt.Sprintf("list field %v cannot be set with read-only value", fd.FullName())) | ||||
| 			} | ||||
| 			rv.Set(pv.Elem()) | ||||
| 		}, | ||||
| 		mutable: func(p pointer) pref.Value { | ||||
| 			v := p.Apply(fieldOffset).AsValueOf(fs.Type) | ||||
| 			return conv.PBValueOf(v) | ||||
| 		}, | ||||
| 		newField: func() pref.Value { | ||||
| 			return conv.New() | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	nilBytes   = reflect.ValueOf([]byte(nil)) | ||||
| 	emptyBytes = reflect.ValueOf([]byte{}) | ||||
| ) | ||||
|  | ||||
| func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { | ||||
| 	ft := fs.Type | ||||
| 	nullable := fd.HasPresence() | ||||
| 	isBytes := ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 | ||||
| 	if nullable { | ||||
| 		if ft.Kind() != reflect.Ptr && ft.Kind() != reflect.Slice { | ||||
| 			// This never occurs for generated message types. | ||||
| 			// Despite the protobuf type system specifying presence, | ||||
| 			// the Go field type cannot represent it. | ||||
| 			nullable = false | ||||
| 		} | ||||
| 		if ft.Kind() == reflect.Ptr { | ||||
| 			ft = ft.Elem() | ||||
| 		} | ||||
| 	} | ||||
| 	conv := NewConverter(ft, fd) | ||||
|  | ||||
| 	// TODO: Implement unsafe fast path? | ||||
| 	fieldOffset := offsetOf(fs, x) | ||||
| 	return fieldInfo{ | ||||
| 		fieldDesc: fd, | ||||
| 		has: func(p pointer) bool { | ||||
| 			if p.IsNil() { | ||||
| 				return false | ||||
| 			} | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if nullable { | ||||
| 				return !rv.IsNil() | ||||
| 			} | ||||
| 			switch rv.Kind() { | ||||
| 			case reflect.Bool: | ||||
| 				return rv.Bool() | ||||
| 			case reflect.Int32, reflect.Int64: | ||||
| 				return rv.Int() != 0 | ||||
| 			case reflect.Uint32, reflect.Uint64: | ||||
| 				return rv.Uint() != 0 | ||||
| 			case reflect.Float32, reflect.Float64: | ||||
| 				return rv.Float() != 0 || math.Signbit(rv.Float()) | ||||
| 			case reflect.String, reflect.Slice: | ||||
| 				return rv.Len() > 0 | ||||
| 			default: | ||||
| 				panic(fmt.Sprintf("field %v has invalid type: %v", fd.FullName(), rv.Type())) // should never happen | ||||
| 			} | ||||
| 		}, | ||||
| 		clear: func(p pointer) { | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			rv.Set(reflect.Zero(rv.Type())) | ||||
| 		}, | ||||
| 		get: func(p pointer) pref.Value { | ||||
| 			if p.IsNil() { | ||||
| 				return conv.Zero() | ||||
| 			} | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if nullable { | ||||
| 				if rv.IsNil() { | ||||
| 					return conv.Zero() | ||||
| 				} | ||||
| 				if rv.Kind() == reflect.Ptr { | ||||
| 					rv = rv.Elem() | ||||
| 				} | ||||
| 			} | ||||
| 			return conv.PBValueOf(rv) | ||||
| 		}, | ||||
| 		set: func(p pointer, v pref.Value) { | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if nullable && rv.Kind() == reflect.Ptr { | ||||
| 				if rv.IsNil() { | ||||
| 					rv.Set(reflect.New(ft)) | ||||
| 				} | ||||
| 				rv = rv.Elem() | ||||
| 			} | ||||
| 			rv.Set(conv.GoValueOf(v)) | ||||
| 			if isBytes && rv.Len() == 0 { | ||||
| 				if nullable { | ||||
| 					rv.Set(emptyBytes) // preserve presence | ||||
| 				} else { | ||||
| 					rv.Set(nilBytes) // do not preserve presence | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		newField: func() pref.Value { | ||||
| 			return conv.New() | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldInfo { | ||||
| 	if !flags.ProtoLegacy { | ||||
| 		panic("no support for proto1 weak fields") | ||||
| 	} | ||||
|  | ||||
| 	var once sync.Once | ||||
| 	var messageType pref.MessageType | ||||
| 	lazyInit := func() { | ||||
| 		once.Do(func() { | ||||
| 			messageName := fd.Message().FullName() | ||||
| 			messageType, _ = preg.GlobalTypes.FindMessageByName(messageName) | ||||
| 			if messageType == nil { | ||||
| 				panic(fmt.Sprintf("weak message %v for field %v is not linked in", messageName, fd.FullName())) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
|  | ||||
| 	num := fd.Number() | ||||
| 	return fieldInfo{ | ||||
| 		fieldDesc: fd, | ||||
| 		has: func(p pointer) bool { | ||||
| 			if p.IsNil() { | ||||
| 				return false | ||||
| 			} | ||||
| 			_, ok := p.Apply(weakOffset).WeakFields().get(num) | ||||
| 			return ok | ||||
| 		}, | ||||
| 		clear: func(p pointer) { | ||||
| 			p.Apply(weakOffset).WeakFields().clear(num) | ||||
| 		}, | ||||
| 		get: func(p pointer) pref.Value { | ||||
| 			lazyInit() | ||||
| 			if p.IsNil() { | ||||
| 				return pref.ValueOfMessage(messageType.Zero()) | ||||
| 			} | ||||
| 			m, ok := p.Apply(weakOffset).WeakFields().get(num) | ||||
| 			if !ok { | ||||
| 				return pref.ValueOfMessage(messageType.Zero()) | ||||
| 			} | ||||
| 			return pref.ValueOfMessage(m.ProtoReflect()) | ||||
| 		}, | ||||
| 		set: func(p pointer, v pref.Value) { | ||||
| 			lazyInit() | ||||
| 			m := v.Message() | ||||
| 			if m.Descriptor() != messageType.Descriptor() { | ||||
| 				if got, want := m.Descriptor().FullName(), messageType.Descriptor().FullName(); got != want { | ||||
| 					panic(fmt.Sprintf("field %v has mismatching message descriptor: got %v, want %v", fd.FullName(), got, want)) | ||||
| 				} | ||||
| 				panic(fmt.Sprintf("field %v has mismatching message descriptor: %v", fd.FullName(), m.Descriptor().FullName())) | ||||
| 			} | ||||
| 			p.Apply(weakOffset).WeakFields().set(num, m.Interface()) | ||||
| 		}, | ||||
| 		mutable: func(p pointer) pref.Value { | ||||
| 			lazyInit() | ||||
| 			fs := p.Apply(weakOffset).WeakFields() | ||||
| 			m, ok := fs.get(num) | ||||
| 			if !ok { | ||||
| 				m = messageType.New().Interface() | ||||
| 				fs.set(num, m) | ||||
| 			} | ||||
| 			return pref.ValueOfMessage(m.ProtoReflect()) | ||||
| 		}, | ||||
| 		newMessage: func() pref.Message { | ||||
| 			lazyInit() | ||||
| 			return messageType.New() | ||||
| 		}, | ||||
| 		newField: func() pref.Value { | ||||
| 			lazyInit() | ||||
| 			return pref.ValueOfMessage(messageType.New()) | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func fieldInfoForMessage(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { | ||||
| 	ft := fs.Type | ||||
| 	conv := NewConverter(ft, fd) | ||||
|  | ||||
| 	// TODO: Implement unsafe fast path? | ||||
| 	fieldOffset := offsetOf(fs, x) | ||||
| 	return fieldInfo{ | ||||
| 		fieldDesc: fd, | ||||
| 		has: func(p pointer) bool { | ||||
| 			if p.IsNil() { | ||||
| 				return false | ||||
| 			} | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if fs.Type.Kind() != reflect.Ptr { | ||||
| 				return !isZero(rv) | ||||
| 			} | ||||
| 			return !rv.IsNil() | ||||
| 		}, | ||||
| 		clear: func(p pointer) { | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			rv.Set(reflect.Zero(rv.Type())) | ||||
| 		}, | ||||
| 		get: func(p pointer) pref.Value { | ||||
| 			if p.IsNil() { | ||||
| 				return conv.Zero() | ||||
| 			} | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			return conv.PBValueOf(rv) | ||||
| 		}, | ||||
| 		set: func(p pointer, v pref.Value) { | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			rv.Set(conv.GoValueOf(v)) | ||||
| 			if fs.Type.Kind() == reflect.Ptr && rv.IsNil() { | ||||
| 				panic(fmt.Sprintf("field %v has invalid nil pointer", fd.FullName())) | ||||
| 			} | ||||
| 		}, | ||||
| 		mutable: func(p pointer) pref.Value { | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if fs.Type.Kind() == reflect.Ptr && rv.IsNil() { | ||||
| 				rv.Set(conv.GoValueOf(conv.New())) | ||||
| 			} | ||||
| 			return conv.PBValueOf(rv) | ||||
| 		}, | ||||
| 		newMessage: func() pref.Message { | ||||
| 			return conv.New().Message() | ||||
| 		}, | ||||
| 		newField: func() pref.Value { | ||||
| 			return conv.New() | ||||
| 		}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type oneofInfo struct { | ||||
| 	oneofDesc pref.OneofDescriptor | ||||
| 	which     func(pointer) pref.FieldNumber | ||||
| } | ||||
|  | ||||
| func makeOneofInfo(od pref.OneofDescriptor, si structInfo, x exporter) *oneofInfo { | ||||
| 	oi := &oneofInfo{oneofDesc: od} | ||||
| 	if od.IsSynthetic() { | ||||
| 		fs := si.fieldsByNumber[od.Fields().Get(0).Number()] | ||||
| 		fieldOffset := offsetOf(fs, x) | ||||
| 		oi.which = func(p pointer) pref.FieldNumber { | ||||
| 			if p.IsNil() { | ||||
| 				return 0 | ||||
| 			} | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if rv.IsNil() { // valid on either *T or []byte | ||||
| 				return 0 | ||||
| 			} | ||||
| 			return od.Fields().Get(0).Number() | ||||
| 		} | ||||
| 	} else { | ||||
| 		fs := si.oneofsByName[od.Name()] | ||||
| 		fieldOffset := offsetOf(fs, x) | ||||
| 		oi.which = func(p pointer) pref.FieldNumber { | ||||
| 			if p.IsNil() { | ||||
| 				return 0 | ||||
| 			} | ||||
| 			rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() | ||||
| 			if rv.IsNil() { | ||||
| 				return 0 | ||||
| 			} | ||||
| 			rv = rv.Elem() | ||||
| 			if rv.IsNil() { | ||||
| 				return 0 | ||||
| 			} | ||||
| 			return si.oneofWrappersByType[rv.Type().Elem()] | ||||
| 		} | ||||
| 	} | ||||
| 	return oi | ||||
| } | ||||
|  | ||||
| // isZero is identical to reflect.Value.IsZero. | ||||
| // TODO: Remove this when Go1.13 is the minimally supported Go version. | ||||
| func isZero(v reflect.Value) bool { | ||||
| 	switch v.Kind() { | ||||
| 	case reflect.Bool: | ||||
| 		return !v.Bool() | ||||
| 	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | ||||
| 		return v.Int() == 0 | ||||
| 	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: | ||||
| 		return v.Uint() == 0 | ||||
| 	case reflect.Float32, reflect.Float64: | ||||
| 		return math.Float64bits(v.Float()) == 0 | ||||
| 	case reflect.Complex64, reflect.Complex128: | ||||
| 		c := v.Complex() | ||||
| 		return math.Float64bits(real(c)) == 0 && math.Float64bits(imag(c)) == 0 | ||||
| 	case reflect.Array: | ||||
| 		for i := 0; i < v.Len(); i++ { | ||||
| 			if !isZero(v.Index(i)) { | ||||
| 				return false | ||||
| 			} | ||||
| 		} | ||||
| 		return true | ||||
| 	case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer: | ||||
| 		return v.IsNil() | ||||
| 	case reflect.String: | ||||
| 		return v.Len() == 0 | ||||
| 	case reflect.Struct: | ||||
| 		for i := 0; i < v.NumField(); i++ { | ||||
| 			if !isZero(v.Field(i)) { | ||||
| 				return false | ||||
| 			} | ||||
| 		} | ||||
| 		return true | ||||
| 	default: | ||||
| 		panic(&reflect.ValueError{"reflect.Value.IsZero", v.Kind()}) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										249
									
								
								vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										249
									
								
								vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,249 @@ | ||||
| // 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. | ||||
|  | ||||
| // Code generated by generate-types. DO NOT EDIT. | ||||
|  | ||||
| package impl | ||||
|  | ||||
| import ( | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	"google.golang.org/protobuf/runtime/protoiface" | ||||
| ) | ||||
|  | ||||
| func (m *messageState) Descriptor() protoreflect.MessageDescriptor { | ||||
| 	return m.messageInfo().Desc | ||||
| } | ||||
| func (m *messageState) Type() protoreflect.MessageType { | ||||
| 	return m.messageInfo() | ||||
| } | ||||
| func (m *messageState) New() protoreflect.Message { | ||||
| 	return m.messageInfo().New() | ||||
| } | ||||
| func (m *messageState) Interface() protoreflect.ProtoMessage { | ||||
| 	return m.protoUnwrap().(protoreflect.ProtoMessage) | ||||
| } | ||||
| func (m *messageState) protoUnwrap() interface{} { | ||||
| 	return m.pointer().AsIfaceOf(m.messageInfo().GoReflectType.Elem()) | ||||
| } | ||||
| func (m *messageState) ProtoMethods() *protoiface.Methods { | ||||
| 	m.messageInfo().init() | ||||
| 	return &m.messageInfo().methods | ||||
| } | ||||
|  | ||||
| // ProtoMessageInfo is a pseudo-internal API for allowing the v1 code | ||||
| // to be able to retrieve a v2 MessageInfo struct. | ||||
| // | ||||
| // WARNING: This method is exempt from the compatibility promise and | ||||
| // may be removed in the future without warning. | ||||
| func (m *messageState) ProtoMessageInfo() *MessageInfo { | ||||
| 	return m.messageInfo() | ||||
| } | ||||
|  | ||||
| func (m *messageState) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { | ||||
| 	m.messageInfo().init() | ||||
| 	for _, ri := range m.messageInfo().rangeInfos { | ||||
| 		switch ri := ri.(type) { | ||||
| 		case *fieldInfo: | ||||
| 			if ri.has(m.pointer()) { | ||||
| 				if !f(ri.fieldDesc, ri.get(m.pointer())) { | ||||
| 					return | ||||
| 				} | ||||
| 			} | ||||
| 		case *oneofInfo: | ||||
| 			if n := ri.which(m.pointer()); n > 0 { | ||||
| 				fi := m.messageInfo().fields[n] | ||||
| 				if !f(fi.fieldDesc, fi.get(m.pointer())) { | ||||
| 					return | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	m.messageInfo().extensionMap(m.pointer()).Range(f) | ||||
| } | ||||
| func (m *messageState) Has(fd protoreflect.FieldDescriptor) bool { | ||||
| 	m.messageInfo().init() | ||||
| 	if fi, xt := m.messageInfo().checkField(fd); fi != nil { | ||||
| 		return fi.has(m.pointer()) | ||||
| 	} else { | ||||
| 		return m.messageInfo().extensionMap(m.pointer()).Has(xt) | ||||
| 	} | ||||
| } | ||||
| func (m *messageState) Clear(fd protoreflect.FieldDescriptor) { | ||||
| 	m.messageInfo().init() | ||||
| 	if fi, xt := m.messageInfo().checkField(fd); fi != nil { | ||||
| 		fi.clear(m.pointer()) | ||||
| 	} else { | ||||
| 		m.messageInfo().extensionMap(m.pointer()).Clear(xt) | ||||
| 	} | ||||
| } | ||||
| func (m *messageState) Get(fd protoreflect.FieldDescriptor) protoreflect.Value { | ||||
| 	m.messageInfo().init() | ||||
| 	if fi, xt := m.messageInfo().checkField(fd); fi != nil { | ||||
| 		return fi.get(m.pointer()) | ||||
| 	} else { | ||||
| 		return m.messageInfo().extensionMap(m.pointer()).Get(xt) | ||||
| 	} | ||||
| } | ||||
| func (m *messageState) Set(fd protoreflect.FieldDescriptor, v protoreflect.Value) { | ||||
| 	m.messageInfo().init() | ||||
| 	if fi, xt := m.messageInfo().checkField(fd); fi != nil { | ||||
| 		fi.set(m.pointer(), v) | ||||
| 	} else { | ||||
| 		m.messageInfo().extensionMap(m.pointer()).Set(xt, v) | ||||
| 	} | ||||
| } | ||||
| func (m *messageState) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { | ||||
| 	m.messageInfo().init() | ||||
| 	if fi, xt := m.messageInfo().checkField(fd); fi != nil { | ||||
| 		return fi.mutable(m.pointer()) | ||||
| 	} else { | ||||
| 		return m.messageInfo().extensionMap(m.pointer()).Mutable(xt) | ||||
| 	} | ||||
| } | ||||
| func (m *messageState) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { | ||||
| 	m.messageInfo().init() | ||||
| 	if fi, xt := m.messageInfo().checkField(fd); fi != nil { | ||||
| 		return fi.newField() | ||||
| 	} else { | ||||
| 		return xt.New() | ||||
| 	} | ||||
| } | ||||
| func (m *messageState) WhichOneof(od protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { | ||||
| 	m.messageInfo().init() | ||||
| 	if oi := m.messageInfo().oneofs[od.Name()]; oi != nil && oi.oneofDesc == od { | ||||
| 		return od.Fields().ByNumber(oi.which(m.pointer())) | ||||
| 	} | ||||
| 	panic("invalid oneof descriptor " + string(od.FullName()) + " for message " + string(m.Descriptor().FullName())) | ||||
| } | ||||
| func (m *messageState) GetUnknown() protoreflect.RawFields { | ||||
| 	m.messageInfo().init() | ||||
| 	return m.messageInfo().getUnknown(m.pointer()) | ||||
| } | ||||
| func (m *messageState) SetUnknown(b protoreflect.RawFields) { | ||||
| 	m.messageInfo().init() | ||||
| 	m.messageInfo().setUnknown(m.pointer(), b) | ||||
| } | ||||
| func (m *messageState) IsValid() bool { | ||||
| 	return !m.pointer().IsNil() | ||||
| } | ||||
|  | ||||
| func (m *messageReflectWrapper) Descriptor() protoreflect.MessageDescriptor { | ||||
| 	return m.messageInfo().Desc | ||||
| } | ||||
| func (m *messageReflectWrapper) Type() protoreflect.MessageType { | ||||
| 	return m.messageInfo() | ||||
| } | ||||
| func (m *messageReflectWrapper) New() protoreflect.Message { | ||||
| 	return m.messageInfo().New() | ||||
| } | ||||
| func (m *messageReflectWrapper) Interface() protoreflect.ProtoMessage { | ||||
| 	if m, ok := m.protoUnwrap().(protoreflect.ProtoMessage); ok { | ||||
| 		return m | ||||
| 	} | ||||
| 	return (*messageIfaceWrapper)(m) | ||||
| } | ||||
| func (m *messageReflectWrapper) protoUnwrap() interface{} { | ||||
| 	return m.pointer().AsIfaceOf(m.messageInfo().GoReflectType.Elem()) | ||||
| } | ||||
| func (m *messageReflectWrapper) ProtoMethods() *protoiface.Methods { | ||||
| 	m.messageInfo().init() | ||||
| 	return &m.messageInfo().methods | ||||
| } | ||||
|  | ||||
| // ProtoMessageInfo is a pseudo-internal API for allowing the v1 code | ||||
| // to be able to retrieve a v2 MessageInfo struct. | ||||
| // | ||||
| // WARNING: This method is exempt from the compatibility promise and | ||||
| // may be removed in the future without warning. | ||||
| func (m *messageReflectWrapper) ProtoMessageInfo() *MessageInfo { | ||||
| 	return m.messageInfo() | ||||
| } | ||||
|  | ||||
| func (m *messageReflectWrapper) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { | ||||
| 	m.messageInfo().init() | ||||
| 	for _, ri := range m.messageInfo().rangeInfos { | ||||
| 		switch ri := ri.(type) { | ||||
| 		case *fieldInfo: | ||||
| 			if ri.has(m.pointer()) { | ||||
| 				if !f(ri.fieldDesc, ri.get(m.pointer())) { | ||||
| 					return | ||||
| 				} | ||||
| 			} | ||||
| 		case *oneofInfo: | ||||
| 			if n := ri.which(m.pointer()); n > 0 { | ||||
| 				fi := m.messageInfo().fields[n] | ||||
| 				if !f(fi.fieldDesc, fi.get(m.pointer())) { | ||||
| 					return | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	m.messageInfo().extensionMap(m.pointer()).Range(f) | ||||
| } | ||||
| func (m *messageReflectWrapper) Has(fd protoreflect.FieldDescriptor) bool { | ||||
| 	m.messageInfo().init() | ||||
| 	if fi, xt := m.messageInfo().checkField(fd); fi != nil { | ||||
| 		return fi.has(m.pointer()) | ||||
| 	} else { | ||||
| 		return m.messageInfo().extensionMap(m.pointer()).Has(xt) | ||||
| 	} | ||||
| } | ||||
| func (m *messageReflectWrapper) Clear(fd protoreflect.FieldDescriptor) { | ||||
| 	m.messageInfo().init() | ||||
| 	if fi, xt := m.messageInfo().checkField(fd); fi != nil { | ||||
| 		fi.clear(m.pointer()) | ||||
| 	} else { | ||||
| 		m.messageInfo().extensionMap(m.pointer()).Clear(xt) | ||||
| 	} | ||||
| } | ||||
| func (m *messageReflectWrapper) Get(fd protoreflect.FieldDescriptor) protoreflect.Value { | ||||
| 	m.messageInfo().init() | ||||
| 	if fi, xt := m.messageInfo().checkField(fd); fi != nil { | ||||
| 		return fi.get(m.pointer()) | ||||
| 	} else { | ||||
| 		return m.messageInfo().extensionMap(m.pointer()).Get(xt) | ||||
| 	} | ||||
| } | ||||
| func (m *messageReflectWrapper) Set(fd protoreflect.FieldDescriptor, v protoreflect.Value) { | ||||
| 	m.messageInfo().init() | ||||
| 	if fi, xt := m.messageInfo().checkField(fd); fi != nil { | ||||
| 		fi.set(m.pointer(), v) | ||||
| 	} else { | ||||
| 		m.messageInfo().extensionMap(m.pointer()).Set(xt, v) | ||||
| 	} | ||||
| } | ||||
| func (m *messageReflectWrapper) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { | ||||
| 	m.messageInfo().init() | ||||
| 	if fi, xt := m.messageInfo().checkField(fd); fi != nil { | ||||
| 		return fi.mutable(m.pointer()) | ||||
| 	} else { | ||||
| 		return m.messageInfo().extensionMap(m.pointer()).Mutable(xt) | ||||
| 	} | ||||
| } | ||||
| func (m *messageReflectWrapper) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { | ||||
| 	m.messageInfo().init() | ||||
| 	if fi, xt := m.messageInfo().checkField(fd); fi != nil { | ||||
| 		return fi.newField() | ||||
| 	} else { | ||||
| 		return xt.New() | ||||
| 	} | ||||
| } | ||||
| func (m *messageReflectWrapper) WhichOneof(od protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { | ||||
| 	m.messageInfo().init() | ||||
| 	if oi := m.messageInfo().oneofs[od.Name()]; oi != nil && oi.oneofDesc == od { | ||||
| 		return od.Fields().ByNumber(oi.which(m.pointer())) | ||||
| 	} | ||||
| 	panic("invalid oneof descriptor " + string(od.FullName()) + " for message " + string(m.Descriptor().FullName())) | ||||
| } | ||||
| func (m *messageReflectWrapper) GetUnknown() protoreflect.RawFields { | ||||
| 	m.messageInfo().init() | ||||
| 	return m.messageInfo().getUnknown(m.pointer()) | ||||
| } | ||||
| func (m *messageReflectWrapper) SetUnknown(b protoreflect.RawFields) { | ||||
| 	m.messageInfo().init() | ||||
| 	m.messageInfo().setUnknown(m.pointer(), b) | ||||
| } | ||||
| func (m *messageReflectWrapper) IsValid() bool { | ||||
| 	return !m.pointer().IsNil() | ||||
| } | ||||
							
								
								
									
										179
									
								
								vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,179 @@ | ||||
| // 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. | ||||
|  | ||||
| //go:build purego || appengine | ||||
| // +build purego appengine | ||||
|  | ||||
| package impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"sync" | ||||
| ) | ||||
|  | ||||
| const UnsafeEnabled = false | ||||
|  | ||||
| // Pointer is an opaque pointer type. | ||||
| type Pointer interface{} | ||||
|  | ||||
| // offset represents the offset to a struct field, accessible from a pointer. | ||||
| // The offset is the field index into a struct. | ||||
| type offset struct { | ||||
| 	index  int | ||||
| 	export exporter | ||||
| } | ||||
|  | ||||
| // offsetOf returns a field offset for the struct field. | ||||
| func offsetOf(f reflect.StructField, x exporter) offset { | ||||
| 	if len(f.Index) != 1 { | ||||
| 		panic("embedded structs are not supported") | ||||
| 	} | ||||
| 	if f.PkgPath == "" { | ||||
| 		return offset{index: f.Index[0]} // field is already exported | ||||
| 	} | ||||
| 	if x == nil { | ||||
| 		panic("exporter must be provided for unexported field") | ||||
| 	} | ||||
| 	return offset{index: f.Index[0], export: x} | ||||
| } | ||||
|  | ||||
| // IsValid reports whether the offset is valid. | ||||
| func (f offset) IsValid() bool { return f.index >= 0 } | ||||
|  | ||||
| // invalidOffset is an invalid field offset. | ||||
| var invalidOffset = offset{index: -1} | ||||
|  | ||||
| // zeroOffset is a noop when calling pointer.Apply. | ||||
| var zeroOffset = offset{index: 0} | ||||
|  | ||||
| // pointer is an abstract representation of a pointer to a struct or field. | ||||
| type pointer struct{ v reflect.Value } | ||||
|  | ||||
| // pointerOf returns p as a pointer. | ||||
| func pointerOf(p Pointer) pointer { | ||||
| 	return pointerOfIface(p) | ||||
| } | ||||
|  | ||||
| // pointerOfValue returns v as a pointer. | ||||
| func pointerOfValue(v reflect.Value) pointer { | ||||
| 	return pointer{v: v} | ||||
| } | ||||
|  | ||||
| // pointerOfIface returns the pointer portion of an interface. | ||||
| func pointerOfIface(v interface{}) pointer { | ||||
| 	return pointer{v: reflect.ValueOf(v)} | ||||
| } | ||||
|  | ||||
| // IsNil reports whether the pointer is nil. | ||||
| func (p pointer) IsNil() bool { | ||||
| 	return p.v.IsNil() | ||||
| } | ||||
|  | ||||
| // Apply adds an offset to the pointer to derive a new pointer | ||||
| // to a specified field. The current pointer must be pointing at a struct. | ||||
| func (p pointer) Apply(f offset) pointer { | ||||
| 	if f.export != nil { | ||||
| 		if v := reflect.ValueOf(f.export(p.v.Interface(), f.index)); v.IsValid() { | ||||
| 			return pointer{v: v} | ||||
| 		} | ||||
| 	} | ||||
| 	return pointer{v: p.v.Elem().Field(f.index).Addr()} | ||||
| } | ||||
|  | ||||
| // AsValueOf treats p as a pointer to an object of type t and returns the value. | ||||
| // It is equivalent to reflect.ValueOf(p.AsIfaceOf(t)) | ||||
| func (p pointer) AsValueOf(t reflect.Type) reflect.Value { | ||||
| 	if got := p.v.Type().Elem(); got != t { | ||||
| 		panic(fmt.Sprintf("invalid type: got %v, want %v", got, t)) | ||||
| 	} | ||||
| 	return p.v | ||||
| } | ||||
|  | ||||
| // AsIfaceOf treats p as a pointer to an object of type t and returns the value. | ||||
| // It is equivalent to p.AsValueOf(t).Interface() | ||||
| func (p pointer) AsIfaceOf(t reflect.Type) interface{} { | ||||
| 	return p.AsValueOf(t).Interface() | ||||
| } | ||||
|  | ||||
| func (p pointer) Bool() *bool              { return p.v.Interface().(*bool) } | ||||
| func (p pointer) BoolPtr() **bool          { return p.v.Interface().(**bool) } | ||||
| func (p pointer) BoolSlice() *[]bool       { return p.v.Interface().(*[]bool) } | ||||
| func (p pointer) Int32() *int32            { return p.v.Interface().(*int32) } | ||||
| func (p pointer) Int32Ptr() **int32        { return p.v.Interface().(**int32) } | ||||
| func (p pointer) Int32Slice() *[]int32     { return p.v.Interface().(*[]int32) } | ||||
| func (p pointer) Int64() *int64            { return p.v.Interface().(*int64) } | ||||
| func (p pointer) Int64Ptr() **int64        { return p.v.Interface().(**int64) } | ||||
| func (p pointer) Int64Slice() *[]int64     { return p.v.Interface().(*[]int64) } | ||||
| func (p pointer) Uint32() *uint32          { return p.v.Interface().(*uint32) } | ||||
| func (p pointer) Uint32Ptr() **uint32      { return p.v.Interface().(**uint32) } | ||||
| func (p pointer) Uint32Slice() *[]uint32   { return p.v.Interface().(*[]uint32) } | ||||
| func (p pointer) Uint64() *uint64          { return p.v.Interface().(*uint64) } | ||||
| func (p pointer) Uint64Ptr() **uint64      { return p.v.Interface().(**uint64) } | ||||
| func (p pointer) Uint64Slice() *[]uint64   { return p.v.Interface().(*[]uint64) } | ||||
| func (p pointer) Float32() *float32        { return p.v.Interface().(*float32) } | ||||
| func (p pointer) Float32Ptr() **float32    { return p.v.Interface().(**float32) } | ||||
| func (p pointer) Float32Slice() *[]float32 { return p.v.Interface().(*[]float32) } | ||||
| func (p pointer) Float64() *float64        { return p.v.Interface().(*float64) } | ||||
| func (p pointer) Float64Ptr() **float64    { return p.v.Interface().(**float64) } | ||||
| func (p pointer) Float64Slice() *[]float64 { return p.v.Interface().(*[]float64) } | ||||
| func (p pointer) String() *string          { return p.v.Interface().(*string) } | ||||
| func (p pointer) StringPtr() **string      { return p.v.Interface().(**string) } | ||||
| func (p pointer) StringSlice() *[]string   { return p.v.Interface().(*[]string) } | ||||
| func (p pointer) Bytes() *[]byte           { return p.v.Interface().(*[]byte) } | ||||
| func (p pointer) BytesPtr() **[]byte       { return p.v.Interface().(**[]byte) } | ||||
| func (p pointer) BytesSlice() *[][]byte    { return p.v.Interface().(*[][]byte) } | ||||
| func (p pointer) WeakFields() *weakFields  { return (*weakFields)(p.v.Interface().(*WeakFields)) } | ||||
| func (p pointer) Extensions() *map[int32]ExtensionField { | ||||
| 	return p.v.Interface().(*map[int32]ExtensionField) | ||||
| } | ||||
|  | ||||
| func (p pointer) Elem() pointer { | ||||
| 	return pointer{v: p.v.Elem()} | ||||
| } | ||||
|  | ||||
| // PointerSlice copies []*T from p as a new []pointer. | ||||
| // This behavior differs from the implementation in pointer_unsafe.go. | ||||
| func (p pointer) PointerSlice() []pointer { | ||||
| 	// TODO: reconsider this | ||||
| 	if p.v.IsNil() { | ||||
| 		return nil | ||||
| 	} | ||||
| 	n := p.v.Elem().Len() | ||||
| 	s := make([]pointer, n) | ||||
| 	for i := 0; i < n; i++ { | ||||
| 		s[i] = pointer{v: p.v.Elem().Index(i)} | ||||
| 	} | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| // AppendPointerSlice appends v to p, which must be a []*T. | ||||
| func (p pointer) AppendPointerSlice(v pointer) { | ||||
| 	sp := p.v.Elem() | ||||
| 	sp.Set(reflect.Append(sp, v.v)) | ||||
| } | ||||
|  | ||||
| // SetPointer sets *p to v. | ||||
| func (p pointer) SetPointer(v pointer) { | ||||
| 	p.v.Elem().Set(v.v) | ||||
| } | ||||
|  | ||||
| func (Export) MessageStateOf(p Pointer) *messageState     { panic("not supported") } | ||||
| func (ms *messageState) pointer() pointer                 { panic("not supported") } | ||||
| func (ms *messageState) messageInfo() *MessageInfo        { panic("not supported") } | ||||
| func (ms *messageState) LoadMessageInfo() *MessageInfo    { panic("not supported") } | ||||
| func (ms *messageState) StoreMessageInfo(mi *MessageInfo) { panic("not supported") } | ||||
|  | ||||
| type atomicNilMessage struct { | ||||
| 	once sync.Once | ||||
| 	m    messageReflectWrapper | ||||
| } | ||||
|  | ||||
| func (m *atomicNilMessage) Init(mi *MessageInfo) *messageReflectWrapper { | ||||
| 	m.once.Do(func() { | ||||
| 		m.m.p = pointerOfIface(reflect.Zero(mi.GoReflectType).Interface()) | ||||
| 		m.m.mi = mi | ||||
| 	}) | ||||
| 	return &m.m | ||||
| } | ||||
							
								
								
									
										175
									
								
								vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,175 @@ | ||||
| // 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. | ||||
|  | ||||
| //go:build !purego && !appengine | ||||
| // +build !purego,!appengine | ||||
|  | ||||
| package impl | ||||
|  | ||||
| import ( | ||||
| 	"reflect" | ||||
| 	"sync/atomic" | ||||
| 	"unsafe" | ||||
| ) | ||||
|  | ||||
| const UnsafeEnabled = true | ||||
|  | ||||
| // Pointer is an opaque pointer type. | ||||
| type Pointer unsafe.Pointer | ||||
|  | ||||
| // offset represents the offset to a struct field, accessible from a pointer. | ||||
| // The offset is the byte offset to the field from the start of the struct. | ||||
| type offset uintptr | ||||
|  | ||||
| // offsetOf returns a field offset for the struct field. | ||||
| func offsetOf(f reflect.StructField, x exporter) offset { | ||||
| 	return offset(f.Offset) | ||||
| } | ||||
|  | ||||
| // IsValid reports whether the offset is valid. | ||||
| func (f offset) IsValid() bool { return f != invalidOffset } | ||||
|  | ||||
| // invalidOffset is an invalid field offset. | ||||
| var invalidOffset = ^offset(0) | ||||
|  | ||||
| // zeroOffset is a noop when calling pointer.Apply. | ||||
| var zeroOffset = offset(0) | ||||
|  | ||||
| // pointer is a pointer to a message struct or field. | ||||
| type pointer struct{ p unsafe.Pointer } | ||||
|  | ||||
| // pointerOf returns p as a pointer. | ||||
| func pointerOf(p Pointer) pointer { | ||||
| 	return pointer{p: unsafe.Pointer(p)} | ||||
| } | ||||
|  | ||||
| // pointerOfValue returns v as a pointer. | ||||
| func pointerOfValue(v reflect.Value) pointer { | ||||
| 	return pointer{p: unsafe.Pointer(v.Pointer())} | ||||
| } | ||||
|  | ||||
| // pointerOfIface returns the pointer portion of an interface. | ||||
| func pointerOfIface(v interface{}) pointer { | ||||
| 	type ifaceHeader struct { | ||||
| 		Type unsafe.Pointer | ||||
| 		Data unsafe.Pointer | ||||
| 	} | ||||
| 	return pointer{p: (*ifaceHeader)(unsafe.Pointer(&v)).Data} | ||||
| } | ||||
|  | ||||
| // IsNil reports whether the pointer is nil. | ||||
| func (p pointer) IsNil() bool { | ||||
| 	return p.p == nil | ||||
| } | ||||
|  | ||||
| // Apply adds an offset to the pointer to derive a new pointer | ||||
| // to a specified field. The pointer must be valid and pointing at a struct. | ||||
| func (p pointer) Apply(f offset) pointer { | ||||
| 	if p.IsNil() { | ||||
| 		panic("invalid nil pointer") | ||||
| 	} | ||||
| 	return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} | ||||
| } | ||||
|  | ||||
| // AsValueOf treats p as a pointer to an object of type t and returns the value. | ||||
| // It is equivalent to reflect.ValueOf(p.AsIfaceOf(t)) | ||||
| func (p pointer) AsValueOf(t reflect.Type) reflect.Value { | ||||
| 	return reflect.NewAt(t, p.p) | ||||
| } | ||||
|  | ||||
| // AsIfaceOf treats p as a pointer to an object of type t and returns the value. | ||||
| // It is equivalent to p.AsValueOf(t).Interface() | ||||
| func (p pointer) AsIfaceOf(t reflect.Type) interface{} { | ||||
| 	// TODO: Use tricky unsafe magic to directly create ifaceHeader. | ||||
| 	return p.AsValueOf(t).Interface() | ||||
| } | ||||
|  | ||||
| func (p pointer) Bool() *bool                           { return (*bool)(p.p) } | ||||
| func (p pointer) BoolPtr() **bool                       { return (**bool)(p.p) } | ||||
| func (p pointer) BoolSlice() *[]bool                    { return (*[]bool)(p.p) } | ||||
| func (p pointer) Int32() *int32                         { return (*int32)(p.p) } | ||||
| func (p pointer) Int32Ptr() **int32                     { return (**int32)(p.p) } | ||||
| func (p pointer) Int32Slice() *[]int32                  { return (*[]int32)(p.p) } | ||||
| func (p pointer) Int64() *int64                         { return (*int64)(p.p) } | ||||
| func (p pointer) Int64Ptr() **int64                     { return (**int64)(p.p) } | ||||
| func (p pointer) Int64Slice() *[]int64                  { return (*[]int64)(p.p) } | ||||
| func (p pointer) Uint32() *uint32                       { return (*uint32)(p.p) } | ||||
| func (p pointer) Uint32Ptr() **uint32                   { return (**uint32)(p.p) } | ||||
| func (p pointer) Uint32Slice() *[]uint32                { return (*[]uint32)(p.p) } | ||||
| func (p pointer) Uint64() *uint64                       { return (*uint64)(p.p) } | ||||
| func (p pointer) Uint64Ptr() **uint64                   { return (**uint64)(p.p) } | ||||
| func (p pointer) Uint64Slice() *[]uint64                { return (*[]uint64)(p.p) } | ||||
| func (p pointer) Float32() *float32                     { return (*float32)(p.p) } | ||||
| func (p pointer) Float32Ptr() **float32                 { return (**float32)(p.p) } | ||||
| func (p pointer) Float32Slice() *[]float32              { return (*[]float32)(p.p) } | ||||
| func (p pointer) Float64() *float64                     { return (*float64)(p.p) } | ||||
| func (p pointer) Float64Ptr() **float64                 { return (**float64)(p.p) } | ||||
| func (p pointer) Float64Slice() *[]float64              { return (*[]float64)(p.p) } | ||||
| func (p pointer) String() *string                       { return (*string)(p.p) } | ||||
| func (p pointer) StringPtr() **string                   { return (**string)(p.p) } | ||||
| func (p pointer) StringSlice() *[]string                { return (*[]string)(p.p) } | ||||
| func (p pointer) Bytes() *[]byte                        { return (*[]byte)(p.p) } | ||||
| func (p pointer) BytesPtr() **[]byte                    { return (**[]byte)(p.p) } | ||||
| func (p pointer) BytesSlice() *[][]byte                 { return (*[][]byte)(p.p) } | ||||
| func (p pointer) WeakFields() *weakFields               { return (*weakFields)(p.p) } | ||||
| func (p pointer) Extensions() *map[int32]ExtensionField { return (*map[int32]ExtensionField)(p.p) } | ||||
|  | ||||
| func (p pointer) Elem() pointer { | ||||
| 	return pointer{p: *(*unsafe.Pointer)(p.p)} | ||||
| } | ||||
|  | ||||
| // PointerSlice loads []*T from p as a []pointer. | ||||
| // The value returned is aliased with the original slice. | ||||
| // This behavior differs from the implementation in pointer_reflect.go. | ||||
| func (p pointer) PointerSlice() []pointer { | ||||
| 	// Super-tricky - p should point to a []*T where T is a | ||||
| 	// message type. We load it as []pointer. | ||||
| 	return *(*[]pointer)(p.p) | ||||
| } | ||||
|  | ||||
| // AppendPointerSlice appends v to p, which must be a []*T. | ||||
| func (p pointer) AppendPointerSlice(v pointer) { | ||||
| 	*(*[]pointer)(p.p) = append(*(*[]pointer)(p.p), v) | ||||
| } | ||||
|  | ||||
| // SetPointer sets *p to v. | ||||
| func (p pointer) SetPointer(v pointer) { | ||||
| 	*(*unsafe.Pointer)(p.p) = (unsafe.Pointer)(v.p) | ||||
| } | ||||
|  | ||||
| // Static check that MessageState does not exceed the size of a pointer. | ||||
| const _ = uint(unsafe.Sizeof(unsafe.Pointer(nil)) - unsafe.Sizeof(MessageState{})) | ||||
|  | ||||
| func (Export) MessageStateOf(p Pointer) *messageState { | ||||
| 	// Super-tricky - see documentation on MessageState. | ||||
| 	return (*messageState)(unsafe.Pointer(p)) | ||||
| } | ||||
| func (ms *messageState) pointer() pointer { | ||||
| 	// Super-tricky - see documentation on MessageState. | ||||
| 	return pointer{p: unsafe.Pointer(ms)} | ||||
| } | ||||
| func (ms *messageState) messageInfo() *MessageInfo { | ||||
| 	mi := ms.LoadMessageInfo() | ||||
| 	if mi == nil { | ||||
| 		panic("invalid nil message info; this suggests memory corruption due to a race or shallow copy on the message struct") | ||||
| 	} | ||||
| 	return mi | ||||
| } | ||||
| func (ms *messageState) LoadMessageInfo() *MessageInfo { | ||||
| 	return (*MessageInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&ms.atomicMessageInfo)))) | ||||
| } | ||||
| func (ms *messageState) StoreMessageInfo(mi *MessageInfo) { | ||||
| 	atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&ms.atomicMessageInfo)), unsafe.Pointer(mi)) | ||||
| } | ||||
|  | ||||
| type atomicNilMessage struct{ p unsafe.Pointer } // p is a *messageReflectWrapper | ||||
|  | ||||
| func (m *atomicNilMessage) Init(mi *MessageInfo) *messageReflectWrapper { | ||||
| 	if p := atomic.LoadPointer(&m.p); p != nil { | ||||
| 		return (*messageReflectWrapper)(p) | ||||
| 	} | ||||
| 	w := &messageReflectWrapper{mi: mi} | ||||
| 	atomic.CompareAndSwapPointer(&m.p, nil, (unsafe.Pointer)(w)) | ||||
| 	return (*messageReflectWrapper)(atomic.LoadPointer(&m.p)) | ||||
| } | ||||
							
								
								
									
										576
									
								
								vendor/google.golang.org/protobuf/internal/impl/validate.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										576
									
								
								vendor/google.golang.org/protobuf/internal/impl/validate.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,576 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"math" | ||||
| 	"math/bits" | ||||
| 	"reflect" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/encoding/messageset" | ||||
| 	"google.golang.org/protobuf/internal/flags" | ||||
| 	"google.golang.org/protobuf/internal/genid" | ||||
| 	"google.golang.org/protobuf/internal/strs" | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	preg "google.golang.org/protobuf/reflect/protoregistry" | ||||
| 	piface "google.golang.org/protobuf/runtime/protoiface" | ||||
| ) | ||||
|  | ||||
| // ValidationStatus is the result of validating the wire-format encoding of a message. | ||||
| type ValidationStatus int | ||||
|  | ||||
| const ( | ||||
| 	// ValidationUnknown indicates that unmarshaling the message might succeed or fail. | ||||
| 	// The validator was unable to render a judgement. | ||||
| 	// | ||||
| 	// The only causes of this status are an aberrant message type appearing somewhere | ||||
| 	// in the message or a failure in the extension resolver. | ||||
| 	ValidationUnknown ValidationStatus = iota + 1 | ||||
|  | ||||
| 	// ValidationInvalid indicates that unmarshaling the message will fail. | ||||
| 	ValidationInvalid | ||||
|  | ||||
| 	// ValidationValid indicates that unmarshaling the message will succeed. | ||||
| 	ValidationValid | ||||
| ) | ||||
|  | ||||
| func (v ValidationStatus) String() string { | ||||
| 	switch v { | ||||
| 	case ValidationUnknown: | ||||
| 		return "ValidationUnknown" | ||||
| 	case ValidationInvalid: | ||||
| 		return "ValidationInvalid" | ||||
| 	case ValidationValid: | ||||
| 		return "ValidationValid" | ||||
| 	default: | ||||
| 		return fmt.Sprintf("ValidationStatus(%d)", int(v)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Validate determines whether the contents of the buffer are a valid wire encoding | ||||
| // of the message type. | ||||
| // | ||||
| // This function is exposed for testing. | ||||
| func Validate(mt pref.MessageType, in piface.UnmarshalInput) (out piface.UnmarshalOutput, _ ValidationStatus) { | ||||
| 	mi, ok := mt.(*MessageInfo) | ||||
| 	if !ok { | ||||
| 		return out, ValidationUnknown | ||||
| 	} | ||||
| 	if in.Resolver == nil { | ||||
| 		in.Resolver = preg.GlobalTypes | ||||
| 	} | ||||
| 	o, st := mi.validate(in.Buf, 0, unmarshalOptions{ | ||||
| 		flags:    in.Flags, | ||||
| 		resolver: in.Resolver, | ||||
| 	}) | ||||
| 	if o.initialized { | ||||
| 		out.Flags |= piface.UnmarshalInitialized | ||||
| 	} | ||||
| 	return out, st | ||||
| } | ||||
|  | ||||
| type validationInfo struct { | ||||
| 	mi               *MessageInfo | ||||
| 	typ              validationType | ||||
| 	keyType, valType validationType | ||||
|  | ||||
| 	// For non-required fields, requiredBit is 0. | ||||
| 	// | ||||
| 	// For required fields, requiredBit's nth bit is set, where n is a | ||||
| 	// unique index in the range [0, MessageInfo.numRequiredFields). | ||||
| 	// | ||||
| 	// If there are more than 64 required fields, requiredBit is 0. | ||||
| 	requiredBit uint64 | ||||
| } | ||||
|  | ||||
| type validationType uint8 | ||||
|  | ||||
| const ( | ||||
| 	validationTypeOther validationType = iota | ||||
| 	validationTypeMessage | ||||
| 	validationTypeGroup | ||||
| 	validationTypeMap | ||||
| 	validationTypeRepeatedVarint | ||||
| 	validationTypeRepeatedFixed32 | ||||
| 	validationTypeRepeatedFixed64 | ||||
| 	validationTypeVarint | ||||
| 	validationTypeFixed32 | ||||
| 	validationTypeFixed64 | ||||
| 	validationTypeBytes | ||||
| 	validationTypeUTF8String | ||||
| 	validationTypeMessageSetItem | ||||
| ) | ||||
|  | ||||
| func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd pref.FieldDescriptor, ft reflect.Type) validationInfo { | ||||
| 	var vi validationInfo | ||||
| 	switch { | ||||
| 	case fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic(): | ||||
| 		switch fd.Kind() { | ||||
| 		case pref.MessageKind: | ||||
| 			vi.typ = validationTypeMessage | ||||
| 			if ot, ok := si.oneofWrappersByNumber[fd.Number()]; ok { | ||||
| 				vi.mi = getMessageInfo(ot.Field(0).Type) | ||||
| 			} | ||||
| 		case pref.GroupKind: | ||||
| 			vi.typ = validationTypeGroup | ||||
| 			if ot, ok := si.oneofWrappersByNumber[fd.Number()]; ok { | ||||
| 				vi.mi = getMessageInfo(ot.Field(0).Type) | ||||
| 			} | ||||
| 		case pref.StringKind: | ||||
| 			if strs.EnforceUTF8(fd) { | ||||
| 				vi.typ = validationTypeUTF8String | ||||
| 			} | ||||
| 		} | ||||
| 	default: | ||||
| 		vi = newValidationInfo(fd, ft) | ||||
| 	} | ||||
| 	if fd.Cardinality() == pref.Required { | ||||
| 		// Avoid overflow. The required field check is done with a 64-bit mask, with | ||||
| 		// any message containing more than 64 required fields always reported as | ||||
| 		// potentially uninitialized, so it is not important to get a precise count | ||||
| 		// of the required fields past 64. | ||||
| 		if mi.numRequiredFields < math.MaxUint8 { | ||||
| 			mi.numRequiredFields++ | ||||
| 			vi.requiredBit = 1 << (mi.numRequiredFields - 1) | ||||
| 		} | ||||
| 	} | ||||
| 	return vi | ||||
| } | ||||
|  | ||||
| func newValidationInfo(fd pref.FieldDescriptor, ft reflect.Type) validationInfo { | ||||
| 	var vi validationInfo | ||||
| 	switch { | ||||
| 	case fd.IsList(): | ||||
| 		switch fd.Kind() { | ||||
| 		case pref.MessageKind: | ||||
| 			vi.typ = validationTypeMessage | ||||
| 			if ft.Kind() == reflect.Slice { | ||||
| 				vi.mi = getMessageInfo(ft.Elem()) | ||||
| 			} | ||||
| 		case pref.GroupKind: | ||||
| 			vi.typ = validationTypeGroup | ||||
| 			if ft.Kind() == reflect.Slice { | ||||
| 				vi.mi = getMessageInfo(ft.Elem()) | ||||
| 			} | ||||
| 		case pref.StringKind: | ||||
| 			vi.typ = validationTypeBytes | ||||
| 			if strs.EnforceUTF8(fd) { | ||||
| 				vi.typ = validationTypeUTF8String | ||||
| 			} | ||||
| 		default: | ||||
| 			switch wireTypes[fd.Kind()] { | ||||
| 			case protowire.VarintType: | ||||
| 				vi.typ = validationTypeRepeatedVarint | ||||
| 			case protowire.Fixed32Type: | ||||
| 				vi.typ = validationTypeRepeatedFixed32 | ||||
| 			case protowire.Fixed64Type: | ||||
| 				vi.typ = validationTypeRepeatedFixed64 | ||||
| 			} | ||||
| 		} | ||||
| 	case fd.IsMap(): | ||||
| 		vi.typ = validationTypeMap | ||||
| 		switch fd.MapKey().Kind() { | ||||
| 		case pref.StringKind: | ||||
| 			if strs.EnforceUTF8(fd) { | ||||
| 				vi.keyType = validationTypeUTF8String | ||||
| 			} | ||||
| 		} | ||||
| 		switch fd.MapValue().Kind() { | ||||
| 		case pref.MessageKind: | ||||
| 			vi.valType = validationTypeMessage | ||||
| 			if ft.Kind() == reflect.Map { | ||||
| 				vi.mi = getMessageInfo(ft.Elem()) | ||||
| 			} | ||||
| 		case pref.StringKind: | ||||
| 			if strs.EnforceUTF8(fd) { | ||||
| 				vi.valType = validationTypeUTF8String | ||||
| 			} | ||||
| 		} | ||||
| 	default: | ||||
| 		switch fd.Kind() { | ||||
| 		case pref.MessageKind: | ||||
| 			vi.typ = validationTypeMessage | ||||
| 			if !fd.IsWeak() { | ||||
| 				vi.mi = getMessageInfo(ft) | ||||
| 			} | ||||
| 		case pref.GroupKind: | ||||
| 			vi.typ = validationTypeGroup | ||||
| 			vi.mi = getMessageInfo(ft) | ||||
| 		case pref.StringKind: | ||||
| 			vi.typ = validationTypeBytes | ||||
| 			if strs.EnforceUTF8(fd) { | ||||
| 				vi.typ = validationTypeUTF8String | ||||
| 			} | ||||
| 		default: | ||||
| 			switch wireTypes[fd.Kind()] { | ||||
| 			case protowire.VarintType: | ||||
| 				vi.typ = validationTypeVarint | ||||
| 			case protowire.Fixed32Type: | ||||
| 				vi.typ = validationTypeFixed32 | ||||
| 			case protowire.Fixed64Type: | ||||
| 				vi.typ = validationTypeFixed64 | ||||
| 			case protowire.BytesType: | ||||
| 				vi.typ = validationTypeBytes | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return vi | ||||
| } | ||||
|  | ||||
| func (mi *MessageInfo) validate(b []byte, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, result ValidationStatus) { | ||||
| 	mi.init() | ||||
| 	type validationState struct { | ||||
| 		typ              validationType | ||||
| 		keyType, valType validationType | ||||
| 		endGroup         protowire.Number | ||||
| 		mi               *MessageInfo | ||||
| 		tail             []byte | ||||
| 		requiredMask     uint64 | ||||
| 	} | ||||
|  | ||||
| 	// Pre-allocate some slots to avoid repeated slice reallocation. | ||||
| 	states := make([]validationState, 0, 16) | ||||
| 	states = append(states, validationState{ | ||||
| 		typ: validationTypeMessage, | ||||
| 		mi:  mi, | ||||
| 	}) | ||||
| 	if groupTag > 0 { | ||||
| 		states[0].typ = validationTypeGroup | ||||
| 		states[0].endGroup = groupTag | ||||
| 	} | ||||
| 	initialized := true | ||||
| 	start := len(b) | ||||
| State: | ||||
| 	for len(states) > 0 { | ||||
| 		st := &states[len(states)-1] | ||||
| 		for len(b) > 0 { | ||||
| 			// Parse the tag (field number and wire type). | ||||
| 			var tag uint64 | ||||
| 			if b[0] < 0x80 { | ||||
| 				tag = uint64(b[0]) | ||||
| 				b = b[1:] | ||||
| 			} else if len(b) >= 2 && b[1] < 128 { | ||||
| 				tag = uint64(b[0]&0x7f) + uint64(b[1])<<7 | ||||
| 				b = b[2:] | ||||
| 			} else { | ||||
| 				var n int | ||||
| 				tag, n = protowire.ConsumeVarint(b) | ||||
| 				if n < 0 { | ||||
| 					return out, ValidationInvalid | ||||
| 				} | ||||
| 				b = b[n:] | ||||
| 			} | ||||
| 			var num protowire.Number | ||||
| 			if n := tag >> 3; n < uint64(protowire.MinValidNumber) || n > uint64(protowire.MaxValidNumber) { | ||||
| 				return out, ValidationInvalid | ||||
| 			} else { | ||||
| 				num = protowire.Number(n) | ||||
| 			} | ||||
| 			wtyp := protowire.Type(tag & 7) | ||||
|  | ||||
| 			if wtyp == protowire.EndGroupType { | ||||
| 				if st.endGroup == num { | ||||
| 					goto PopState | ||||
| 				} | ||||
| 				return out, ValidationInvalid | ||||
| 			} | ||||
| 			var vi validationInfo | ||||
| 			switch { | ||||
| 			case st.typ == validationTypeMap: | ||||
| 				switch num { | ||||
| 				case genid.MapEntry_Key_field_number: | ||||
| 					vi.typ = st.keyType | ||||
| 				case genid.MapEntry_Value_field_number: | ||||
| 					vi.typ = st.valType | ||||
| 					vi.mi = st.mi | ||||
| 					vi.requiredBit = 1 | ||||
| 				} | ||||
| 			case flags.ProtoLegacy && st.mi.isMessageSet: | ||||
| 				switch num { | ||||
| 				case messageset.FieldItem: | ||||
| 					vi.typ = validationTypeMessageSetItem | ||||
| 				} | ||||
| 			default: | ||||
| 				var f *coderFieldInfo | ||||
| 				if int(num) < len(st.mi.denseCoderFields) { | ||||
| 					f = st.mi.denseCoderFields[num] | ||||
| 				} else { | ||||
| 					f = st.mi.coderFields[num] | ||||
| 				} | ||||
| 				if f != nil { | ||||
| 					vi = f.validation | ||||
| 					if vi.typ == validationTypeMessage && vi.mi == nil { | ||||
| 						// Probable weak field. | ||||
| 						// | ||||
| 						// TODO: Consider storing the results of this lookup somewhere | ||||
| 						// rather than recomputing it on every validation. | ||||
| 						fd := st.mi.Desc.Fields().ByNumber(num) | ||||
| 						if fd == nil || !fd.IsWeak() { | ||||
| 							break | ||||
| 						} | ||||
| 						messageName := fd.Message().FullName() | ||||
| 						messageType, err := preg.GlobalTypes.FindMessageByName(messageName) | ||||
| 						switch err { | ||||
| 						case nil: | ||||
| 							vi.mi, _ = messageType.(*MessageInfo) | ||||
| 						case preg.NotFound: | ||||
| 							vi.typ = validationTypeBytes | ||||
| 						default: | ||||
| 							return out, ValidationUnknown | ||||
| 						} | ||||
| 					} | ||||
| 					break | ||||
| 				} | ||||
| 				// Possible extension field. | ||||
| 				// | ||||
| 				// TODO: We should return ValidationUnknown when: | ||||
| 				//   1. The resolver is not frozen. (More extensions may be added to it.) | ||||
| 				//   2. The resolver returns preg.NotFound. | ||||
| 				// In this case, a type added to the resolver in the future could cause | ||||
| 				// unmarshaling to begin failing. Supporting this requires some way to | ||||
| 				// determine if the resolver is frozen. | ||||
| 				xt, err := opts.resolver.FindExtensionByNumber(st.mi.Desc.FullName(), num) | ||||
| 				if err != nil && err != preg.NotFound { | ||||
| 					return out, ValidationUnknown | ||||
| 				} | ||||
| 				if err == nil { | ||||
| 					vi = getExtensionFieldInfo(xt).validation | ||||
| 				} | ||||
| 			} | ||||
| 			if vi.requiredBit != 0 { | ||||
| 				// Check that the field has a compatible wire type. | ||||
| 				// We only need to consider non-repeated field types, | ||||
| 				// since repeated fields (and maps) can never be required. | ||||
| 				ok := false | ||||
| 				switch vi.typ { | ||||
| 				case validationTypeVarint: | ||||
| 					ok = wtyp == protowire.VarintType | ||||
| 				case validationTypeFixed32: | ||||
| 					ok = wtyp == protowire.Fixed32Type | ||||
| 				case validationTypeFixed64: | ||||
| 					ok = wtyp == protowire.Fixed64Type | ||||
| 				case validationTypeBytes, validationTypeUTF8String, validationTypeMessage: | ||||
| 					ok = wtyp == protowire.BytesType | ||||
| 				case validationTypeGroup: | ||||
| 					ok = wtyp == protowire.StartGroupType | ||||
| 				} | ||||
| 				if ok { | ||||
| 					st.requiredMask |= vi.requiredBit | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			switch wtyp { | ||||
| 			case protowire.VarintType: | ||||
| 				if len(b) >= 10 { | ||||
| 					switch { | ||||
| 					case b[0] < 0x80: | ||||
| 						b = b[1:] | ||||
| 					case b[1] < 0x80: | ||||
| 						b = b[2:] | ||||
| 					case b[2] < 0x80: | ||||
| 						b = b[3:] | ||||
| 					case b[3] < 0x80: | ||||
| 						b = b[4:] | ||||
| 					case b[4] < 0x80: | ||||
| 						b = b[5:] | ||||
| 					case b[5] < 0x80: | ||||
| 						b = b[6:] | ||||
| 					case b[6] < 0x80: | ||||
| 						b = b[7:] | ||||
| 					case b[7] < 0x80: | ||||
| 						b = b[8:] | ||||
| 					case b[8] < 0x80: | ||||
| 						b = b[9:] | ||||
| 					case b[9] < 0x80 && b[9] < 2: | ||||
| 						b = b[10:] | ||||
| 					default: | ||||
| 						return out, ValidationInvalid | ||||
| 					} | ||||
| 				} else { | ||||
| 					switch { | ||||
| 					case len(b) > 0 && b[0] < 0x80: | ||||
| 						b = b[1:] | ||||
| 					case len(b) > 1 && b[1] < 0x80: | ||||
| 						b = b[2:] | ||||
| 					case len(b) > 2 && b[2] < 0x80: | ||||
| 						b = b[3:] | ||||
| 					case len(b) > 3 && b[3] < 0x80: | ||||
| 						b = b[4:] | ||||
| 					case len(b) > 4 && b[4] < 0x80: | ||||
| 						b = b[5:] | ||||
| 					case len(b) > 5 && b[5] < 0x80: | ||||
| 						b = b[6:] | ||||
| 					case len(b) > 6 && b[6] < 0x80: | ||||
| 						b = b[7:] | ||||
| 					case len(b) > 7 && b[7] < 0x80: | ||||
| 						b = b[8:] | ||||
| 					case len(b) > 8 && b[8] < 0x80: | ||||
| 						b = b[9:] | ||||
| 					case len(b) > 9 && b[9] < 2: | ||||
| 						b = b[10:] | ||||
| 					default: | ||||
| 						return out, ValidationInvalid | ||||
| 					} | ||||
| 				} | ||||
| 				continue State | ||||
| 			case protowire.BytesType: | ||||
| 				var size uint64 | ||||
| 				if len(b) >= 1 && b[0] < 0x80 { | ||||
| 					size = uint64(b[0]) | ||||
| 					b = b[1:] | ||||
| 				} else if len(b) >= 2 && b[1] < 128 { | ||||
| 					size = uint64(b[0]&0x7f) + uint64(b[1])<<7 | ||||
| 					b = b[2:] | ||||
| 				} else { | ||||
| 					var n int | ||||
| 					size, n = protowire.ConsumeVarint(b) | ||||
| 					if n < 0 { | ||||
| 						return out, ValidationInvalid | ||||
| 					} | ||||
| 					b = b[n:] | ||||
| 				} | ||||
| 				if size > uint64(len(b)) { | ||||
| 					return out, ValidationInvalid | ||||
| 				} | ||||
| 				v := b[:size] | ||||
| 				b = b[size:] | ||||
| 				switch vi.typ { | ||||
| 				case validationTypeMessage: | ||||
| 					if vi.mi == nil { | ||||
| 						return out, ValidationUnknown | ||||
| 					} | ||||
| 					vi.mi.init() | ||||
| 					fallthrough | ||||
| 				case validationTypeMap: | ||||
| 					if vi.mi != nil { | ||||
| 						vi.mi.init() | ||||
| 					} | ||||
| 					states = append(states, validationState{ | ||||
| 						typ:     vi.typ, | ||||
| 						keyType: vi.keyType, | ||||
| 						valType: vi.valType, | ||||
| 						mi:      vi.mi, | ||||
| 						tail:    b, | ||||
| 					}) | ||||
| 					b = v | ||||
| 					continue State | ||||
| 				case validationTypeRepeatedVarint: | ||||
| 					// Packed field. | ||||
| 					for len(v) > 0 { | ||||
| 						_, n := protowire.ConsumeVarint(v) | ||||
| 						if n < 0 { | ||||
| 							return out, ValidationInvalid | ||||
| 						} | ||||
| 						v = v[n:] | ||||
| 					} | ||||
| 				case validationTypeRepeatedFixed32: | ||||
| 					// Packed field. | ||||
| 					if len(v)%4 != 0 { | ||||
| 						return out, ValidationInvalid | ||||
| 					} | ||||
| 				case validationTypeRepeatedFixed64: | ||||
| 					// Packed field. | ||||
| 					if len(v)%8 != 0 { | ||||
| 						return out, ValidationInvalid | ||||
| 					} | ||||
| 				case validationTypeUTF8String: | ||||
| 					if !utf8.Valid(v) { | ||||
| 						return out, ValidationInvalid | ||||
| 					} | ||||
| 				} | ||||
| 			case protowire.Fixed32Type: | ||||
| 				if len(b) < 4 { | ||||
| 					return out, ValidationInvalid | ||||
| 				} | ||||
| 				b = b[4:] | ||||
| 			case protowire.Fixed64Type: | ||||
| 				if len(b) < 8 { | ||||
| 					return out, ValidationInvalid | ||||
| 				} | ||||
| 				b = b[8:] | ||||
| 			case protowire.StartGroupType: | ||||
| 				switch { | ||||
| 				case vi.typ == validationTypeGroup: | ||||
| 					if vi.mi == nil { | ||||
| 						return out, ValidationUnknown | ||||
| 					} | ||||
| 					vi.mi.init() | ||||
| 					states = append(states, validationState{ | ||||
| 						typ:      validationTypeGroup, | ||||
| 						mi:       vi.mi, | ||||
| 						endGroup: num, | ||||
| 					}) | ||||
| 					continue State | ||||
| 				case flags.ProtoLegacy && vi.typ == validationTypeMessageSetItem: | ||||
| 					typeid, v, n, err := messageset.ConsumeFieldValue(b, false) | ||||
| 					if err != nil { | ||||
| 						return out, ValidationInvalid | ||||
| 					} | ||||
| 					xt, err := opts.resolver.FindExtensionByNumber(st.mi.Desc.FullName(), typeid) | ||||
| 					switch { | ||||
| 					case err == preg.NotFound: | ||||
| 						b = b[n:] | ||||
| 					case err != nil: | ||||
| 						return out, ValidationUnknown | ||||
| 					default: | ||||
| 						xvi := getExtensionFieldInfo(xt).validation | ||||
| 						if xvi.mi != nil { | ||||
| 							xvi.mi.init() | ||||
| 						} | ||||
| 						states = append(states, validationState{ | ||||
| 							typ:  xvi.typ, | ||||
| 							mi:   xvi.mi, | ||||
| 							tail: b[n:], | ||||
| 						}) | ||||
| 						b = v | ||||
| 						continue State | ||||
| 					} | ||||
| 				default: | ||||
| 					n := protowire.ConsumeFieldValue(num, wtyp, b) | ||||
| 					if n < 0 { | ||||
| 						return out, ValidationInvalid | ||||
| 					} | ||||
| 					b = b[n:] | ||||
| 				} | ||||
| 			default: | ||||
| 				return out, ValidationInvalid | ||||
| 			} | ||||
| 		} | ||||
| 		if st.endGroup != 0 { | ||||
| 			return out, ValidationInvalid | ||||
| 		} | ||||
| 		if len(b) != 0 { | ||||
| 			return out, ValidationInvalid | ||||
| 		} | ||||
| 		b = st.tail | ||||
| 	PopState: | ||||
| 		numRequiredFields := 0 | ||||
| 		switch st.typ { | ||||
| 		case validationTypeMessage, validationTypeGroup: | ||||
| 			numRequiredFields = int(st.mi.numRequiredFields) | ||||
| 		case validationTypeMap: | ||||
| 			// If this is a map field with a message value that contains | ||||
| 			// required fields, require that the value be present. | ||||
| 			if st.mi != nil && st.mi.numRequiredFields > 0 { | ||||
| 				numRequiredFields = 1 | ||||
| 			} | ||||
| 		} | ||||
| 		// If there are more than 64 required fields, this check will | ||||
| 		// always fail and we will report that the message is potentially | ||||
| 		// uninitialized. | ||||
| 		if numRequiredFields > 0 && bits.OnesCount64(st.requiredMask) != numRequiredFields { | ||||
| 			initialized = false | ||||
| 		} | ||||
| 		states = states[:len(states)-1] | ||||
| 	} | ||||
| 	out.n = start - len(b) | ||||
| 	if initialized { | ||||
| 		out.initialized = true | ||||
| 	} | ||||
| 	return out, ValidationValid | ||||
| } | ||||
							
								
								
									
										74
									
								
								vendor/google.golang.org/protobuf/internal/impl/weak.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								vendor/google.golang.org/protobuf/internal/impl/weak.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| // 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 impl | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| 	"google.golang.org/protobuf/reflect/protoregistry" | ||||
| ) | ||||
|  | ||||
| // weakFields adds methods to the exported WeakFields type for internal use. | ||||
| // | ||||
| // The exported type is an alias to an unnamed type, so methods can't be | ||||
| // defined directly on it. | ||||
| type weakFields WeakFields | ||||
|  | ||||
| func (w weakFields) get(num pref.FieldNumber) (pref.ProtoMessage, bool) { | ||||
| 	m, ok := w[int32(num)] | ||||
| 	return m, ok | ||||
| } | ||||
|  | ||||
| func (w *weakFields) set(num pref.FieldNumber, m pref.ProtoMessage) { | ||||
| 	if *w == nil { | ||||
| 		*w = make(weakFields) | ||||
| 	} | ||||
| 	(*w)[int32(num)] = m | ||||
| } | ||||
|  | ||||
| func (w *weakFields) clear(num pref.FieldNumber) { | ||||
| 	delete(*w, int32(num)) | ||||
| } | ||||
|  | ||||
| func (Export) HasWeak(w WeakFields, num pref.FieldNumber) bool { | ||||
| 	_, ok := w[int32(num)] | ||||
| 	return ok | ||||
| } | ||||
|  | ||||
| func (Export) ClearWeak(w *WeakFields, num pref.FieldNumber) { | ||||
| 	delete(*w, int32(num)) | ||||
| } | ||||
|  | ||||
| func (Export) GetWeak(w WeakFields, num pref.FieldNumber, name pref.FullName) pref.ProtoMessage { | ||||
| 	if m, ok := w[int32(num)]; ok { | ||||
| 		return m | ||||
| 	} | ||||
| 	mt, _ := protoregistry.GlobalTypes.FindMessageByName(name) | ||||
| 	if mt == nil { | ||||
| 		panic(fmt.Sprintf("message %v for weak field is not linked in", name)) | ||||
| 	} | ||||
| 	return mt.Zero().Interface() | ||||
| } | ||||
|  | ||||
| func (Export) SetWeak(w *WeakFields, num pref.FieldNumber, name pref.FullName, m pref.ProtoMessage) { | ||||
| 	if m != nil { | ||||
| 		mt, _ := protoregistry.GlobalTypes.FindMessageByName(name) | ||||
| 		if mt == nil { | ||||
| 			panic(fmt.Sprintf("message %v for weak field is not linked in", name)) | ||||
| 		} | ||||
| 		if mt != m.ProtoReflect().Type() { | ||||
| 			panic(fmt.Sprintf("invalid message type for weak field: got %T, want %T", m, mt.Zero().Interface())) | ||||
| 		} | ||||
| 	} | ||||
| 	if m == nil || !m.ProtoReflect().IsValid() { | ||||
| 		delete(*w, int32(num)) | ||||
| 		return | ||||
| 	} | ||||
| 	if *w == nil { | ||||
| 		*w = make(weakFields) | ||||
| 	} | ||||
| 	(*w)[int32(num)] = m | ||||
| } | ||||
							
								
								
									
										89
									
								
								vendor/google.golang.org/protobuf/internal/order/order.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								vendor/google.golang.org/protobuf/internal/order/order.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| // Copyright 2020 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 order | ||||
|  | ||||
| import ( | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| // FieldOrder specifies the ordering to visit message fields. | ||||
| // It is a function that reports whether x is ordered before y. | ||||
| type FieldOrder func(x, y pref.FieldDescriptor) bool | ||||
|  | ||||
| var ( | ||||
| 	// AnyFieldOrder specifies no specific field ordering. | ||||
| 	AnyFieldOrder FieldOrder = nil | ||||
|  | ||||
| 	// LegacyFieldOrder sorts fields in the same ordering as emitted by | ||||
| 	// wire serialization in the github.com/golang/protobuf implementation. | ||||
| 	LegacyFieldOrder FieldOrder = func(x, y pref.FieldDescriptor) bool { | ||||
| 		ox, oy := x.ContainingOneof(), y.ContainingOneof() | ||||
| 		inOneof := func(od pref.OneofDescriptor) bool { | ||||
| 			return od != nil && !od.IsSynthetic() | ||||
| 		} | ||||
|  | ||||
| 		// Extension fields sort before non-extension fields. | ||||
| 		if x.IsExtension() != y.IsExtension() { | ||||
| 			return x.IsExtension() && !y.IsExtension() | ||||
| 		} | ||||
| 		// Fields not within a oneof sort before those within a oneof. | ||||
| 		if inOneof(ox) != inOneof(oy) { | ||||
| 			return !inOneof(ox) && inOneof(oy) | ||||
| 		} | ||||
| 		// Fields in disjoint oneof sets are sorted by declaration index. | ||||
| 		if ox != nil && oy != nil && ox != oy { | ||||
| 			return ox.Index() < oy.Index() | ||||
| 		} | ||||
| 		// Fields sorted by field number. | ||||
| 		return x.Number() < y.Number() | ||||
| 	} | ||||
|  | ||||
| 	// NumberFieldOrder sorts fields by their field number. | ||||
| 	NumberFieldOrder FieldOrder = func(x, y pref.FieldDescriptor) bool { | ||||
| 		return x.Number() < y.Number() | ||||
| 	} | ||||
|  | ||||
| 	// IndexNameFieldOrder sorts non-extension fields before extension fields. | ||||
| 	// Non-extensions are sorted according to their declaration index. | ||||
| 	// Extensions are sorted according to their full name. | ||||
| 	IndexNameFieldOrder FieldOrder = func(x, y pref.FieldDescriptor) bool { | ||||
| 		// Non-extension fields sort before extension fields. | ||||
| 		if x.IsExtension() != y.IsExtension() { | ||||
| 			return !x.IsExtension() && y.IsExtension() | ||||
| 		} | ||||
| 		// Extensions sorted by fullname. | ||||
| 		if x.IsExtension() && y.IsExtension() { | ||||
| 			return x.FullName() < y.FullName() | ||||
| 		} | ||||
| 		// Non-extensions sorted by declaration index. | ||||
| 		return x.Index() < y.Index() | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| // KeyOrder specifies the ordering to visit map entries. | ||||
| // It is a function that reports whether x is ordered before y. | ||||
| type KeyOrder func(x, y pref.MapKey) bool | ||||
|  | ||||
| var ( | ||||
| 	// AnyKeyOrder specifies no specific key ordering. | ||||
| 	AnyKeyOrder KeyOrder = nil | ||||
|  | ||||
| 	// GenericKeyOrder sorts false before true, numeric keys in ascending order, | ||||
| 	// and strings in lexicographical ordering according to UTF-8 codepoints. | ||||
| 	GenericKeyOrder KeyOrder = func(x, y pref.MapKey) bool { | ||||
| 		switch x.Interface().(type) { | ||||
| 		case bool: | ||||
| 			return !x.Bool() && y.Bool() | ||||
| 		case int32, int64: | ||||
| 			return x.Int() < y.Int() | ||||
| 		case uint32, uint64: | ||||
| 			return x.Uint() < y.Uint() | ||||
| 		case string: | ||||
| 			return x.String() < y.String() | ||||
| 		default: | ||||
| 			panic("invalid map key type") | ||||
| 		} | ||||
| 	} | ||||
| ) | ||||
							
								
								
									
										115
									
								
								vendor/google.golang.org/protobuf/internal/order/range.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								vendor/google.golang.org/protobuf/internal/order/range.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,115 @@ | ||||
| // Copyright 2020 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 order provides ordered access to messages and maps. | ||||
| package order | ||||
|  | ||||
| import ( | ||||
| 	"sort" | ||||
| 	"sync" | ||||
|  | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| type messageField struct { | ||||
| 	fd pref.FieldDescriptor | ||||
| 	v  pref.Value | ||||
| } | ||||
|  | ||||
| var messageFieldPool = sync.Pool{ | ||||
| 	New: func() interface{} { return new([]messageField) }, | ||||
| } | ||||
|  | ||||
| type ( | ||||
| 	// FieldRnger is an interface for visiting all fields in a message. | ||||
| 	// The protoreflect.Message type implements this interface. | ||||
| 	FieldRanger interface{ Range(VisitField) } | ||||
| 	// VisitField is called everytime a message field is visited. | ||||
| 	VisitField = func(pref.FieldDescriptor, pref.Value) bool | ||||
| ) | ||||
|  | ||||
| // RangeFields iterates over the fields of fs according to the specified order. | ||||
| func RangeFields(fs FieldRanger, less FieldOrder, fn VisitField) { | ||||
| 	if less == nil { | ||||
| 		fs.Range(fn) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// Obtain a pre-allocated scratch buffer. | ||||
| 	p := messageFieldPool.Get().(*[]messageField) | ||||
| 	fields := (*p)[:0] | ||||
| 	defer func() { | ||||
| 		if cap(fields) < 1024 { | ||||
| 			*p = fields | ||||
| 			messageFieldPool.Put(p) | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	// Collect all fields in the message and sort them. | ||||
| 	fs.Range(func(fd pref.FieldDescriptor, v pref.Value) bool { | ||||
| 		fields = append(fields, messageField{fd, v}) | ||||
| 		return true | ||||
| 	}) | ||||
| 	sort.Slice(fields, func(i, j int) bool { | ||||
| 		return less(fields[i].fd, fields[j].fd) | ||||
| 	}) | ||||
|  | ||||
| 	// Visit the fields in the specified ordering. | ||||
| 	for _, f := range fields { | ||||
| 		if !fn(f.fd, f.v) { | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type mapEntry struct { | ||||
| 	k pref.MapKey | ||||
| 	v pref.Value | ||||
| } | ||||
|  | ||||
| var mapEntryPool = sync.Pool{ | ||||
| 	New: func() interface{} { return new([]mapEntry) }, | ||||
| } | ||||
|  | ||||
| type ( | ||||
| 	// EntryRanger is an interface for visiting all fields in a message. | ||||
| 	// The protoreflect.Map type implements this interface. | ||||
| 	EntryRanger interface{ Range(VisitEntry) } | ||||
| 	// VisitEntry is called everytime a map entry is visited. | ||||
| 	VisitEntry = func(pref.MapKey, pref.Value) bool | ||||
| ) | ||||
|  | ||||
| // RangeEntries iterates over the entries of es according to the specified order. | ||||
| func RangeEntries(es EntryRanger, less KeyOrder, fn VisitEntry) { | ||||
| 	if less == nil { | ||||
| 		es.Range(fn) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// Obtain a pre-allocated scratch buffer. | ||||
| 	p := mapEntryPool.Get().(*[]mapEntry) | ||||
| 	entries := (*p)[:0] | ||||
| 	defer func() { | ||||
| 		if cap(entries) < 1024 { | ||||
| 			*p = entries | ||||
| 			mapEntryPool.Put(p) | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	// Collect all entries in the map and sort them. | ||||
| 	es.Range(func(k pref.MapKey, v pref.Value) bool { | ||||
| 		entries = append(entries, mapEntry{k, v}) | ||||
| 		return true | ||||
| 	}) | ||||
| 	sort.Slice(entries, func(i, j int) bool { | ||||
| 		return less(entries[i].k, entries[j].k) | ||||
| 	}) | ||||
|  | ||||
| 	// Visit the entries in the specified ordering. | ||||
| 	for _, e := range entries { | ||||
| 		if !fn(e.k, e.v) { | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										29
									
								
								vendor/google.golang.org/protobuf/internal/pragma/pragma.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								vendor/google.golang.org/protobuf/internal/pragma/pragma.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| // 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 pragma provides types that can be embedded into a struct to | ||||
| // statically enforce or prevent certain language properties. | ||||
| package pragma | ||||
|  | ||||
| import "sync" | ||||
|  | ||||
| // NoUnkeyedLiterals can be embedded in a struct to prevent unkeyed literals. | ||||
| type NoUnkeyedLiterals struct{} | ||||
|  | ||||
| // DoNotImplement can be embedded in an interface to prevent trivial | ||||
| // implementations of the interface. | ||||
| // | ||||
| // This is useful to prevent unauthorized implementations of an interface | ||||
| // so that it can be extended in the future for any protobuf language changes. | ||||
| type DoNotImplement interface{ ProtoInternal(DoNotImplement) } | ||||
|  | ||||
| // DoNotCompare can be embedded in a struct to prevent comparability. | ||||
| type DoNotCompare [0]func() | ||||
|  | ||||
| // DoNotCopy can be embedded in a struct to help prevent shallow copies. | ||||
| // This does not rely on a Go language feature, but rather a special case | ||||
| // within the vet checker. | ||||
| // | ||||
| // See https://golang.org/issues/8005. | ||||
| type DoNotCopy [0]sync.Mutex | ||||
							
								
								
									
										58
									
								
								vendor/google.golang.org/protobuf/internal/set/ints.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								vendor/google.golang.org/protobuf/internal/set/ints.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| // 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 set provides simple set data structures for uint64s. | ||||
| package set | ||||
|  | ||||
| import "math/bits" | ||||
|  | ||||
| // int64s represents a set of integers within the range of 0..63. | ||||
| type int64s uint64 | ||||
|  | ||||
| func (bs *int64s) Len() int { | ||||
| 	return bits.OnesCount64(uint64(*bs)) | ||||
| } | ||||
| func (bs *int64s) Has(n uint64) bool { | ||||
| 	return uint64(*bs)&(uint64(1)<<n) > 0 | ||||
| } | ||||
| func (bs *int64s) Set(n uint64) { | ||||
| 	*(*uint64)(bs) |= uint64(1) << n | ||||
| } | ||||
| func (bs *int64s) Clear(n uint64) { | ||||
| 	*(*uint64)(bs) &^= uint64(1) << n | ||||
| } | ||||
|  | ||||
| // Ints represents a set of integers within the range of 0..math.MaxUint64. | ||||
| type Ints struct { | ||||
| 	lo int64s | ||||
| 	hi map[uint64]struct{} | ||||
| } | ||||
|  | ||||
| func (bs *Ints) Len() int { | ||||
| 	return bs.lo.Len() + len(bs.hi) | ||||
| } | ||||
| func (bs *Ints) Has(n uint64) bool { | ||||
| 	if n < 64 { | ||||
| 		return bs.lo.Has(n) | ||||
| 	} | ||||
| 	_, ok := bs.hi[n] | ||||
| 	return ok | ||||
| } | ||||
| func (bs *Ints) Set(n uint64) { | ||||
| 	if n < 64 { | ||||
| 		bs.lo.Set(n) | ||||
| 		return | ||||
| 	} | ||||
| 	if bs.hi == nil { | ||||
| 		bs.hi = make(map[uint64]struct{}) | ||||
| 	} | ||||
| 	bs.hi[n] = struct{}{} | ||||
| } | ||||
| func (bs *Ints) Clear(n uint64) { | ||||
| 	if n < 64 { | ||||
| 		bs.lo.Clear(n) | ||||
| 		return | ||||
| 	} | ||||
| 	delete(bs.hi, n) | ||||
| } | ||||
							
								
								
									
										196
									
								
								vendor/google.golang.org/protobuf/internal/strs/strings.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								vendor/google.golang.org/protobuf/internal/strs/strings.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,196 @@ | ||||
| // 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 strs provides string manipulation functionality specific to protobuf. | ||||
| package strs | ||||
|  | ||||
| import ( | ||||
| 	"go/token" | ||||
| 	"strings" | ||||
| 	"unicode" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"google.golang.org/protobuf/internal/flags" | ||||
| 	"google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| // EnforceUTF8 reports whether to enforce strict UTF-8 validation. | ||||
| func EnforceUTF8(fd protoreflect.FieldDescriptor) bool { | ||||
| 	if flags.ProtoLegacy { | ||||
| 		if fd, ok := fd.(interface{ EnforceUTF8() bool }); ok { | ||||
| 			return fd.EnforceUTF8() | ||||
| 		} | ||||
| 	} | ||||
| 	return fd.Syntax() == protoreflect.Proto3 | ||||
| } | ||||
|  | ||||
| // GoCamelCase camel-cases a protobuf name for use as a Go identifier. | ||||
| // | ||||
| // If there is an interior underscore followed by a lower case letter, | ||||
| // drop the underscore and convert the letter to upper case. | ||||
| func GoCamelCase(s string) string { | ||||
| 	// Invariant: if the next letter is lower case, it must be converted | ||||
| 	// to upper case. | ||||
| 	// That is, we process a word at a time, where words are marked by _ or | ||||
| 	// upper case letter. Digits are treated as words. | ||||
| 	var b []byte | ||||
| 	for i := 0; i < len(s); i++ { | ||||
| 		c := s[i] | ||||
| 		switch { | ||||
| 		case c == '.' && i+1 < len(s) && isASCIILower(s[i+1]): | ||||
| 			// Skip over '.' in ".{{lowercase}}". | ||||
| 		case c == '.': | ||||
| 			b = append(b, '_') // convert '.' to '_' | ||||
| 		case c == '_' && (i == 0 || s[i-1] == '.'): | ||||
| 			// Convert initial '_' to ensure we start with a capital letter. | ||||
| 			// Do the same for '_' after '.' to match historic behavior. | ||||
| 			b = append(b, 'X') // convert '_' to 'X' | ||||
| 		case c == '_' && i+1 < len(s) && isASCIILower(s[i+1]): | ||||
| 			// Skip over '_' in "_{{lowercase}}". | ||||
| 		case isASCIIDigit(c): | ||||
| 			b = append(b, c) | ||||
| 		default: | ||||
| 			// Assume we have a letter now - if not, it's a bogus identifier. | ||||
| 			// The next word is a sequence of characters that must start upper case. | ||||
| 			if isASCIILower(c) { | ||||
| 				c -= 'a' - 'A' // convert lowercase to uppercase | ||||
| 			} | ||||
| 			b = append(b, c) | ||||
|  | ||||
| 			// Accept lower case sequence that follows. | ||||
| 			for ; i+1 < len(s) && isASCIILower(s[i+1]); i++ { | ||||
| 				b = append(b, s[i+1]) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return string(b) | ||||
| } | ||||
|  | ||||
| // GoSanitized converts a string to a valid Go identifier. | ||||
| func GoSanitized(s string) string { | ||||
| 	// Sanitize the input to the set of valid characters, | ||||
| 	// which must be '_' or be in the Unicode L or N categories. | ||||
| 	s = strings.Map(func(r rune) rune { | ||||
| 		if unicode.IsLetter(r) || unicode.IsDigit(r) { | ||||
| 			return r | ||||
| 		} | ||||
| 		return '_' | ||||
| 	}, s) | ||||
|  | ||||
| 	// Prepend '_' in the event of a Go keyword conflict or if | ||||
| 	// the identifier is invalid (does not start in the Unicode L category). | ||||
| 	r, _ := utf8.DecodeRuneInString(s) | ||||
| 	if token.Lookup(s).IsKeyword() || !unicode.IsLetter(r) { | ||||
| 		return "_" + s | ||||
| 	} | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| // JSONCamelCase converts a snake_case identifier to a camelCase identifier, | ||||
| // according to the protobuf JSON specification. | ||||
| func JSONCamelCase(s string) string { | ||||
| 	var b []byte | ||||
| 	var wasUnderscore bool | ||||
| 	for i := 0; i < len(s); i++ { // proto identifiers are always ASCII | ||||
| 		c := s[i] | ||||
| 		if c != '_' { | ||||
| 			if wasUnderscore && isASCIILower(c) { | ||||
| 				c -= 'a' - 'A' // convert to uppercase | ||||
| 			} | ||||
| 			b = append(b, c) | ||||
| 		} | ||||
| 		wasUnderscore = c == '_' | ||||
| 	} | ||||
| 	return string(b) | ||||
| } | ||||
|  | ||||
| // JSONSnakeCase converts a camelCase identifier to a snake_case identifier, | ||||
| // according to the protobuf JSON specification. | ||||
| func JSONSnakeCase(s string) string { | ||||
| 	var b []byte | ||||
| 	for i := 0; i < len(s); i++ { // proto identifiers are always ASCII | ||||
| 		c := s[i] | ||||
| 		if isASCIIUpper(c) { | ||||
| 			b = append(b, '_') | ||||
| 			c += 'a' - 'A' // convert to lowercase | ||||
| 		} | ||||
| 		b = append(b, c) | ||||
| 	} | ||||
| 	return string(b) | ||||
| } | ||||
|  | ||||
| // MapEntryName derives the name of the map entry message given the field name. | ||||
| // See protoc v3.8.0: src/google/protobuf/descriptor.cc:254-276,6057 | ||||
| func MapEntryName(s string) string { | ||||
| 	var b []byte | ||||
| 	upperNext := true | ||||
| 	for _, c := range s { | ||||
| 		switch { | ||||
| 		case c == '_': | ||||
| 			upperNext = true | ||||
| 		case upperNext: | ||||
| 			b = append(b, byte(unicode.ToUpper(c))) | ||||
| 			upperNext = false | ||||
| 		default: | ||||
| 			b = append(b, byte(c)) | ||||
| 		} | ||||
| 	} | ||||
| 	b = append(b, "Entry"...) | ||||
| 	return string(b) | ||||
| } | ||||
|  | ||||
| // EnumValueName derives the camel-cased enum value name. | ||||
| // See protoc v3.8.0: src/google/protobuf/descriptor.cc:297-313 | ||||
| func EnumValueName(s string) string { | ||||
| 	var b []byte | ||||
| 	upperNext := true | ||||
| 	for _, c := range s { | ||||
| 		switch { | ||||
| 		case c == '_': | ||||
| 			upperNext = true | ||||
| 		case upperNext: | ||||
| 			b = append(b, byte(unicode.ToUpper(c))) | ||||
| 			upperNext = false | ||||
| 		default: | ||||
| 			b = append(b, byte(unicode.ToLower(c))) | ||||
| 			upperNext = false | ||||
| 		} | ||||
| 	} | ||||
| 	return string(b) | ||||
| } | ||||
|  | ||||
| // TrimEnumPrefix trims the enum name prefix from an enum value name, | ||||
| // where the prefix is all lowercase without underscores. | ||||
| // See protoc v3.8.0: src/google/protobuf/descriptor.cc:330-375 | ||||
| func TrimEnumPrefix(s, prefix string) string { | ||||
| 	s0 := s // original input | ||||
| 	for len(s) > 0 && len(prefix) > 0 { | ||||
| 		if s[0] == '_' { | ||||
| 			s = s[1:] | ||||
| 			continue | ||||
| 		} | ||||
| 		if unicode.ToLower(rune(s[0])) != rune(prefix[0]) { | ||||
| 			return s0 // no prefix match | ||||
| 		} | ||||
| 		s, prefix = s[1:], prefix[1:] | ||||
| 	} | ||||
| 	if len(prefix) > 0 { | ||||
| 		return s0 // no prefix match | ||||
| 	} | ||||
| 	s = strings.TrimLeft(s, "_") | ||||
| 	if len(s) == 0 { | ||||
| 		return s0 // avoid returning empty string | ||||
| 	} | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| func isASCIILower(c byte) bool { | ||||
| 	return 'a' <= c && c <= 'z' | ||||
| } | ||||
| func isASCIIUpper(c byte) bool { | ||||
| 	return 'A' <= c && c <= 'Z' | ||||
| } | ||||
| func isASCIIDigit(c byte) bool { | ||||
| 	return '0' <= c && c <= '9' | ||||
| } | ||||
							
								
								
									
										28
									
								
								vendor/google.golang.org/protobuf/internal/strs/strings_pure.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								vendor/google.golang.org/protobuf/internal/strs/strings_pure.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| // 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. | ||||
|  | ||||
| //go:build purego || appengine | ||||
| // +build purego appengine | ||||
|  | ||||
| package strs | ||||
|  | ||||
| import pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
|  | ||||
| func UnsafeString(b []byte) string { | ||||
| 	return string(b) | ||||
| } | ||||
|  | ||||
| func UnsafeBytes(s string) []byte { | ||||
| 	return []byte(s) | ||||
| } | ||||
|  | ||||
| type Builder struct{} | ||||
|  | ||||
| func (*Builder) AppendFullName(prefix pref.FullName, name pref.Name) pref.FullName { | ||||
| 	return prefix.Append(name) | ||||
| } | ||||
|  | ||||
| func (*Builder) MakeString(b []byte) string { | ||||
| 	return string(b) | ||||
| } | ||||
							
								
								
									
										95
									
								
								vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | ||||
| // 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. | ||||
|  | ||||
| //go:build !purego && !appengine | ||||
| // +build !purego,!appengine | ||||
|  | ||||
| package strs | ||||
|  | ||||
| import ( | ||||
| 	"unsafe" | ||||
|  | ||||
| 	pref "google.golang.org/protobuf/reflect/protoreflect" | ||||
| ) | ||||
|  | ||||
| type ( | ||||
| 	stringHeader struct { | ||||
| 		Data unsafe.Pointer | ||||
| 		Len  int | ||||
| 	} | ||||
| 	sliceHeader struct { | ||||
| 		Data unsafe.Pointer | ||||
| 		Len  int | ||||
| 		Cap  int | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| // UnsafeString returns an unsafe string reference of b. | ||||
| // The caller must treat the input slice as immutable. | ||||
| // | ||||
| // WARNING: Use carefully. The returned result must not leak to the end user | ||||
| // unless the input slice is provably immutable. | ||||
| func UnsafeString(b []byte) (s string) { | ||||
| 	src := (*sliceHeader)(unsafe.Pointer(&b)) | ||||
| 	dst := (*stringHeader)(unsafe.Pointer(&s)) | ||||
| 	dst.Data = src.Data | ||||
| 	dst.Len = src.Len | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| // UnsafeBytes returns an unsafe bytes slice reference of s. | ||||
| // The caller must treat returned slice as immutable. | ||||
| // | ||||
| // WARNING: Use carefully. The returned result must not leak to the end user. | ||||
| func UnsafeBytes(s string) (b []byte) { | ||||
| 	src := (*stringHeader)(unsafe.Pointer(&s)) | ||||
| 	dst := (*sliceHeader)(unsafe.Pointer(&b)) | ||||
| 	dst.Data = src.Data | ||||
| 	dst.Len = src.Len | ||||
| 	dst.Cap = src.Len | ||||
| 	return b | ||||
| } | ||||
|  | ||||
| // Builder builds a set of strings with shared lifetime. | ||||
| // This differs from strings.Builder, which is for building a single string. | ||||
| type Builder struct { | ||||
| 	buf []byte | ||||
| } | ||||
|  | ||||
| // AppendFullName is equivalent to protoreflect.FullName.Append, | ||||
| // but optimized for large batches where each name has a shared lifetime. | ||||
| func (sb *Builder) AppendFullName(prefix pref.FullName, name pref.Name) pref.FullName { | ||||
| 	n := len(prefix) + len(".") + len(name) | ||||
| 	if len(prefix) == 0 { | ||||
| 		n -= len(".") | ||||
| 	} | ||||
| 	sb.grow(n) | ||||
| 	sb.buf = append(sb.buf, prefix...) | ||||
| 	sb.buf = append(sb.buf, '.') | ||||
| 	sb.buf = append(sb.buf, name...) | ||||
| 	return pref.FullName(sb.last(n)) | ||||
| } | ||||
|  | ||||
| // MakeString is equivalent to string(b), but optimized for large batches | ||||
| // with a shared lifetime. | ||||
| func (sb *Builder) MakeString(b []byte) string { | ||||
| 	sb.grow(len(b)) | ||||
| 	sb.buf = append(sb.buf, b...) | ||||
| 	return sb.last(len(b)) | ||||
| } | ||||
|  | ||||
| func (sb *Builder) grow(n int) { | ||||
| 	if cap(sb.buf)-len(sb.buf) >= n { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// Unlike strings.Builder, we do not need to copy over the contents | ||||
| 	// of the old buffer since our builder provides no API for | ||||
| 	// retrieving previously created strings. | ||||
| 	sb.buf = make([]byte, 2*(cap(sb.buf)+n)) | ||||
| } | ||||
|  | ||||
| func (sb *Builder) last(n int) string { | ||||
| 	return UnsafeString(sb.buf[len(sb.buf)-n:]) | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user