github.com/glide-im/glide@v1.6.0/pkg/messages/codec.go (about) 1 package messages 2 3 import ( 4 "encoding/json" 5 "errors" 6 "google.golang.org/protobuf/proto" 7 "strings" 8 ) 9 10 var ProtoBuffCodec = protobufCodec{} 11 var JsonCodec = jsonCodec{} 12 var DefaultCodec = JsonCodec 13 14 var errDecode = "message decode error: " 15 16 func IsDecodeError(err error) bool { 17 return err != nil && strings.HasPrefix(err.Error(), errDecode) 18 } 19 20 type Codec interface { 21 Decode(data []byte, i interface{}) error 22 Encode(i interface{}) ([]byte, error) 23 } 24 25 type protobufCodec struct { 26 } 27 28 func (p protobufCodec) Decode(data []byte, i interface{}) error { 29 message, ok := i.(proto.Message) 30 if !ok { 31 return errors.New("illegal argument, not implement proto.GlideMessage") 32 } 33 return proto.Unmarshal(data, message) 34 } 35 36 func (p protobufCodec) Encode(i interface{}) ([]byte, error) { 37 message, ok := i.(proto.Message) 38 if !ok { 39 return nil, errors.New("illegal argument, not implement proto.GlideMessage") 40 } 41 return proto.Marshal(message) 42 } 43 44 type jsonCodec struct { 45 } 46 47 func (j jsonCodec) Decode(data []byte, i interface{}) error { 48 err := json.Unmarshal(data, i) 49 if err != nil { 50 return errors.New(errDecode + err.Error()) 51 } 52 return nil 53 } 54 55 func (j jsonCodec) Encode(i interface{}) ([]byte, error) { 56 return json.Marshal(i) 57 } 58 59 type GlideProtocol struct { 60 }