1
// Copyright 2018 The Go Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
11
"google.golang.org/protobuf/reflect/protoreflect"
14
type mapConverter struct {
15
goType reflect.Type // map[K]V
16
keyConv, valConv Converter
19
func newMapConverter(t reflect.Type, fd protoreflect.FieldDescriptor) *mapConverter {
20
if t.Kind() != reflect.Map {
21
panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName()))
25
keyConv: newSingularConverter(t.Key(), fd.MapKey()),
26
valConv: newSingularConverter(t.Elem(), fd.MapValue()),
30
func (c *mapConverter) PBValueOf(v reflect.Value) protoreflect.Value {
31
if v.Type() != c.goType {
32
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
34
return protoreflect.ValueOfMap(&mapReflect{v, c.keyConv, c.valConv})
37
func (c *mapConverter) GoValueOf(v protoreflect.Value) reflect.Value {
38
return v.Map().(*mapReflect).v
41
func (c *mapConverter) IsValidPB(v protoreflect.Value) bool {
42
mapv, ok := v.Interface().(*mapReflect)
46
return mapv.v.Type() == c.goType
49
func (c *mapConverter) IsValidGo(v reflect.Value) bool {
50
return v.IsValid() && v.Type() == c.goType
53
func (c *mapConverter) New() protoreflect.Value {
54
return c.PBValueOf(reflect.MakeMap(c.goType))
57
func (c *mapConverter) Zero() protoreflect.Value {
58
return c.PBValueOf(reflect.Zero(c.goType))
61
type mapReflect struct {
62
v reflect.Value // map[K]V
67
func (ms *mapReflect) Len() int {
70
func (ms *mapReflect) Has(k protoreflect.MapKey) bool {
71
rk := ms.keyConv.GoValueOf(k.Value())
72
rv := ms.v.MapIndex(rk)
75
func (ms *mapReflect) Get(k protoreflect.MapKey) protoreflect.Value {
76
rk := ms.keyConv.GoValueOf(k.Value())
77
rv := ms.v.MapIndex(rk)
79
return protoreflect.Value{}
81
return ms.valConv.PBValueOf(rv)
83
func (ms *mapReflect) Set(k protoreflect.MapKey, v protoreflect.Value) {
84
rk := ms.keyConv.GoValueOf(k.Value())
85
rv := ms.valConv.GoValueOf(v)
86
ms.v.SetMapIndex(rk, rv)
88
func (ms *mapReflect) Clear(k protoreflect.MapKey) {
89
rk := ms.keyConv.GoValueOf(k.Value())
90
ms.v.SetMapIndex(rk, reflect.Value{})
92
func (ms *mapReflect) Mutable(k protoreflect.MapKey) protoreflect.Value {
93
if _, ok := ms.valConv.(*messageConverter); !ok {
94
panic("invalid Mutable on map with non-message value type")
103
func (ms *mapReflect) Range(f func(protoreflect.MapKey, protoreflect.Value) bool) {
104
iter := mapRange(ms.v)
106
k := ms.keyConv.PBValueOf(iter.Key()).MapKey()
107
v := ms.valConv.PBValueOf(iter.Value())
113
func (ms *mapReflect) NewValue() protoreflect.Value {
114
return ms.valConv.New()
116
func (ms *mapReflect) IsValid() bool {
119
func (ms *mapReflect) protoUnwrap() interface{} {
120
return ms.v.Interface()