package ptypes
import (
anypb
)
const urlPrefix = "type.googleapis.com/"
func ( *anypb.Any) (string, error) {
, := anyMessageName()
return string(),
}
func ( *anypb.Any) (protoreflect.FullName, error) {
if == nil {
return "", fmt.Errorf("message is nil")
}
:= protoreflect.FullName(.TypeUrl)
if := strings.LastIndex(.TypeUrl, "/"); >= 0 {
= [+len("/"):]
}
if !.IsValid() {
return "", fmt.Errorf("message type url %q is invalid", .TypeUrl)
}
return , nil
}
func ( proto.Message) (*anypb.Any, error) {
switch dm := .(type) {
case DynamicAny:
= .Message
case *DynamicAny:
if == nil {
return nil, proto.ErrNil
}
= .Message
}
, := proto.Marshal()
if != nil {
return nil,
}
return &anypb.Any{TypeUrl: urlPrefix + proto.MessageName(), Value: }, nil
}
func ( *anypb.Any) (proto.Message, error) {
, := anyMessageName()
if != nil {
return nil,
}
, := protoregistry.GlobalTypes.FindMessageByName()
if != nil {
return nil,
}
return proto.MessageV1(.New().Interface()), nil
}
func ( *anypb.Any, proto.Message) error {
if , := .(*DynamicAny); {
if .Message == nil {
var error
.Message, = Empty()
if != nil {
return
}
}
= .Message
}
, := AnyMessageName()
if != nil {
return
}
:= proto.MessageName()
if != {
return fmt.Errorf("mismatched message type: got %q want %q", , )
}
return proto.Unmarshal(.Value, )
}
func ( *anypb.Any, proto.Message) bool {
if == nil || == nil {
return false
}
:= proto.MessageName()
if !strings.HasSuffix(.TypeUrl, ) {
return false
}
return len(.TypeUrl) == len() || .TypeUrl[len(.TypeUrl)-len()-1] == '/'
}
type DynamicAny struct{ proto.Message }
func ( DynamicAny) () string {
if .Message == nil {
return "<nil>"
}
return .Message.String()
}
func ( DynamicAny) () {
if .Message == nil {
return
}
.Message.Reset()
}
func ( DynamicAny) () {
return
}
func ( DynamicAny) () protoreflect.Message {
if .Message == nil {
return nil
}
return dynamicAny{proto.MessageReflect(.Message)}
}
type dynamicAny struct{ protoreflect.Message }
func ( dynamicAny) () protoreflect.MessageType {
return dynamicAnyType{.Message.Type()}
}
func ( dynamicAny) () protoreflect.Message {
return dynamicAnyType{.Message.Type()}.New()
}
func ( dynamicAny) () protoreflect.ProtoMessage {
return DynamicAny{proto.MessageV1(.Message.Interface())}
}
type dynamicAnyType struct{ protoreflect.MessageType }
func ( dynamicAnyType) () protoreflect.Message {
return dynamicAny{.MessageType.New()}
}
func ( dynamicAnyType) () protoreflect.Message {
return dynamicAny{.MessageType.Zero()}
}