苏州瑞玛APS项目web后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.4 KiB

package rpc
import (
"errors"
"fmt"
"reflect"
)
type MethodInvoker struct {
call func([]reflect.Value) []reflect.Value
parameterParsers []valueParser
}
func NewMethodInvoker(call func([]reflect.Value) []reflect.Value, parameterParsers []valueParser) *MethodInvoker {
return &MethodInvoker{call, parameterParsers}
}
func (invoker *MethodInvoker) parseParameters(jsonArray []interface{}) ([]reflect.Value, error) {
parsers := invoker.parameterParsers
count := len(parsers)
if len(jsonArray) != count {
return nil, errors.New(fmt.Sprintf("参数长度错误!"))
} else {
parameterValues := make([]reflect.Value, count)
for i, parser := range parsers {
if parameter, err := parser(jsonArray[i], fmt.Sprintf("#%d", i+1)); err != nil {
return nil, err
} else {
parameterValues[i] = reflect.ValueOf(parameter)
}
}
return parameterValues, nil
}
}
func (invoker *MethodInvoker) Process(jsonArray []interface{}) (interface{}, error) {
if parameterValues, err := invoker.parseParameters(jsonArray); err != nil {
return nil, err
} else {
returnValues := invoker.call(parameterValues)
var err interface{}
var result interface{}
if len(returnValues) > 1 {
err = returnValues[1].Interface()
result = returnValues[0].Interface()
} else {
err = returnValues[0].Interface()
result = nil
}
if err != nil {
return nil, err.(error)
} else {
return result, nil
}
}
}