From 1ddb60b6e73b2bb5c2d1845eaa763e0a8ad57855 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 9 Mar 2017 12:23:21 +0400 Subject: [PATCH] refactor jsonParamsToArgs Suggested in https://github.com/tendermint/go-rpc/pull/9#discussion_r105098390 --- server/handlers.go | 68 ++++++++++++---------------------------------- 1 file changed, 18 insertions(+), 50 deletions(-) diff --git a/server/handlers.go b/server/handlers.go index 2a6102d1..6e746a26 100644 --- a/server/handlers.go +++ b/server/handlers.go @@ -143,61 +143,31 @@ func makeJSONRPCHandler(funcMap map[string]*RPCFunc) http.HandlerFunc { func jsonParamsToArgs(rpcFunc *RPCFunc, params map[string]interface{}) ([]reflect.Value, error) { values := make([]reflect.Value, len(rpcFunc.args)) - // fill each value with default - for i, argType := range rpcFunc.args { - values[i] = reflect.Zero(argType) - } - - for name, param := range params { - i := indexOf(name, rpcFunc.argNames) - if -1 == i { - return nil, fmt.Errorf("%s is not an argument (args: %v)", name, rpcFunc.argNames) - } + for i, argName := range rpcFunc.argNames { argType := rpcFunc.args[i] - v, err := _jsonObjectToArg(argType, param) - if err != nil { - return nil, err + + // decode param if provided + if param, ok := params[argName]; ok && "" != param { + v, err := _jsonObjectToArg(argType, param) + if err != nil { + return nil, err + } + values[i] = v + } else { // use default for that type + values[i] = reflect.Zero(argType) } - values[i] = v } return values, nil } -// indexOf returns index of a string in a slice of strings, -1 if not found. -func indexOf(value string, values []string) int { - for i, v := range values { - if v == value { - return i - } - } - return -1 -} - // Same as above, but with the first param the websocket connection func jsonParamsToArgsWS(rpcFunc *RPCFunc, params map[string]interface{}, wsCtx types.WSRPCContext) ([]reflect.Value, error) { - values := make([]reflect.Value, len(rpcFunc.args)+1) - values[0] = reflect.ValueOf(wsCtx) - - // fill each value with default - for i, argType := range rpcFunc.args { - values[i+1] = reflect.Zero(argType) + values, err := jsonParamsToArgs(rpcFunc, params) + if err != nil { + return nil, err } - - for name, param := range params { - i := indexOf(name, rpcFunc.argNames) - if -1 == i { - return nil, fmt.Errorf("%s is not an argument (args: %v)", name, rpcFunc.argNames) - } - argType := rpcFunc.args[i] - v, err := _jsonObjectToArg(argType, param) - if err != nil { - return nil, err - } - values[i+1] = v - } - - return values, nil + return append([]reflect.Value{reflect.ValueOf(wsCtx)}, values...), nil } func _jsonObjectToArg(ty reflect.Type, object interface{}) (reflect.Value, error) { @@ -247,13 +217,11 @@ func makeHTTPHandler(rpcFunc *RPCFunc) func(http.ResponseWriter, *http.Request) func httpParamsToArgs(rpcFunc *RPCFunc, r *http.Request) ([]reflect.Value, error) { values := make([]reflect.Value, len(rpcFunc.args)) - // fill each value with default - for i, argType := range rpcFunc.args { - values[i] = reflect.Zero(argType) - } - for i, name := range rpcFunc.argNames { argType := rpcFunc.args[i] + + values[i] = reflect.Zero(argType) // set default for that type + arg := GetParam(r, name) // log.Notice("param to arg", "argType", argType, "name", name, "arg", arg)