v1.38.0 is used by Kubernetes since https://github.com/kubernetes/kubernetes/pull/100488. Signed-off-by: Kazuyoshi Kato <katokazu@amazon.com>
		
			
				
	
	
		
			558 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			558 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2019 The Go Authors. All rights reserved.
 | 
						|
// Use of this source code is governed by a BSD-style
 | 
						|
// license that can be found in the LICENSE file.
 | 
						|
 | 
						|
package impl
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"reflect"
 | 
						|
 | 
						|
	"google.golang.org/protobuf/encoding/protowire"
 | 
						|
	"google.golang.org/protobuf/internal/strs"
 | 
						|
	pref "google.golang.org/protobuf/reflect/protoreflect"
 | 
						|
)
 | 
						|
 | 
						|
// pointerCoderFuncs is a set of pointer encoding functions.
 | 
						|
type pointerCoderFuncs struct {
 | 
						|
	mi        *MessageInfo
 | 
						|
	size      func(p pointer, f *coderFieldInfo, opts marshalOptions) int
 | 
						|
	marshal   func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error)
 | 
						|
	unmarshal func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error)
 | 
						|
	isInit    func(p pointer, f *coderFieldInfo) error
 | 
						|
	merge     func(dst, src pointer, f *coderFieldInfo, opts mergeOptions)
 | 
						|
}
 | 
						|
 | 
						|
// valueCoderFuncs is a set of protoreflect.Value encoding functions.
 | 
						|
type valueCoderFuncs struct {
 | 
						|
	size      func(v pref.Value, tagsize int, opts marshalOptions) int
 | 
						|
	marshal   func(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error)
 | 
						|
	unmarshal func(b []byte, v pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error)
 | 
						|
	isInit    func(v pref.Value) error
 | 
						|
	merge     func(dst, src pref.Value, opts mergeOptions) pref.Value
 | 
						|
}
 | 
						|
 | 
						|
// fieldCoder returns pointer functions for a field, used for operating on
 | 
						|
// struct fields.
 | 
						|
func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointerCoderFuncs) {
 | 
						|
	switch {
 | 
						|
	case fd.IsMap():
 | 
						|
		return encoderFuncsForMap(fd, ft)
 | 
						|
	case fd.Cardinality() == pref.Repeated && !fd.IsPacked():
 | 
						|
		// Repeated fields (not packed).
 | 
						|
		if ft.Kind() != reflect.Slice {
 | 
						|
			break
 | 
						|
		}
 | 
						|
		ft := ft.Elem()
 | 
						|
		switch fd.Kind() {
 | 
						|
		case pref.BoolKind:
 | 
						|
			if ft.Kind() == reflect.Bool {
 | 
						|
				return nil, coderBoolSlice
 | 
						|
			}
 | 
						|
		case pref.EnumKind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderEnumSlice
 | 
						|
			}
 | 
						|
		case pref.Int32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderInt32Slice
 | 
						|
			}
 | 
						|
		case pref.Sint32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderSint32Slice
 | 
						|
			}
 | 
						|
		case pref.Uint32Kind:
 | 
						|
			if ft.Kind() == reflect.Uint32 {
 | 
						|
				return nil, coderUint32Slice
 | 
						|
			}
 | 
						|
		case pref.Int64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderInt64Slice
 | 
						|
			}
 | 
						|
		case pref.Sint64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderSint64Slice
 | 
						|
			}
 | 
						|
		case pref.Uint64Kind:
 | 
						|
			if ft.Kind() == reflect.Uint64 {
 | 
						|
				return nil, coderUint64Slice
 | 
						|
			}
 | 
						|
		case pref.Sfixed32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderSfixed32Slice
 | 
						|
			}
 | 
						|
		case pref.Fixed32Kind:
 | 
						|
			if ft.Kind() == reflect.Uint32 {
 | 
						|
				return nil, coderFixed32Slice
 | 
						|
			}
 | 
						|
		case pref.FloatKind:
 | 
						|
			if ft.Kind() == reflect.Float32 {
 | 
						|
				return nil, coderFloatSlice
 | 
						|
			}
 | 
						|
		case pref.Sfixed64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderSfixed64Slice
 | 
						|
			}
 | 
						|
		case pref.Fixed64Kind:
 | 
						|
			if ft.Kind() == reflect.Uint64 {
 | 
						|
				return nil, coderFixed64Slice
 | 
						|
			}
 | 
						|
		case pref.DoubleKind:
 | 
						|
			if ft.Kind() == reflect.Float64 {
 | 
						|
				return nil, coderDoubleSlice
 | 
						|
			}
 | 
						|
		case pref.StringKind:
 | 
						|
			if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
 | 
						|
				return nil, coderStringSliceValidateUTF8
 | 
						|
			}
 | 
						|
			if ft.Kind() == reflect.String {
 | 
						|
				return nil, coderStringSlice
 | 
						|
			}
 | 
						|
			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) {
 | 
						|
				return nil, coderBytesSliceValidateUTF8
 | 
						|
			}
 | 
						|
			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
 | 
						|
				return nil, coderBytesSlice
 | 
						|
			}
 | 
						|
		case pref.BytesKind:
 | 
						|
			if ft.Kind() == reflect.String {
 | 
						|
				return nil, coderStringSlice
 | 
						|
			}
 | 
						|
			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
 | 
						|
				return nil, coderBytesSlice
 | 
						|
			}
 | 
						|
		case pref.MessageKind:
 | 
						|
			return getMessageInfo(ft), makeMessageSliceFieldCoder(fd, ft)
 | 
						|
		case pref.GroupKind:
 | 
						|
			return getMessageInfo(ft), makeGroupSliceFieldCoder(fd, ft)
 | 
						|
		}
 | 
						|
	case fd.Cardinality() == pref.Repeated && fd.IsPacked():
 | 
						|
		// Packed repeated fields.
 | 
						|
		//
 | 
						|
		// Only repeated fields of primitive numeric types
 | 
						|
		// (Varint, Fixed32, or Fixed64 wire type) can be packed.
 | 
						|
		if ft.Kind() != reflect.Slice {
 | 
						|
			break
 | 
						|
		}
 | 
						|
		ft := ft.Elem()
 | 
						|
		switch fd.Kind() {
 | 
						|
		case pref.BoolKind:
 | 
						|
			if ft.Kind() == reflect.Bool {
 | 
						|
				return nil, coderBoolPackedSlice
 | 
						|
			}
 | 
						|
		case pref.EnumKind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderEnumPackedSlice
 | 
						|
			}
 | 
						|
		case pref.Int32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderInt32PackedSlice
 | 
						|
			}
 | 
						|
		case pref.Sint32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderSint32PackedSlice
 | 
						|
			}
 | 
						|
		case pref.Uint32Kind:
 | 
						|
			if ft.Kind() == reflect.Uint32 {
 | 
						|
				return nil, coderUint32PackedSlice
 | 
						|
			}
 | 
						|
		case pref.Int64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderInt64PackedSlice
 | 
						|
			}
 | 
						|
		case pref.Sint64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderSint64PackedSlice
 | 
						|
			}
 | 
						|
		case pref.Uint64Kind:
 | 
						|
			if ft.Kind() == reflect.Uint64 {
 | 
						|
				return nil, coderUint64PackedSlice
 | 
						|
			}
 | 
						|
		case pref.Sfixed32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderSfixed32PackedSlice
 | 
						|
			}
 | 
						|
		case pref.Fixed32Kind:
 | 
						|
			if ft.Kind() == reflect.Uint32 {
 | 
						|
				return nil, coderFixed32PackedSlice
 | 
						|
			}
 | 
						|
		case pref.FloatKind:
 | 
						|
			if ft.Kind() == reflect.Float32 {
 | 
						|
				return nil, coderFloatPackedSlice
 | 
						|
			}
 | 
						|
		case pref.Sfixed64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderSfixed64PackedSlice
 | 
						|
			}
 | 
						|
		case pref.Fixed64Kind:
 | 
						|
			if ft.Kind() == reflect.Uint64 {
 | 
						|
				return nil, coderFixed64PackedSlice
 | 
						|
			}
 | 
						|
		case pref.DoubleKind:
 | 
						|
			if ft.Kind() == reflect.Float64 {
 | 
						|
				return nil, coderDoublePackedSlice
 | 
						|
			}
 | 
						|
		}
 | 
						|
	case fd.Kind() == pref.MessageKind:
 | 
						|
		return getMessageInfo(ft), makeMessageFieldCoder(fd, ft)
 | 
						|
	case fd.Kind() == pref.GroupKind:
 | 
						|
		return getMessageInfo(ft), makeGroupFieldCoder(fd, ft)
 | 
						|
	case fd.Syntax() == pref.Proto3 && fd.ContainingOneof() == nil:
 | 
						|
		// Populated oneof fields always encode even if set to the zero value,
 | 
						|
		// which normally are not encoded in proto3.
 | 
						|
		switch fd.Kind() {
 | 
						|
		case pref.BoolKind:
 | 
						|
			if ft.Kind() == reflect.Bool {
 | 
						|
				return nil, coderBoolNoZero
 | 
						|
			}
 | 
						|
		case pref.EnumKind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderEnumNoZero
 | 
						|
			}
 | 
						|
		case pref.Int32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderInt32NoZero
 | 
						|
			}
 | 
						|
		case pref.Sint32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderSint32NoZero
 | 
						|
			}
 | 
						|
		case pref.Uint32Kind:
 | 
						|
			if ft.Kind() == reflect.Uint32 {
 | 
						|
				return nil, coderUint32NoZero
 | 
						|
			}
 | 
						|
		case pref.Int64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderInt64NoZero
 | 
						|
			}
 | 
						|
		case pref.Sint64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderSint64NoZero
 | 
						|
			}
 | 
						|
		case pref.Uint64Kind:
 | 
						|
			if ft.Kind() == reflect.Uint64 {
 | 
						|
				return nil, coderUint64NoZero
 | 
						|
			}
 | 
						|
		case pref.Sfixed32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderSfixed32NoZero
 | 
						|
			}
 | 
						|
		case pref.Fixed32Kind:
 | 
						|
			if ft.Kind() == reflect.Uint32 {
 | 
						|
				return nil, coderFixed32NoZero
 | 
						|
			}
 | 
						|
		case pref.FloatKind:
 | 
						|
			if ft.Kind() == reflect.Float32 {
 | 
						|
				return nil, coderFloatNoZero
 | 
						|
			}
 | 
						|
		case pref.Sfixed64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderSfixed64NoZero
 | 
						|
			}
 | 
						|
		case pref.Fixed64Kind:
 | 
						|
			if ft.Kind() == reflect.Uint64 {
 | 
						|
				return nil, coderFixed64NoZero
 | 
						|
			}
 | 
						|
		case pref.DoubleKind:
 | 
						|
			if ft.Kind() == reflect.Float64 {
 | 
						|
				return nil, coderDoubleNoZero
 | 
						|
			}
 | 
						|
		case pref.StringKind:
 | 
						|
			if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
 | 
						|
				return nil, coderStringNoZeroValidateUTF8
 | 
						|
			}
 | 
						|
			if ft.Kind() == reflect.String {
 | 
						|
				return nil, coderStringNoZero
 | 
						|
			}
 | 
						|
			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) {
 | 
						|
				return nil, coderBytesNoZeroValidateUTF8
 | 
						|
			}
 | 
						|
			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
 | 
						|
				return nil, coderBytesNoZero
 | 
						|
			}
 | 
						|
		case pref.BytesKind:
 | 
						|
			if ft.Kind() == reflect.String {
 | 
						|
				return nil, coderStringNoZero
 | 
						|
			}
 | 
						|
			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
 | 
						|
				return nil, coderBytesNoZero
 | 
						|
			}
 | 
						|
		}
 | 
						|
	case ft.Kind() == reflect.Ptr:
 | 
						|
		ft := ft.Elem()
 | 
						|
		switch fd.Kind() {
 | 
						|
		case pref.BoolKind:
 | 
						|
			if ft.Kind() == reflect.Bool {
 | 
						|
				return nil, coderBoolPtr
 | 
						|
			}
 | 
						|
		case pref.EnumKind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderEnumPtr
 | 
						|
			}
 | 
						|
		case pref.Int32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderInt32Ptr
 | 
						|
			}
 | 
						|
		case pref.Sint32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderSint32Ptr
 | 
						|
			}
 | 
						|
		case pref.Uint32Kind:
 | 
						|
			if ft.Kind() == reflect.Uint32 {
 | 
						|
				return nil, coderUint32Ptr
 | 
						|
			}
 | 
						|
		case pref.Int64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderInt64Ptr
 | 
						|
			}
 | 
						|
		case pref.Sint64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderSint64Ptr
 | 
						|
			}
 | 
						|
		case pref.Uint64Kind:
 | 
						|
			if ft.Kind() == reflect.Uint64 {
 | 
						|
				return nil, coderUint64Ptr
 | 
						|
			}
 | 
						|
		case pref.Sfixed32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderSfixed32Ptr
 | 
						|
			}
 | 
						|
		case pref.Fixed32Kind:
 | 
						|
			if ft.Kind() == reflect.Uint32 {
 | 
						|
				return nil, coderFixed32Ptr
 | 
						|
			}
 | 
						|
		case pref.FloatKind:
 | 
						|
			if ft.Kind() == reflect.Float32 {
 | 
						|
				return nil, coderFloatPtr
 | 
						|
			}
 | 
						|
		case pref.Sfixed64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderSfixed64Ptr
 | 
						|
			}
 | 
						|
		case pref.Fixed64Kind:
 | 
						|
			if ft.Kind() == reflect.Uint64 {
 | 
						|
				return nil, coderFixed64Ptr
 | 
						|
			}
 | 
						|
		case pref.DoubleKind:
 | 
						|
			if ft.Kind() == reflect.Float64 {
 | 
						|
				return nil, coderDoublePtr
 | 
						|
			}
 | 
						|
		case pref.StringKind:
 | 
						|
			if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
 | 
						|
				return nil, coderStringPtrValidateUTF8
 | 
						|
			}
 | 
						|
			if ft.Kind() == reflect.String {
 | 
						|
				return nil, coderStringPtr
 | 
						|
			}
 | 
						|
		case pref.BytesKind:
 | 
						|
			if ft.Kind() == reflect.String {
 | 
						|
				return nil, coderStringPtr
 | 
						|
			}
 | 
						|
		}
 | 
						|
	default:
 | 
						|
		switch fd.Kind() {
 | 
						|
		case pref.BoolKind:
 | 
						|
			if ft.Kind() == reflect.Bool {
 | 
						|
				return nil, coderBool
 | 
						|
			}
 | 
						|
		case pref.EnumKind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderEnum
 | 
						|
			}
 | 
						|
		case pref.Int32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderInt32
 | 
						|
			}
 | 
						|
		case pref.Sint32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderSint32
 | 
						|
			}
 | 
						|
		case pref.Uint32Kind:
 | 
						|
			if ft.Kind() == reflect.Uint32 {
 | 
						|
				return nil, coderUint32
 | 
						|
			}
 | 
						|
		case pref.Int64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderInt64
 | 
						|
			}
 | 
						|
		case pref.Sint64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderSint64
 | 
						|
			}
 | 
						|
		case pref.Uint64Kind:
 | 
						|
			if ft.Kind() == reflect.Uint64 {
 | 
						|
				return nil, coderUint64
 | 
						|
			}
 | 
						|
		case pref.Sfixed32Kind:
 | 
						|
			if ft.Kind() == reflect.Int32 {
 | 
						|
				return nil, coderSfixed32
 | 
						|
			}
 | 
						|
		case pref.Fixed32Kind:
 | 
						|
			if ft.Kind() == reflect.Uint32 {
 | 
						|
				return nil, coderFixed32
 | 
						|
			}
 | 
						|
		case pref.FloatKind:
 | 
						|
			if ft.Kind() == reflect.Float32 {
 | 
						|
				return nil, coderFloat
 | 
						|
			}
 | 
						|
		case pref.Sfixed64Kind:
 | 
						|
			if ft.Kind() == reflect.Int64 {
 | 
						|
				return nil, coderSfixed64
 | 
						|
			}
 | 
						|
		case pref.Fixed64Kind:
 | 
						|
			if ft.Kind() == reflect.Uint64 {
 | 
						|
				return nil, coderFixed64
 | 
						|
			}
 | 
						|
		case pref.DoubleKind:
 | 
						|
			if ft.Kind() == reflect.Float64 {
 | 
						|
				return nil, coderDouble
 | 
						|
			}
 | 
						|
		case pref.StringKind:
 | 
						|
			if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
 | 
						|
				return nil, coderStringValidateUTF8
 | 
						|
			}
 | 
						|
			if ft.Kind() == reflect.String {
 | 
						|
				return nil, coderString
 | 
						|
			}
 | 
						|
			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) {
 | 
						|
				return nil, coderBytesValidateUTF8
 | 
						|
			}
 | 
						|
			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
 | 
						|
				return nil, coderBytes
 | 
						|
			}
 | 
						|
		case pref.BytesKind:
 | 
						|
			if ft.Kind() == reflect.String {
 | 
						|
				return nil, coderString
 | 
						|
			}
 | 
						|
			if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
 | 
						|
				return nil, coderBytes
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	panic(fmt.Sprintf("invalid type: no encoder for %v %v %v/%v", fd.FullName(), fd.Cardinality(), fd.Kind(), ft))
 | 
						|
}
 | 
						|
 | 
						|
