in protocol/jsonrpc/json.go [111:161]
func (c *jsonClientCodec) Write(d *CodecData) ([]byte, error) {
// If return error: it will be returned as is for this call.
// Allow param to be only Array, Slice, Map or Struct.
// When param is nil or uninitialized Map or Slice - omit "params".
param := d.Args
if param != nil {
switch k := reflect.TypeOf(param).Kind(); k {
case reflect.Map:
if reflect.TypeOf(param).Key().Kind() == reflect.String && reflect.ValueOf(param).IsNil() {
param = nil
}
case reflect.Slice:
if reflect.ValueOf(param).IsNil() {
param = nil
}
case reflect.Array, reflect.Struct:
case reflect.Ptr:
switch ptrK := reflect.TypeOf(param).Elem().Kind(); ptrK {
case reflect.Map:
if reflect.TypeOf(param).Elem().Key().Kind() == reflect.String && reflect.ValueOf(param).Elem().IsNil() {
param = nil
}
case reflect.Slice:
if reflect.ValueOf(param).Elem().IsNil() {
param = nil
}
case reflect.Array, reflect.Struct:
default:
return nil, perrors.New("unsupported param type: Ptr to " + ptrK.String())
}
default:
return nil, perrors.New("unsupported param type: " + k.String())
}
}
c.req.Version = "2.0"
c.req.Method = d.Method
c.req.Params = param
c.req.ID = d.ID & MAX_JSONRPC_ID
// can not use d.ID. otherwise you will get error: can not find method of response id 280698512
c.pending[c.req.ID] = d.Method
buf := bytes.NewBuffer(nil)
defer buf.Reset()
enc := json.NewEncoder(buf)
if err := enc.Encode(&c.req); err != nil {
return nil, perrors.WithStack(err)
}
return buf.Bytes(), nil
}