go mod vendor
+ move k8s.io/apimachinery fork from go.work to go.mod (and include it in vendor)
This commit is contained in:
		
							
								
								
									
										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" | ||||
| 	"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 protoreflect.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 protoreflect.Name | ||||
| 		var fd protoreflect.FieldDescriptor | ||||
| 		var xt protoreflect.ExtensionType | ||||
| 		var xtErr error | ||||
| 		var isFieldNumberName bool | ||||
|  | ||||
| 		switch tok.NameKind() { | ||||
| 		case text.IdentName: | ||||
| 			name = protoreflect.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(protoreflect.FullName(tok.TypeName())) | ||||
|  | ||||
| 		case text.FieldNumber: | ||||
| 			isFieldNumberName = true | ||||
| 			num := protoreflect.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 != protoreflect.MessageKind && kind != protoreflect.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 != protoreflect.MessageKind && kind != protoreflect.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 protoreflect.FieldDescriptor, m protoreflect.Message) error { | ||||
| 	var val protoreflect.Value | ||||
| 	var err error | ||||
| 	switch fd.Kind() { | ||||
| 	case protoreflect.MessageKind, protoreflect.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 protoreflect.FieldDescriptor) (protoreflect.Value, error) { | ||||
| 	tok, err := d.Read() | ||||
| 	if err != nil { | ||||
| 		return protoreflect.Value{}, err | ||||
| 	} | ||||
|  | ||||
| 	if tok.Kind() != text.Scalar { | ||||
| 		return protoreflect.Value{}, d.unexpectedTokenError(tok) | ||||
| 	} | ||||
|  | ||||
| 	kind := fd.Kind() | ||||
| 	switch kind { | ||||
| 	case protoreflect.BoolKind: | ||||
| 		if b, ok := tok.Bool(); ok { | ||||
| 			return protoreflect.ValueOfBool(b), nil | ||||
| 		} | ||||
|  | ||||
| 	case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind: | ||||
| 		if n, ok := tok.Int32(); ok { | ||||
| 			return protoreflect.ValueOfInt32(n), nil | ||||
| 		} | ||||
|  | ||||
| 	case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind: | ||||
| 		if n, ok := tok.Int64(); ok { | ||||
| 			return protoreflect.ValueOfInt64(n), nil | ||||
| 		} | ||||
|  | ||||
| 	case protoreflect.Uint32Kind, protoreflect.Fixed32Kind: | ||||
| 		if n, ok := tok.Uint32(); ok { | ||||
| 			return protoreflect.ValueOfUint32(n), nil | ||||
| 		} | ||||
|  | ||||
| 	case protoreflect.Uint64Kind, protoreflect.Fixed64Kind: | ||||
| 		if n, ok := tok.Uint64(); ok { | ||||
| 			return protoreflect.ValueOfUint64(n), nil | ||||
| 		} | ||||
|  | ||||
| 	case protoreflect.FloatKind: | ||||
| 		if n, ok := tok.Float32(); ok { | ||||
| 			return protoreflect.ValueOfFloat32(n), nil | ||||
| 		} | ||||
|  | ||||
| 	case protoreflect.DoubleKind: | ||||
| 		if n, ok := tok.Float64(); ok { | ||||
| 			return protoreflect.ValueOfFloat64(n), nil | ||||
| 		} | ||||
|  | ||||
| 	case protoreflect.StringKind: | ||||
| 		if s, ok := tok.String(); ok { | ||||
| 			if strs.EnforceUTF8(fd) && !utf8.ValidString(s) { | ||||
| 				return protoreflect.Value{}, d.newError(tok.Pos(), "contains invalid UTF-8") | ||||
| 			} | ||||
| 			return protoreflect.ValueOfString(s), nil | ||||
| 		} | ||||
|  | ||||
| 	case protoreflect.BytesKind: | ||||
| 		if b, ok := tok.String(); ok { | ||||
| 			return protoreflect.ValueOfBytes([]byte(b)), nil | ||||
| 		} | ||||
|  | ||||
| 	case protoreflect.EnumKind: | ||||
| 		if lit, ok := tok.Enum(); ok { | ||||
| 			// Lookup EnumNumber based on name. | ||||
| 			if enumVal := fd.Enum().Values().ByName(protoreflect.Name(lit)); enumVal != nil { | ||||
| 				return protoreflect.ValueOfEnum(enumVal.Number()), nil | ||||
| 			} | ||||
| 		} | ||||
| 		if num, ok := tok.Int32(); ok { | ||||
| 			return protoreflect.ValueOfEnum(protoreflect.EnumNumber(num)), nil | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("invalid scalar kind %v", kind)) | ||||
| 	} | ||||
|  | ||||
| 	return protoreflect.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 protoreflect.FieldDescriptor, list protoreflect.List) error { | ||||
| 	tok, err := d.Peek() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	switch fd.Kind() { | ||||
| 	case protoreflect.MessageKind, protoreflect.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 protoreflect.FieldDescriptor, mmap protoreflect.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() (protoreflect.Value, error) | ||||
| 	switch fd.MapValue().Kind() { | ||||
| 	case protoreflect.MessageKind, protoreflect.GroupKind: | ||||
| 		unmarshalMapValue = func() (protoreflect.Value, error) { | ||||
| 			pval := mmap.NewValue() | ||||
| 			if err := d.unmarshalMessage(pval.Message(), true); err != nil { | ||||
| 				return protoreflect.Value{}, err | ||||
| 			} | ||||
| 			return pval, nil | ||||
| 		} | ||||
| 	default: | ||||
| 		unmarshalMapValue = func() (protoreflect.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 protoreflect.FieldDescriptor, mmap protoreflect.Map, unmarshalMapValue func() (protoreflect.Value, error)) error { | ||||
| 	var key protoreflect.MapKey | ||||
| 	var pval protoreflect.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 := protoreflect.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 != protoreflect.MessageKind) && (kind != protoreflect.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 protoreflect.MessageKind, protoreflect.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 protoreflect.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 := protoreflect.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), protoreflect.ValueOfString(typeURL)) | ||||
| 	} | ||||
| 	if len(bValue) > 0 { | ||||
| 		m.Set(fds.ByNumber(genid.Any_Value_field_number), protoreflect.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 | ||||
							
								
								
									
										370
									
								
								vendor/google.golang.org/protobuf/encoding/prototext/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										370
									
								
								vendor/google.golang.org/protobuf/encoding/prototext/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,370 @@ | ||||
| // 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" | ||||
| 	"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 protoreflect.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 protoreflect.Value, fd protoreflect.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 protoreflect.Value, fd protoreflect.FieldDescriptor) error { | ||||
| 	kind := fd.Kind() | ||||
| 	switch kind { | ||||
| 	case protoreflect.BoolKind: | ||||
| 		e.WriteBool(val.Bool()) | ||||
|  | ||||
| 	case protoreflect.StringKind: | ||||
| 		s := val.String() | ||||
| 		if !e.opts.allowInvalidUTF8 && strs.EnforceUTF8(fd) && !utf8.ValidString(s) { | ||||
| 			return errors.InvalidUTF8(string(fd.FullName())) | ||||
| 		} | ||||
| 		e.WriteString(s) | ||||
|  | ||||
| 	case protoreflect.Int32Kind, protoreflect.Int64Kind, | ||||
| 		protoreflect.Sint32Kind, protoreflect.Sint64Kind, | ||||
| 		protoreflect.Sfixed32Kind, protoreflect.Sfixed64Kind: | ||||
| 		e.WriteInt(val.Int()) | ||||
|  | ||||
| 	case protoreflect.Uint32Kind, protoreflect.Uint64Kind, | ||||
| 		protoreflect.Fixed32Kind, protoreflect.Fixed64Kind: | ||||
| 		e.WriteUint(val.Uint()) | ||||
|  | ||||
| 	case protoreflect.FloatKind: | ||||
| 		// Encoder.WriteFloat handles the special numbers NaN and infinites. | ||||
| 		e.WriteFloat(val.Float(), 32) | ||||
|  | ||||
| 	case protoreflect.DoubleKind: | ||||
| 		// Encoder.WriteFloat handles the special numbers NaN and infinites. | ||||
| 		e.WriteFloat(val.Float(), 64) | ||||
|  | ||||
| 	case protoreflect.BytesKind: | ||||
| 		e.WriteString(string(val.Bytes())) | ||||
|  | ||||
| 	case protoreflect.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 protoreflect.MessageKind, protoreflect.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 protoreflect.List, fd protoreflect.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 protoreflect.Map, fd protoreflect.FieldDescriptor) error { | ||||
| 	var err error | ||||
| 	order.RangeEntries(mmap, order.GenericKeyOrder, func(key protoreflect.MapKey, val protoreflect.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 protoreflect.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 | ||||
| } | ||||
							
								
								
									
										551
									
								
								vendor/google.golang.org/protobuf/encoding/protowire/wire.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										551
									
								
								vendor/google.golang.org/protobuf/encoding/protowire/wire.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,551 @@ | ||||
| // 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 | ||||
| } | ||||
		Reference in New Issue
	
	Block a user