micro/codec/noop.go
Vasiliy Tolstov 2101e994d9 add Frame support in noop codec
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
2020-11-25 09:59:28 +03:00

98 lines
1.5 KiB
Go

package codec
import (
"io"
"io/ioutil"
)
type noopCodec struct {
}
// Frame gives us the ability to define raw data to send over the pipes
type Frame struct {
Data []byte
}
func (c *noopCodec) ReadHeader(conn io.ReadWriter, m *Message, t MessageType) error {
return nil
}
func (c *noopCodec) ReadBody(conn io.ReadWriter, b interface{}) error {
// read bytes
buf, err := ioutil.ReadAll(conn)
if err != nil {
return err
}
if b == nil {
return nil
}
switch v := b.(type) {
case []byte:
v = buf
case *[]byte:
*v = buf
case *Frame:
v.Data = buf
default:
return ErrInvalidMessage
}
return nil
}
func (c *noopCodec) Write(conn io.ReadWriter, m *Message, b interface{}) error {
var v []byte
switch vb := b.(type) {
case nil:
return nil
case *Frame:
v = vb.Data
case *[]byte:
v = *vb
case []byte:
v = vb
default:
return ErrInvalidMessage
}
_, err := conn.Write(v)
return err
}
func (c *noopCodec) String() string {
return "noop"
}
func NewCodec() Codec {
return &noopCodec{}
}
func (n *noopCodec) Marshal(v interface{}) ([]byte, error) {
switch ve := v.(type) {
case *[]byte:
return *ve, nil
case []byte:
return ve, nil
case *Frame:
return ve.Data, nil
case *Message:
return ve.Body, nil
}
return nil, ErrInvalidMessage
}
func (n *noopCodec) Unmarshal(d []byte, v interface{}) error {
switch ve := v.(type) {
case []byte:
ve = d
case *[]byte:
*ve = d
case *Frame:
ve.Data = d
case *Message:
ve.Body = d
}
return ErrInvalidMessage
}