vendor/google.golang.org/protobuf/internal/impl/api_export.go
changeset 260 445e01aede7e
parent 256 6d9efbef00a9
equal deleted inserted replaced
259:db4911b0c721 260:445e01aede7e
    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 }