package json import ( "encoding/json" "reflect" "git.loafle.net/commons_go/rpc/codec" cur "git.loafle.net/commons_go/util/reflect" ) // ---------------------------------------------------------------------------- // ClientNotificationCodec // ---------------------------------------------------------------------------- // clientRequest represents a JSON-RPC notification sent to a client. type clientNotification struct { // A String containing the name of the method to be invoked. Method string `json:"method"` // Object to pass as request parameter to the method. Params *json.RawMessage `json:"params,omitempty"` } // ClientNotificationCodec decodes and encodes a single notification. type ClientNotificationCodec struct { noti *clientNotification err error codec codec.Codec } func (cnc *ClientNotificationCodec) Method() string { return cnc.noti.Method } func (cnc *ClientNotificationCodec) ReadParams(args []interface{}) error { if cnc.err == nil && cnc.noti.Params != nil { // Note: if scr.request.Params is nil it's not an error, it's an optional member. // JSON params structured object. Unmarshal to the args object. var values []string if err := json.Unmarshal(*cnc.noti.Params, &values); err != nil { cnc.err = &Error{ Code: E_INVALID_REQ, Message: err.Error(), Data: cnc.noti.Params, } return cnc.err } for indexI := 0; indexI < len(args); indexI++ { value := values[indexI] arg := args[indexI] if cur.IsTypeKind(reflect.TypeOf(arg), reflect.String, true) { arg = arg.(*string) arg = &value } else { if err := json.Unmarshal([]byte(value), &arg); err != nil { cnc.err = &Error{ Code: E_INVALID_REQ, Message: err.Error(), Data: cnc.noti.Params, } return cnc.err } } } } return cnc.err } func (cnc *ClientNotificationCodec) Params() ([]string, error) { if cnc.err == nil && cnc.noti.Params != nil { var results []string if err := json.Unmarshal(*cnc.noti.Params, &results); err != nil { cnc.err = &Error{ Code: E_INVALID_REQ, Message: err.Error(), Data: cnc.noti.Params, } return nil, cnc.err } return results, nil } return nil, cnc.err }