10 "strconv" |
10 "strconv" |
11 |
11 |
12 "google.golang.org/protobuf/encoding/prototext" |
12 "google.golang.org/protobuf/encoding/prototext" |
13 "google.golang.org/protobuf/internal/errors" |
13 "google.golang.org/protobuf/internal/errors" |
14 "google.golang.org/protobuf/proto" |
14 "google.golang.org/protobuf/proto" |
15 pref "google.golang.org/protobuf/reflect/protoreflect" |
15 "google.golang.org/protobuf/reflect/protoreflect" |
16 piface "google.golang.org/protobuf/runtime/protoiface" |
16 "google.golang.org/protobuf/runtime/protoiface" |
17 ) |
17 ) |
18 |
18 |
19 // Export is a zero-length named type that exists only to export a set of |
19 // Export is a zero-length named type that exists only to export a set of |
20 // functions that we do not want to appear in godoc. |
20 // functions that we do not want to appear in godoc. |
21 type Export struct{} |
21 type Export struct{} |
30 // and must be a named int32 type. |
30 // and must be a named int32 type. |
31 type enum = interface{} |
31 type enum = interface{} |
32 |
32 |
33 // EnumOf returns the protoreflect.Enum interface over e. |
33 // EnumOf returns the protoreflect.Enum interface over e. |
34 // It returns nil if e is nil. |
34 // It returns nil if e is nil. |
35 func (Export) EnumOf(e enum) pref.Enum { |
35 func (Export) EnumOf(e enum) protoreflect.Enum { |
36 switch e := e.(type) { |
36 switch e := e.(type) { |
37 case nil: |
37 case nil: |
38 return nil |
38 return nil |
39 case pref.Enum: |
39 case protoreflect.Enum: |
40 return e |
40 return e |
41 default: |
41 default: |
42 return legacyWrapEnum(reflect.ValueOf(e)) |
42 return legacyWrapEnum(reflect.ValueOf(e)) |
43 } |
43 } |
44 } |
44 } |
45 |
45 |
46 // EnumDescriptorOf returns the protoreflect.EnumDescriptor for e. |
46 // EnumDescriptorOf returns the protoreflect.EnumDescriptor for e. |
47 // It returns nil if e is nil. |
47 // It returns nil if e is nil. |
48 func (Export) EnumDescriptorOf(e enum) pref.EnumDescriptor { |
48 func (Export) EnumDescriptorOf(e enum) protoreflect.EnumDescriptor { |
49 switch e := e.(type) { |
49 switch e := e.(type) { |
50 case nil: |
50 case nil: |
51 return nil |
51 return nil |
52 case pref.Enum: |
52 case protoreflect.Enum: |
53 return e.Descriptor() |
53 return e.Descriptor() |
54 default: |
54 default: |
55 return LegacyLoadEnumDesc(reflect.TypeOf(e)) |
55 return LegacyLoadEnumDesc(reflect.TypeOf(e)) |
56 } |
56 } |
57 } |
57 } |
58 |
58 |
59 // EnumTypeOf returns the protoreflect.EnumType for e. |
59 // EnumTypeOf returns the protoreflect.EnumType for e. |
60 // It returns nil if e is nil. |
60 // It returns nil if e is nil. |
61 func (Export) EnumTypeOf(e enum) pref.EnumType { |
61 func (Export) EnumTypeOf(e enum) protoreflect.EnumType { |
62 switch e := e.(type) { |
62 switch e := e.(type) { |
63 case nil: |
63 case nil: |
64 return nil |
64 return nil |
65 case pref.Enum: |
65 case protoreflect.Enum: |
66 return e.Type() |
66 return e.Type() |
67 default: |
67 default: |
68 return legacyLoadEnumType(reflect.TypeOf(e)) |
68 return legacyLoadEnumType(reflect.TypeOf(e)) |
69 } |
69 } |
70 } |
70 } |
71 |
71 |
72 // EnumStringOf returns the enum value as a string, either as the name if |
72 // EnumStringOf returns the enum value as a string, either as the name if |
73 // the number is resolvable, or the number formatted as a string. |
73 // the number is resolvable, or the number formatted as a string. |
74 func (Export) EnumStringOf(ed pref.EnumDescriptor, n pref.EnumNumber) string { |
74 func (Export) EnumStringOf(ed protoreflect.EnumDescriptor, n protoreflect.EnumNumber) string { |
75 ev := ed.Values().ByNumber(n) |
75 ev := ed.Values().ByNumber(n) |
76 if ev != nil { |
76 if ev != nil { |
77 return string(ev.Name()) |
77 return string(ev.Name()) |
78 } |
78 } |
79 return strconv.Itoa(int(n)) |
79 return strconv.Itoa(int(n)) |
82 // message is any message type generated by protoc-gen-go |
82 // message is any message type generated by protoc-gen-go |
83 // and must be a pointer to a named struct type. |
83 // and must be a pointer to a named struct type. |
84 type message = interface{} |
84 type message = interface{} |
85 |
85 |
86 // legacyMessageWrapper wraps a v2 message as a v1 message. |
86 // legacyMessageWrapper wraps a v2 message as a v1 message. |
87 type legacyMessageWrapper struct{ m pref.ProtoMessage } |
87 type legacyMessageWrapper struct{ m protoreflect.ProtoMessage } |
88 |
88 |
89 func (m legacyMessageWrapper) Reset() { proto.Reset(m.m) } |
89 func (m legacyMessageWrapper) Reset() { proto.Reset(m.m) } |
90 func (m legacyMessageWrapper) String() string { return Export{}.MessageStringOf(m.m) } |
90 func (m legacyMessageWrapper) String() string { return Export{}.MessageStringOf(m.m) } |
91 func (m legacyMessageWrapper) ProtoMessage() {} |
91 func (m legacyMessageWrapper) ProtoMessage() {} |
92 |
92 |
93 // ProtoMessageV1Of converts either a v1 or v2 message to a v1 message. |
93 // ProtoMessageV1Of converts either a v1 or v2 message to a v1 message. |
94 // It returns nil if m is nil. |
94 // It returns nil if m is nil. |
95 func (Export) ProtoMessageV1Of(m message) piface.MessageV1 { |
95 func (Export) ProtoMessageV1Of(m message) protoiface.MessageV1 { |
96 switch mv := m.(type) { |
96 switch mv := m.(type) { |
97 case nil: |
97 case nil: |
98 return nil |
98 return nil |
99 case piface.MessageV1: |
99 case protoiface.MessageV1: |
100 return mv |
100 return mv |
101 case unwrapper: |
101 case unwrapper: |
102 return Export{}.ProtoMessageV1Of(mv.protoUnwrap()) |
102 return Export{}.ProtoMessageV1Of(mv.protoUnwrap()) |
103 case pref.ProtoMessage: |
103 case protoreflect.ProtoMessage: |
104 return legacyMessageWrapper{mv} |
104 return legacyMessageWrapper{mv} |
105 default: |
105 default: |
106 panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m)) |
106 panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m)) |
107 } |
107 } |
108 } |
108 } |
109 |
109 |
110 func (Export) protoMessageV2Of(m message) pref.ProtoMessage { |
110 func (Export) protoMessageV2Of(m message) protoreflect.ProtoMessage { |
111 switch mv := m.(type) { |
111 switch mv := m.(type) { |
112 case nil: |
112 case nil: |
113 return nil |
113 return nil |
114 case pref.ProtoMessage: |
114 case protoreflect.ProtoMessage: |
115 return mv |
115 return mv |
116 case legacyMessageWrapper: |
116 case legacyMessageWrapper: |
117 return mv.m |
117 return mv.m |
118 case piface.MessageV1: |
118 case protoiface.MessageV1: |
119 return nil |
119 return nil |
120 default: |
120 default: |
121 panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m)) |
121 panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m)) |
122 } |
122 } |
123 } |
123 } |
124 |
124 |
125 // ProtoMessageV2Of converts either a v1 or v2 message to a v2 message. |
125 // ProtoMessageV2Of converts either a v1 or v2 message to a v2 message. |
126 // It returns nil if m is nil. |
126 // It returns nil if m is nil. |
127 func (Export) ProtoMessageV2Of(m message) pref.ProtoMessage { |
127 func (Export) ProtoMessageV2Of(m message) protoreflect.ProtoMessage { |
128 if m == nil { |
128 if m == nil { |
129 return nil |
129 return nil |
130 } |
130 } |
131 if mv := (Export{}).protoMessageV2Of(m); mv != nil { |
131 if mv := (Export{}).protoMessageV2Of(m); mv != nil { |
132 return mv |
132 return mv |
134 return legacyWrapMessage(reflect.ValueOf(m)).Interface() |
134 return legacyWrapMessage(reflect.ValueOf(m)).Interface() |
135 } |
135 } |
136 |
136 |
137 // MessageOf returns the protoreflect.Message interface over m. |
137 // MessageOf returns the protoreflect.Message interface over m. |
138 // It returns nil if m is nil. |
138 // It returns nil if m is nil. |
139 func (Export) MessageOf(m message) pref.Message { |
139 func (Export) MessageOf(m message) protoreflect.Message { |
140 if m == nil { |
140 if m == nil { |
141 return nil |
141 return nil |
142 } |
142 } |
143 if mv := (Export{}).protoMessageV2Of(m); mv != nil { |
143 if mv := (Export{}).protoMessageV2Of(m); mv != nil { |
144 return mv.ProtoReflect() |
144 return mv.ProtoReflect() |
146 return legacyWrapMessage(reflect.ValueOf(m)) |
146 return legacyWrapMessage(reflect.ValueOf(m)) |
147 } |
147 } |
148 |
148 |
149 // MessageDescriptorOf returns the protoreflect.MessageDescriptor for m. |
149 // MessageDescriptorOf returns the protoreflect.MessageDescriptor for m. |
150 // It returns nil if m is nil. |
150 // It returns nil if m is nil. |
151 func (Export) MessageDescriptorOf(m message) pref.MessageDescriptor { |
151 func (Export) MessageDescriptorOf(m message) protoreflect.MessageDescriptor { |
152 if m == nil { |
152 if m == nil { |
153 return nil |
153 return nil |
154 } |
154 } |
155 if mv := (Export{}).protoMessageV2Of(m); mv != nil { |
155 if mv := (Export{}).protoMessageV2Of(m); mv != nil { |
156 return mv.ProtoReflect().Descriptor() |
156 return mv.ProtoReflect().Descriptor() |
158 return LegacyLoadMessageDesc(reflect.TypeOf(m)) |
158 return LegacyLoadMessageDesc(reflect.TypeOf(m)) |
159 } |
159 } |
160 |
160 |
161 // MessageTypeOf returns the protoreflect.MessageType for m. |
161 // MessageTypeOf returns the protoreflect.MessageType for m. |
162 // It returns nil if m is nil. |
162 // It returns nil if m is nil. |
163 func (Export) MessageTypeOf(m message) pref.MessageType { |
163 func (Export) MessageTypeOf(m message) protoreflect.MessageType { |
164 if m == nil { |
164 if m == nil { |
165 return nil |
165 return nil |
166 } |
166 } |
167 if mv := (Export{}).protoMessageV2Of(m); mv != nil { |
167 if mv := (Export{}).protoMessageV2Of(m); mv != nil { |
168 return mv.ProtoReflect().Type() |
168 return mv.ProtoReflect().Type() |
170 return legacyLoadMessageType(reflect.TypeOf(m), "") |
170 return legacyLoadMessageType(reflect.TypeOf(m), "") |
171 } |
171 } |
172 |
172 |
173 // MessageStringOf returns the message value as a string, |
173 // MessageStringOf returns the message value as a string, |
174 // which is the message serialized in the protobuf text format. |
174 // which is the message serialized in the protobuf text format. |
175 func (Export) MessageStringOf(m pref.ProtoMessage) string { |
175 func (Export) MessageStringOf(m protoreflect.ProtoMessage) string { |
176 return prototext.MarshalOptions{Multiline: false}.Format(m) |
176 return prototext.MarshalOptions{Multiline: false}.Format(m) |
177 } |
177 } |