From 884d59e280e37deb25010ef31be0baca4778f8cb Mon Sep 17 00:00:00 2001 From: Adphi Date: Thu, 17 Mar 2022 15:22:31 +0100 Subject: [PATCH] codec: add codec to support both vtproto and google.golang.org/protobuf and probably gogoproto Signed-off-by: Adphi --- codec/codec.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 codec/codec.go diff --git a/codec/codec.go b/codec/codec.go new file mode 100644 index 0000000..3061018 --- /dev/null +++ b/codec/codec.go @@ -0,0 +1,52 @@ +package codec + +import ( + "fmt" + + "google.golang.org/protobuf/proto" +) + +// Name is the name registered for the proto compressor. +const Name = "proto" + +type Codec struct{} + +type vtprotoMessage interface { + MarshalVT() ([]byte, error) + UnmarshalVT([]byte) error +} + +type protoMessage interface { + Marshal() ([]byte, error) + Unmarshal([]byte) error +} + +func (Codec) Marshal(v interface{}) ([]byte, error) { + switch m := v.(type) { + case vtprotoMessage: + return m.MarshalVT() + case protoMessage: + return m.Marshal() + case proto.Message: + return proto.Marshal(m) + default: + return nil, fmt.Errorf("failed to marshal, message is %T, want proto.Message", v) + } +} + +func (Codec) Unmarshal(data []byte, v interface{}) error { + switch m := v.(type) { + case vtprotoMessage: + return m.UnmarshalVT(data) + case protoMessage: + return m.Unmarshal(data) + case proto.Message: + return proto.Unmarshal(data, m) + default: + return fmt.Errorf("failed to unmarshal, message is %T, want proto.Message", v) + } +} + +func (Codec) Name() string { + return Name +}