1*1c12ee1eSDan Willemsen// Copyright 2019 The Go Authors. All rights reserved. 2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style 3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file. 4*1c12ee1eSDan Willemsen 5*1c12ee1eSDan Willemsenpackage impl 6*1c12ee1eSDan Willemsen 7*1c12ee1eSDan Willemsenimport ( 8*1c12ee1eSDan Willemsen "fmt" 9*1c12ee1eSDan Willemsen 10*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protoreflect" 11*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protoregistry" 12*1c12ee1eSDan Willemsen) 13*1c12ee1eSDan Willemsen 14*1c12ee1eSDan Willemsen// weakFields adds methods to the exported WeakFields type for internal use. 15*1c12ee1eSDan Willemsen// 16*1c12ee1eSDan Willemsen// The exported type is an alias to an unnamed type, so methods can't be 17*1c12ee1eSDan Willemsen// defined directly on it. 18*1c12ee1eSDan Willemsentype weakFields WeakFields 19*1c12ee1eSDan Willemsen 20*1c12ee1eSDan Willemsenfunc (w weakFields) get(num protoreflect.FieldNumber) (protoreflect.ProtoMessage, bool) { 21*1c12ee1eSDan Willemsen m, ok := w[int32(num)] 22*1c12ee1eSDan Willemsen return m, ok 23*1c12ee1eSDan Willemsen} 24*1c12ee1eSDan Willemsen 25*1c12ee1eSDan Willemsenfunc (w *weakFields) set(num protoreflect.FieldNumber, m protoreflect.ProtoMessage) { 26*1c12ee1eSDan Willemsen if *w == nil { 27*1c12ee1eSDan Willemsen *w = make(weakFields) 28*1c12ee1eSDan Willemsen } 29*1c12ee1eSDan Willemsen (*w)[int32(num)] = m 30*1c12ee1eSDan Willemsen} 31*1c12ee1eSDan Willemsen 32*1c12ee1eSDan Willemsenfunc (w *weakFields) clear(num protoreflect.FieldNumber) { 33*1c12ee1eSDan Willemsen delete(*w, int32(num)) 34*1c12ee1eSDan Willemsen} 35*1c12ee1eSDan Willemsen 36*1c12ee1eSDan Willemsenfunc (Export) HasWeak(w WeakFields, num protoreflect.FieldNumber) bool { 37*1c12ee1eSDan Willemsen _, ok := w[int32(num)] 38*1c12ee1eSDan Willemsen return ok 39*1c12ee1eSDan Willemsen} 40*1c12ee1eSDan Willemsen 41*1c12ee1eSDan Willemsenfunc (Export) ClearWeak(w *WeakFields, num protoreflect.FieldNumber) { 42*1c12ee1eSDan Willemsen delete(*w, int32(num)) 43*1c12ee1eSDan Willemsen} 44*1c12ee1eSDan Willemsen 45*1c12ee1eSDan Willemsenfunc (Export) GetWeak(w WeakFields, num protoreflect.FieldNumber, name protoreflect.FullName) protoreflect.ProtoMessage { 46*1c12ee1eSDan Willemsen if m, ok := w[int32(num)]; ok { 47*1c12ee1eSDan Willemsen return m 48*1c12ee1eSDan Willemsen } 49*1c12ee1eSDan Willemsen mt, _ := protoregistry.GlobalTypes.FindMessageByName(name) 50*1c12ee1eSDan Willemsen if mt == nil { 51*1c12ee1eSDan Willemsen panic(fmt.Sprintf("message %v for weak field is not linked in", name)) 52*1c12ee1eSDan Willemsen } 53*1c12ee1eSDan Willemsen return mt.Zero().Interface() 54*1c12ee1eSDan Willemsen} 55*1c12ee1eSDan Willemsen 56*1c12ee1eSDan Willemsenfunc (Export) SetWeak(w *WeakFields, num protoreflect.FieldNumber, name protoreflect.FullName, m protoreflect.ProtoMessage) { 57*1c12ee1eSDan Willemsen if m != nil { 58*1c12ee1eSDan Willemsen mt, _ := protoregistry.GlobalTypes.FindMessageByName(name) 59*1c12ee1eSDan Willemsen if mt == nil { 60*1c12ee1eSDan Willemsen panic(fmt.Sprintf("message %v for weak field is not linked in", name)) 61*1c12ee1eSDan Willemsen } 62*1c12ee1eSDan Willemsen if mt != m.ProtoReflect().Type() { 63*1c12ee1eSDan Willemsen panic(fmt.Sprintf("invalid message type for weak field: got %T, want %T", m, mt.Zero().Interface())) 64*1c12ee1eSDan Willemsen } 65*1c12ee1eSDan Willemsen } 66*1c12ee1eSDan Willemsen if m == nil || !m.ProtoReflect().IsValid() { 67*1c12ee1eSDan Willemsen delete(*w, int32(num)) 68*1c12ee1eSDan Willemsen return 69*1c12ee1eSDan Willemsen } 70*1c12ee1eSDan Willemsen if *w == nil { 71*1c12ee1eSDan Willemsen *w = make(weakFields) 72*1c12ee1eSDan Willemsen } 73*1c12ee1eSDan Willemsen (*w)[int32(num)] = m 74*1c12ee1eSDan Willemsen} 75