diff --git a/serialize/encoding.go b/serialize/encoding.go index fa97a9e..1fb6da0 100644 --- a/serialize/encoding.go +++ b/serialize/encoding.go @@ -1,6 +1,23 @@ package serialize -type Serializer interface { - Encode(v interface{}) ([]byte, error) - Decode(data []byte, v interface{}) error +import ( + "strings" +) + +type Codec interface { + Name() string + Marshal(interface{}) ([]byte, error) + Unmarshal([]byte, interface{}) error +} + +var ( + m = make(map[string]Codec) +) + +func Register(c Codec) { + m[strings.ToLower(c.Name())] = c +} + +func Get(name string) Codec { + return m[strings.ToLower(name)] } diff --git a/serialize/gob.go b/serialize/gob.go deleted file mode 100644 index 0bffa9c..0000000 --- a/serialize/gob.go +++ /dev/null @@ -1,23 +0,0 @@ -package serialize - -import ( - "bytes" - "encoding/gob" -) - -type gobSerializer struct{} - -func Gob() Serializer { - return gobSerializer{} -} - -func (gb gobSerializer) Encode(v interface{}) (data []byte, err error) { - buff := bytes.NewBuffer([]byte{}) - err = gob.NewEncoder(buff).Encode(v) - data = buff.Bytes() - return -} - -func (gb gobSerializer) Decode(data []byte, v interface{}) error { - return gob.NewDecoder(bytes.NewReader(data)).Decode(v) -} diff --git a/serialize/gob/gob.go b/serialize/gob/gob.go new file mode 100644 index 0000000..b042e6d --- /dev/null +++ b/serialize/gob/gob.go @@ -0,0 +1,34 @@ +package gob + +import ( + "bytes" + "encoding/gob" + + "github.com/pyihe/go-pkg/serialize" +) + +const Name = "gob" + +func init() { + serialize.Register(&gobCodec{}) +} + +type gobCodec struct { +} + +func (g *gobCodec) Name() string { + return Name +} + +func (g *gobCodec) Marshal(v interface{}) ([]byte, error) { + buff := bytes.NewBuffer([]byte{}) + err := gob.NewEncoder(buff).Encode(v) + if err != nil { + return nil, err + } + return buff.Bytes(), nil +} + +func (g *gobCodec) Unmarshal(data []byte, v interface{}) error { + return gob.NewDecoder(bytes.NewReader(data)).Decode(v) +} diff --git a/serialize/json.go b/serialize/json.go deleted file mode 100644 index 2409daf..0000000 --- a/serialize/json.go +++ /dev/null @@ -1,17 +0,0 @@ -package serialize - -import "encoding/json" - -type jsonSerializer struct{} - -func JSON() Serializer { - return jsonSerializer{} -} - -func (js jsonSerializer) Encode(v interface{}) (data []byte, err error) { - return json.Marshal(v) -} - -func (js jsonSerializer) Decode(data []byte, v interface{}) error { - return json.Unmarshal(data, v) -} diff --git a/serialize/json/json.go b/serialize/json/json.go new file mode 100644 index 0000000..b5d522c --- /dev/null +++ b/serialize/json/json.go @@ -0,0 +1,27 @@ +package json + +import ( + "encoding/json" + + "github.com/pyihe/go-pkg/serialize" +) + +const Name = "json" + +func init() { + serialize.Register(&jsCodec{}) +} + +type jsCodec struct{} + +func (js *jsCodec) Name() string { + return Name +} + +func (js *jsCodec) Marshal(v interface{}) ([]byte, error) { + return json.Marshal(v) +} + +func (js *jsCodec) Unmarshal(data []byte, v interface{}) error { + return json.Unmarshal(data, v) +} diff --git a/serialize/msgpack.go b/serialize/msgpack.go deleted file mode 100644 index c3239e3..0000000 --- a/serialize/msgpack.go +++ /dev/null @@ -1,17 +0,0 @@ -package serialize - -import "github.com/vmihailenco/msgpack/v5" - -type msgPack struct{} - -func Msgpack() Serializer { - return msgPack{} -} - -func (mp msgPack) Encode(v interface{}) (data []byte, err error) { - return msgpack.Marshal(v) -} - -func (mp msgPack) Decode(data []byte, v interface{}) error { - return msgpack.Unmarshal(data, v) -} diff --git a/serialize/msgpack/msgpack.go b/serialize/msgpack/msgpack.go new file mode 100644 index 0000000..6ec1f98 --- /dev/null +++ b/serialize/msgpack/msgpack.go @@ -0,0 +1,27 @@ +package msgpack + +import ( + "github.com/pyihe/go-pkg/serialize" + "github.com/vmihailenco/msgpack/v5" +) + +const Name = "msgpack" + +func init() { + serialize.Register(&msgpackCodec{}) +} + +type msgpackCodec struct { +} + +func (m *msgpackCodec) Name() string { + return Name +} + +func (m *msgpackCodec) Marshal(v interface{}) ([]byte, error) { + return msgpack.Marshal(v) +} + +func (m *msgpackCodec) Unmarshal(data []byte, v interface{}) error { + return msgpack.Unmarshal(data, v) +} diff --git a/serialize/proto.go b/serialize/proto.go deleted file mode 100644 index 13e4908..0000000 --- a/serialize/proto.go +++ /dev/null @@ -1,29 +0,0 @@ -package serialize - -import ( - "errors" - - "github.com/golang/protobuf/proto" -) - -type protoSerializer struct{} - -func Proto() Serializer { - return protoSerializer{} -} - -func (ps protoSerializer) Encode(v interface{}) (data []byte, err error) { - if m, ok := v.(proto.Message); ok { - return proto.Marshal(m) - } - err = errors.New("not proto.Message") - return -} - -func (ps protoSerializer) Decode(data []byte, v interface{}) (err error) { - if m, ok := v.(proto.Message); ok { - return proto.Unmarshal(data, m) - } - err = errors.New("not proto.Message") - return -} diff --git a/serialize/protobuffer/proto.go b/serialize/protobuffer/proto.go new file mode 100644 index 0000000..9085940 --- /dev/null +++ b/serialize/protobuffer/proto.go @@ -0,0 +1,37 @@ +package protobuffer + +import ( + "fmt" + + "github.com/golang/protobuf/proto" + "github.com/pyihe/go-pkg/serialize" +) + +const Name = "proto" + +func init() { + serialize.Register(&protoCodec{}) +} + +type protoCodec struct { +} + +func (p *protoCodec) Name() string { + return Name +} + +func (p *protoCodec) Marshal(v interface{}) ([]byte, error) { + vv, ok := v.(proto.Message) + if !ok { + return nil, fmt.Errorf("faild to marshal: message is %T, want proto.Message", v) + } + return proto.Marshal(vv) +} + +func (p *protoCodec) Unmarshal(data []byte, v interface{}) error { + vv, ok := v.(proto.Message) + if !ok { + return fmt.Errorf("failed to unmarshal: message is %T, want proto.Message", v) + } + return proto.Unmarshal(data, vv) +}