package rpc2
import (
"bufio"
"encoding/gob"
"io"
"sync"
)
type Codec interface {
ReadHeader (*Request , *Response ) error
ReadRequestBody (interface {}) error
ReadResponseBody (interface {}) error
WriteRequest (*Request , interface {}) error
WriteResponse (*Response , interface {}) error
Close () error
}
type Request struct {
Seq uint64
Method string
}
type Response struct {
Seq uint64
Error string
}
type gobCodec struct {
rwc io .ReadWriteCloser
dec *gob .Decoder
enc *gob .Encoder
encBuf *bufio .Writer
mutex sync .Mutex
}
type message struct {
Seq uint64
Method string
Error string
}
func NewGobCodec (conn io .ReadWriteCloser ) Codec {
buf := bufio .NewWriter (conn )
return &gobCodec {
rwc : conn ,
dec : gob .NewDecoder (conn ),
enc : gob .NewEncoder (buf ),
encBuf : buf ,
}
}
func (c *gobCodec ) ReadHeader (req *Request , resp *Response ) error {
var msg message
if err := c .dec .Decode (&msg ); err != nil {
return err
}
if msg .Method != "" {
req .Seq = msg .Seq
req .Method = msg .Method
} else {
resp .Seq = msg .Seq
resp .Error = msg .Error
}
return nil
}
func (c *gobCodec ) ReadRequestBody (body interface {}) error {
return c .dec .Decode (body )
}
func (c *gobCodec ) ReadResponseBody (body interface {}) error {
return c .dec .Decode (body )
}
func (c *gobCodec ) WriteRequest (r *Request , body interface {}) (err error ) {
c .mutex .Lock ()
defer c .mutex .Unlock ()
if err = c .enc .Encode (r ); err != nil {
return
}
if err = c .enc .Encode (body ); err != nil {
return
}
return c .encBuf .Flush ()
}
func (c *gobCodec ) WriteResponse (r *Response , body interface {}) (err error ) {
c .mutex .Lock ()
defer c .mutex .Unlock ()
if err = c .enc .Encode (r ); err != nil {
return
}
if err = c .enc .Encode (body ); err != nil {
return
}
return c .encBuf .Flush ()
}
func (c *gobCodec ) Close () error {
return c .rwc .Close ()
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .