56 lines
1.0 KiB
Go
56 lines
1.0 KiB
Go
package codec
|
|
|
|
import (
|
|
"bufio"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
)
|
|
|
|
type JsonCodec struct {
|
|
conn io.ReadWriteCloser
|
|
buf *bufio.Writer
|
|
dec *json.Decoder
|
|
enc *json.Encoder
|
|
}
|
|
|
|
func (j *JsonCodec) Close() error {
|
|
return j.conn.Close()
|
|
}
|
|
|
|
func (j *JsonCodec) ReadHeader(h *Header) error {
|
|
return j.dec.Decode(h)
|
|
}
|
|
|
|
func (j *JsonCodec) ReadBody(body interface{}) error {
|
|
return j.dec.Decode(body)
|
|
}
|
|
|
|
func (j *JsonCodec) Write(header *Header, body interface{}) (err error) {
|
|
defer func() {
|
|
_ = j.buf.Flush()
|
|
if err != nil {
|
|
_ = j.Close()
|
|
}
|
|
}()
|
|
if err = j.enc.Encode(header); err != nil {
|
|
return fmt.Errorf("rpc codec: json error encoding header: %v", err)
|
|
}
|
|
if err = j.enc.Encode(body); err != nil {
|
|
return fmt.Errorf("rpc codec: json error encoding body: %v", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var _ Codec = (*JsonCodec)(nil)
|
|
|
|
func NewJsonCodec(conn io.ReadWriteCloser) Codec {
|
|
buf := bufio.NewWriter(conn)
|
|
return &JsonCodec{
|
|
conn: conn,
|
|
buf: buf,
|
|
dec: json.NewDecoder(conn),
|
|
enc: json.NewEncoder(buf),
|
|
}
|
|
}
|