43 lines
963 B
Go
43 lines
963 B
Go
|
package codec
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"net/rpc"
|
||
|
"reflect"
|
||
|
)
|
||
|
|
||
|
// InmemCodec is used to do an RPC call without going over a network
|
||
|
type InmemCodec struct {
|
||
|
Method string
|
||
|
Args interface{}
|
||
|
Reply interface{}
|
||
|
Err error
|
||
|
}
|
||
|
|
||
|
func (i *InmemCodec) ReadRequestHeader(req *rpc.Request) error {
|
||
|
req.ServiceMethod = i.Method
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (i *InmemCodec) ReadRequestBody(args interface{}) error {
|
||
|
sourceValue := reflect.Indirect(reflect.Indirect(reflect.ValueOf(i.Args)))
|
||
|
dst := reflect.Indirect(reflect.Indirect(reflect.ValueOf(args)))
|
||
|
dst.Set(sourceValue)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (i *InmemCodec) WriteResponse(resp *rpc.Response, reply interface{}) error {
|
||
|
if resp.Error != "" {
|
||
|
i.Err = errors.New(resp.Error)
|
||
|
return nil
|
||
|
}
|
||
|
sourceValue := reflect.Indirect(reflect.Indirect(reflect.ValueOf(reply)))
|
||
|
dst := reflect.Indirect(reflect.Indirect(reflect.ValueOf(i.Reply)))
|
||
|
dst.Set(sourceValue)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (i *InmemCodec) Close() error {
|
||
|
return nil
|
||
|
}
|