diff --git a/json.go b/json.go index a0585d4..2b186cc 100644 --- a/json.go +++ b/json.go @@ -4,11 +4,36 @@ package json import ( "encoding/json" "io" + "io/ioutil" "github.com/unistack-org/micro/v3/codec" ) -type jsonCodec struct { +type jsonCodec struct{} + +func (c *jsonCodec) Marshal(b interface{}) ([]byte, error) { + if b == nil { + return nil, nil + } + switch m := b.(type) { + case *codec.Frame: + return m.Data, nil + } + + return json.Marshal(b) +} + +func (c *jsonCodec) Unmarshal(b []byte, v interface{}) error { + if b == nil { + return nil + } + switch m := v.(type) { + case *codec.Frame: + m.Data = b + return nil + } + + return json.Unmarshal(b, v) } func (c *jsonCodec) ReadHeader(conn io.ReadWriter, m *codec.Message, t codec.MessageType) error { @@ -19,6 +44,16 @@ func (c *jsonCodec) ReadBody(conn io.ReadWriter, b interface{}) error { if b == nil { return nil } + switch m := b.(type) { + case *codec.Frame: + buf, err := ioutil.ReadAll(conn) + if err != nil { + return err + } + m.Data = buf + return nil + } + return json.NewDecoder(conn).Decode(b) } @@ -26,23 +61,15 @@ func (c *jsonCodec) Write(conn io.ReadWriter, m *codec.Message, b interface{}) e if b == nil { return nil } + switch m := b.(type) { + case *codec.Frame: + _, err := conn.Write(m.Data) + return err + } + return json.NewEncoder(conn).Encode(b) } -func (c *jsonCodec) Marshal(b interface{}) ([]byte, error) { - if b == nil { - return nil, nil - } - return json.Marshal(b) -} - -func (c *jsonCodec) Unmarshal(b []byte, v interface{}) error { - if b == nil { - return nil - } - return json.Unmarshal(b, v) -} - func (c *jsonCodec) String() string { return "json" }