updated GHA
Update to v2 SDK updated dependencies
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" | ||||
| 	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 | ||||
| } | ||||
		Reference in New Issue
	
	Block a user