2020-11-25 13:01:53 +02:00
|
|
|
package serial
|
|
|
|
|
|
|
|
import (
|
2023-08-10 07:43:34 +03:00
|
|
|
"google.golang.org/protobuf/proto"
|
|
|
|
"google.golang.org/protobuf/reflect/protoreflect"
|
|
|
|
"google.golang.org/protobuf/reflect/protoregistry"
|
2020-11-25 13:01:53 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
// ToTypedMessage converts a proto Message into TypedMessage.
|
|
|
|
func ToTypedMessage(message proto.Message) *TypedMessage {
|
|
|
|
if message == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
settings, _ := proto.Marshal(message)
|
|
|
|
return &TypedMessage{
|
|
|
|
Type: GetMessageType(message),
|
|
|
|
Value: settings,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetMessageType returns the name of this proto Message.
|
|
|
|
func GetMessageType(message proto.Message) string {
|
2023-08-10 07:43:34 +03:00
|
|
|
return string(message.ProtoReflect().Descriptor().FullName())
|
2020-11-25 13:01:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// GetInstance creates a new instance of the message with messageType.
|
|
|
|
func GetInstance(messageType string) (interface{}, error) {
|
2023-08-10 07:43:34 +03:00
|
|
|
messageTypeDescriptor := protoreflect.FullName(messageType)
|
|
|
|
mType, err := protoregistry.GlobalTypes.FindMessageByName(messageTypeDescriptor)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
2020-11-25 13:01:53 +02:00
|
|
|
}
|
2023-08-10 07:43:34 +03:00
|
|
|
return mType.New().Interface(), nil
|
2020-11-25 13:01:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// GetInstance converts current TypedMessage into a proto Message.
|
|
|
|
func (v *TypedMessage) GetInstance() (proto.Message, error) {
|
|
|
|
instance, err := GetInstance(v.Type)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
protoMessage := instance.(proto.Message)
|
|
|
|
if err := proto.Unmarshal(v.Value, protoMessage); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return protoMessage, nil
|
|
|
|
}
|