// encoderFuncsForValue returns value functions for a field, used for
 | 
						|
// extension values and map encoding.
 | 
						|
func encoderFuncsForValue(fd pref.FieldDescriptor) valueCoderFuncs {
 | 
						|
	switch {
 | 
						|
	case fd.Cardinality() == pref.Repeated && !fd.IsPacked():
 | 
						|
		switch fd.Kind() {
 | 
						|
		case pref.BoolKind:
 | 
						|
			return coderBoolSliceValue
 | 
						|
		case pref.EnumKind:
 | 
						|
			return coderEnumSliceValue
 | 
						|
		case pref.Int32Kind:
 | 
						|
			return coderInt32SliceValue
 | 
						|
		case pref.Sint32Kind:
 | 
						|
			return coderSint32SliceValue
 | 
						|
		case pref.Uint32Kind:
 | 
						|
			return coderUint32SliceValue
 | 
						|
		case pref.Int64Kind:
 | 
						|
			return coderInt64SliceValue
 | 
						|
		case pref.Sint64Kind:
 | 
						|
			return coderSint64SliceValue
 | 
						|
		case pref.Uint64Kind:
 | 
						|
			return coderUint64SliceValue
 | 
						|
		case pref.Sfixed32Kind:
 | 
						|
			return coderSfixed32SliceValue
 | 
						|
		case pref.Fixed32Kind:
 | 
						|
			return coderFixed32SliceValue
 | 
						|
		case pref.FloatKind:
 | 
						|
			return coderFloatSliceValue
 | 
						|
		case pref.Sfixed64Kind:
 | 
						|
			return coderSfixed64SliceValue
 | 
						|
		case pref.Fixed64Kind:
 | 
						|
			return coderFixed64SliceValue
 | 
						|
		case pref.DoubleKind:
 | 
						|
			return coderDoubleSliceValue
 | 
						|
		case pref.StringKind:
 | 
						|
			// We don't have a UTF-8 validating coder for repeated string fields.
 | 
						|
			// Value coders are used for extensions and maps.
 | 
						|
			// Extensions are never proto3, and maps never contain lists.
 | 
						|
			return coderStringSliceValue
 | 
						|
		case pref.BytesKind:
 | 
						|
			return coderBytesSliceValue
 | 
						|
		case pref.MessageKind:
 | 
						|
			return coderMessageSliceValue
 | 
						|
		case pref.GroupKind:
 | 
						|
			return coderGroupSliceValue
 | 
						|
		}
 | 
						|
	case fd.Cardinality() == pref.Repeated && fd.IsPacked():
 | 
						|
		switch fd.Kind() {
 | 
						|
		case pref.BoolKind:
 | 
						|
			return coderBoolPackedSliceValue
 | 
						|
		case pref.EnumKind:
 | 
						|
			return coderEnumPackedSliceValue
 | 
						|
		case pref.Int32Kind:
 | 
						|
			return coderInt32PackedSliceValue
 | 
						|
		case pref.Sint32Kind:
 | 
						|
			return coderSint32PackedSliceValue
 | 
						|
		case pref.Uint32Kind:
 | 
						|
			return coderUint32PackedSliceValue
 | 
						|
		case pref.Int64Kind:
 | 
						|
			return coderInt64PackedSliceValue
 | 
						|
		case pref.Sint64Kind:
 | 
						|
			return coderSint64PackedSliceValue
 | 
						|
		case pref.Uint64Kind:
 | 
						|
			return coderUint64PackedSliceValue
 | 
						|
		case pref.Sfixed32Kind:
 | 
						|
			return coderSfixed32PackedSliceValue
 | 
						|
		case pref.Fixed32Kind:
 | 
						|
			return coderFixed32PackedSliceValue
 | 
						|
		case pref.FloatKind:
 | 
						|
			return coderFloatPackedSliceValue
 | 
						|
		case pref.Sfixed64Kind:
 | 
						|
			return coderSfixed64PackedSliceValue
 | 
						|
		case pref.Fixed64Kind:
 | 
						|
			return coderFixed64PackedSliceValue
 | 
						|
		case pref.DoubleKind:
 | 
						|
			return coderDoublePackedSliceValue
 | 
						|
		}
 | 
						|
	default:
 | 
						|
		switch fd.Kind() {
 | 
						|
		default:
 | 
						|
		case pref.BoolKind:
 | 
						|
			return coderBoolValue
 | 
						|
		case pref.EnumKind:
 | 
						|
			return coderEnumValue
 | 
						|
		case pref.Int32Kind:
 | 
						|
			return coderInt32Value
 | 
						|
		case pref.Sint32Kind:
 | 
						|
			return coderSint32Value
 | 
						|
		case pref.Uint32Kind:
 | 
						|
			return coderUint32Value
 | 
						|
		case pref.Int64Kind:
 | 
						|
			return coderInt64Value
 | 
						|
		case pref.Sint64Kind:
 | 
						|
			return coderSint64Value
 | 
						|
		case pref.Uint64Kind:
 | 
						|
			return coderUint64Value
 | 
						|
		case pref.Sfixed32Kind:
 | 
						|
			return coderSfixed32Value
 | 
						|
		case pref.Fixed32Kind:
 | 
						|
			return coderFixed32Value
 | 
						|
		case pref.FloatKind:
 | 
						|
			return coderFloatValue
 | 
						|
		case pref.Sfixed64Kind:
 | 
						|
			return coderSfixed64Value
 | 
						|
		case pref.Fixed64Kind:
 | 
						|
			return coderFixed64Value
 | 
						|
		case pref.DoubleKind:
 | 
						|
			return coderDoubleValue
 | 
						|
		case pref.StringKind:
 | 
						|
			if strs.EnforceUTF8(fd) {
 | 
						|
				return coderStringValueValidateUTF8
 | 
						|
			}
 | 
						|
			return coderStringValue
 | 
						|
		case pref.BytesKind:
 | 
						|
			return coderBytesValue
 | 
						|
		case pref.MessageKind:
 | 
						|
			return coderMessageValue
 | 
						|
		case pref.GroupKind:
 | 
						|
			return coderGroupValue
 | 
						|
		}
 | 
						|
	}
 | 
						|
	panic(fmt.Sprintf("invalid field: no encoder for %v %v %v", fd.FullName(), fd.Cardinality(), fd.Kind()))
 | 
						|
}
 |