blob: 8c7c1213ff5cc88dcc80e9fc5d1e34333d15829a [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 Tsaib2f66be2019-05-22 00:42:45 -040013 "google.golang.org/protobuf/reflect/prototype"
Joe Tsai08e00302018-11-26 22:32:06 -080014)
15
16// Export is a zero-length named type that exists only to export a set of
17// functions that we do not want to appear in godoc.
18type Export struct{}
19
Joe Tsai0fc49f82019-05-01 12:29:25 -070020// enum is any enum type generated by protoc-gen-go
21// and must be a named int32 type.
22type enum = interface{}
23
Joe Tsai08e00302018-11-26 22:32:06 -080024// EnumOf returns the protoreflect.Enum interface over e.
Joe Tsai0fc49f82019-05-01 12:29:25 -070025func (Export) EnumOf(e enum) pref.Enum {
Damien Neila8593ba2019-01-08 16:18:07 -080026 if ev, ok := e.(pref.Enum); ok {
27 return ev
Joe Tsai08e00302018-11-26 22:32:06 -080028 }
29 return legacyWrapper.EnumOf(e)
30}
31
32// EnumTypeOf returns the protoreflect.EnumType for e.
Joe Tsai0fc49f82019-05-01 12:29:25 -070033func (Export) EnumTypeOf(e enum) pref.EnumType {
Damien Neila8593ba2019-01-08 16:18:07 -080034 if ev, ok := e.(pref.Enum); ok {
Joe Tsaib2f66be2019-05-22 00:42:45 -040035 return &prototype.Enum{
36 EnumDescriptor: ev.Descriptor(),
37 NewEnum: func(n pref.EnumNumber) pref.Enum {
38 return reflect.ValueOf(n).Convert(reflect.TypeOf(e)).Interface().(pref.Enum)
39 },
40 }
Joe Tsai08e00302018-11-26 22:32:06 -080041 }
42 return legacyWrapper.EnumTypeOf(e)
43}
44
Joe Tsai0fc49f82019-05-01 12:29:25 -070045// EnumDescriptorOf returns the protoreflect.EnumDescriptor for e.
46func (Export) EnumDescriptorOf(e enum) pref.EnumDescriptor {
47 if ev, ok := e.(pref.Enum); ok {
48 return ev.Descriptor()
49 }
50 return legacyWrapper.EnumDescriptorOf(e)
51}
52
Joe Tsai8e506a82019-03-16 00:05:34 -070053// EnumStringOf returns the enum value as a string, either as the name if
54// the number is resolvable, or the number formatted as a string.
55func (Export) EnumStringOf(ed pref.EnumDescriptor, n pref.EnumNumber) string {
56 ev := ed.Values().ByNumber(n)
57 if ev != nil {
58 return string(ev.Name())
59 }
60 return strconv.Itoa(int(n))
61}
62
Joe Tsai0fc49f82019-05-01 12:29:25 -070063// message is any message type generated by protoc-gen-go
64// and must be a pointer to a named struct type.
65type message = interface{}
66
Joe Tsai08e00302018-11-26 22:32:06 -080067// MessageOf returns the protoreflect.Message interface over m.
Joe Tsai0fc49f82019-05-01 12:29:25 -070068func (Export) MessageOf(m message) pref.Message {
Joe Tsai08e00302018-11-26 22:32:06 -080069 if mv, ok := m.(pref.ProtoMessage); ok {
70 return mv.ProtoReflect()
71 }
72 return legacyWrapper.MessageOf(m)
73}
74
75// MessageTypeOf returns the protoreflect.MessageType for m.
Joe Tsai0fc49f82019-05-01 12:29:25 -070076func (Export) MessageTypeOf(m message) pref.MessageType {
Joe Tsai08e00302018-11-26 22:32:06 -080077 if mv, ok := m.(pref.ProtoMessage); ok {
Joe Tsaib2f66be2019-05-22 00:42:45 -040078 return &prototype.Message{
79 MessageDescriptor: mv.ProtoReflect().Descriptor(),
80 NewMessage: func() pref.Message {
81 return reflect.New(reflect.TypeOf(m).Elem()).Interface().(pref.ProtoMessage).ProtoReflect()
82 },
83 }
Joe Tsai08e00302018-11-26 22:32:06 -080084 }
85 return legacyWrapper.MessageTypeOf(m)
86}
87
Joe Tsai0fc49f82019-05-01 12:29:25 -070088// MessageDescriptorOf returns the protoreflect.MessageDescriptor for m.
89func (Export) MessageDescriptorOf(m message) pref.MessageDescriptor {
90 if mv, ok := m.(pref.ProtoMessage); ok {
91 return mv.ProtoReflect().Descriptor()
Joe Tsai08e00302018-11-26 22:32:06 -080092 }
Joe Tsai0fc49f82019-05-01 12:29:25 -070093 return legacyWrapper.MessageDescriptorOf(m)
Joe Tsai08e00302018-11-26 22:32:06 -080094}
Joe Tsai1321a0e2019-03-20 09:46:22 -070095
96// MessageStringOf returns the message value as a string,
97// which is the message serialized in the protobuf text format.
98func (Export) MessageStringOf(m pref.ProtoMessage) string {
Damien Neil5c5b5312019-05-14 12:44:37 -070099 b, _ := prototext.MarshalOptions{AllowPartial: true}.Marshal(m)
Joe Tsai1321a0e2019-03-20 09:46:22 -0700100 return string(b)
101}