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  }