Created
June 15, 2020 02:49
-
-
Save JackyCZJ/018efc69a10bfc26c42a12d4a850d246 to your computer and use it in GitHub Desktop.
nats protobuf encoding
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package protobuf_nats | |
import ( | |
"errors" | |
"github.com/nats-io/nats.go" | |
"google.golang.org/protobuf/encoding/protojson" | |
"google.golang.org/protobuf/proto" | |
) | |
// Additional index for registered Encoders. | |
const ( | |
PROTOBUF_ENCODER = "protobuf" | |
) | |
func init() { | |
// Register protobuf encoder | |
nats.RegisterEncoder(PROTOBUF_ENCODER, &ProtobufEncoder{}) | |
} | |
// ProtobufEncoder is a protobuf implementation for EncodedConn | |
// This encoder will use the builtin protobuf lib to Marshal | |
// and Unmarshal structs. | |
type ProtobufEncoder struct { | |
// Empty | |
} | |
var ( | |
ErrInvalidProtoMsgEncode = errors.New("nats: Invalid protobuf proto.Message object passed to encode") | |
ErrInvalidProtoMsgDecode = errors.New("nats: Invalid protobuf proto.Message object passed to decode") | |
) | |
// Encode | |
func (pb *ProtobufEncoder) Encode(subject string, v interface{}) ([]byte, error) { | |
if v == nil { | |
return nil, nil | |
} | |
i, found := v.(proto.Message) | |
if !found { | |
return nil, ErrInvalidProtoMsgEncode | |
} | |
b, err := protojson.Marshal(i) | |
if err != nil { | |
return nil, err | |
} | |
return b, nil | |
} | |
// Decode | |
func (pb *ProtobufEncoder) Decode(subject string, data []byte, vPtr interface{}) error { | |
if _, ok := vPtr.(*interface{}); ok { | |
return nil | |
} | |
i, found := vPtr.(proto.Message) | |
if !found { | |
return ErrInvalidProtoMsgDecode | |
} | |
return protojson.Unmarshal(data, i) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment