blob: 8c35f8f2854d11beca86e93bbeadf81084b5f638 [file] [log] [blame]
Joe Tsai08e00302018-11-26 22:32:06 -08001// 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.
4
5package impl
6
7import (
Joe Tsai0fc49f82019-05-01 12:29:25 -07008 "reflect"
Joe Tsai8e506a82019-03-16 00:05:34 -07009 "strconv"
10
Damien Neil5c5b5312019-05-14 12:44:37 -070011 "google.golang.org/protobuf/encoding/prototext"
Damien Neile89e6242019-05-13 23:55:40 -070012 pref "google.golang.org/protobuf/reflect/protoreflect"
Joe Tsai08e00302018-11-26 22:32:06 -080013)
14
15// Export is a zero-length named type that exists only to export a set of
16// functions that we do not want to appear in godoc.
17type Export struct{}
18
Joe Tsai0fc49f82019-05-01 12:29:25 -070019// enum is any enum type generated by protoc-gen-go
20// and must be a named int32 type.
21type enum = interface{}
22
Joe Tsai08e00302018-11-26 22:32:06 -080023// EnumOf returns the protoreflect.Enum interface over e.
Joe Tsai0fc49f82019-05-01 12:29:25 -070024func (Export) EnumOf(e enum) pref.Enum {
Damien Neila8593ba2019-01-08 16:18:07 -080025 if ev, ok := e.(pref.Enum); ok {
26 return ev
Joe Tsai08e00302018-11-26 22:32:06 -080027 }
Joe Tsai21ade492019-05-22 13:42:54 -040028 return legacyWrapEnum(reflect.ValueOf(e))
Joe Tsai08e00302018-11-26 22:32:06 -080029}
30
31// EnumTypeOf returns the protoreflect.EnumType for e.
Joe Tsai0fc49f82019-05-01 12:29:25 -070032func (Export) EnumTypeOf(e enum) pref.EnumType {
Damien Neila8593ba2019-01-08 16:18:07 -080033 if ev, ok := e.(pref.Enum); ok {
Damien Neil16163b42019-08-06 15:43:25 -070034 return ev.Type()
Joe Tsai08e00302018-11-26 22:32:06 -080035 }
Joe Tsai21ade492019-05-22 13:42:54 -040036 return legacyLoadEnumType(reflect.TypeOf(e))
Joe Tsai08e00302018-11-26 22:32:06 -080037}
38
Joe Tsai0fc49f82019-05-01 12:29:25 -070039// EnumDescriptorOf returns the protoreflect.EnumDescriptor for e.
40func (Export) EnumDescriptorOf(e enum) pref.EnumDescriptor {
41 if ev, ok := e.(pref.Enum); ok {
42 return ev.Descriptor()
43 }
Joe Tsai21ade492019-05-22 13:42:54 -040044 return LegacyLoadEnumDesc(reflect.TypeOf(e))
Joe Tsai0fc49f82019-05-01 12:29:25 -070045}
46
Joe Tsai8e506a82019-03-16 00:05:34 -070047// EnumStringOf returns the enum value as a string, either as the name if
48// the number is resolvable, or the number formatted as a string.
49func (Export) EnumStringOf(ed pref.EnumDescriptor, n pref.EnumNumber) string {
50 ev := ed.Values().ByNumber(n)
51 if ev != nil {
52 return string(ev.Name())
53 }
54 return strconv.Itoa(int(n))
55}
56
Joe Tsai0fc49f82019-05-01 12:29:25 -070057// message is any message type generated by protoc-gen-go
58// and must be a pointer to a named struct type.
59type message = interface{}
60
Joe Tsai08e00302018-11-26 22:32:06 -080061// MessageOf returns the protoreflect.Message interface over m.
Joe Tsai0fc49f82019-05-01 12:29:25 -070062func (Export) MessageOf(m message) pref.Message {
Joe Tsai08e00302018-11-26 22:32:06 -080063 if mv, ok := m.(pref.ProtoMessage); ok {
64 return mv.ProtoReflect()
65 }
Joe Tsai21ade492019-05-22 13:42:54 -040066 return legacyWrapMessage(reflect.ValueOf(m)).ProtoReflect()
Joe Tsai08e00302018-11-26 22:32:06 -080067}
68
69// MessageTypeOf returns the protoreflect.MessageType for m.
Joe Tsai0fc49f82019-05-01 12:29:25 -070070func (Export) MessageTypeOf(m message) pref.MessageType {
Joe Tsai08e00302018-11-26 22:32:06 -080071 if mv, ok := m.(pref.ProtoMessage); ok {
Damien Neil16163b42019-08-06 15:43:25 -070072 return mv.ProtoReflect().Type()
Joe Tsai08e00302018-11-26 22:32:06 -080073 }
Damien Neil16163b42019-08-06 15:43:25 -070074 return legacyLoadMessageInfo(reflect.TypeOf(m))
Joe Tsai08e00302018-11-26 22:32:06 -080075}
76
Joe Tsai0fc49f82019-05-01 12:29:25 -070077// MessageDescriptorOf returns the protoreflect.MessageDescriptor for m.
78func (Export) MessageDescriptorOf(m message) pref.MessageDescriptor {
79 if mv, ok := m.(pref.ProtoMessage); ok {
80 return mv.ProtoReflect().Descriptor()
Joe Tsai08e00302018-11-26 22:32:06 -080081 }
Joe Tsai21ade492019-05-22 13:42:54 -040082 return LegacyLoadMessageDesc(reflect.TypeOf(m))
Joe Tsai08e00302018-11-26 22:32:06 -080083}
Joe Tsai1321a0e2019-03-20 09:46:22 -070084
85// MessageStringOf returns the message value as a string,
86// which is the message serialized in the protobuf text format.
87func (Export) MessageStringOf(m pref.ProtoMessage) string {
Damien Neil5c5b5312019-05-14 12:44:37 -070088 b, _ := prototext.MarshalOptions{AllowPartial: true}.Marshal(m)
Joe Tsai1321a0e2019-03-20 09:46:22 -070089 return string(b)
90}
Joe Tsai21ade492019-05-22 13:42:54 -040091
Damien Neilf1e905b2019-08-08 15:45:59 -070092// ExtensionDescFromType returns the legacy protoV1.ExtensionDesc for t.
93func (Export) ExtensionDescFromType(t pref.ExtensionType) *ExtensionInfo {
Joe Tsai21ade492019-05-22 13:42:54 -040094 return legacyExtensionDescFromType(t)
95}