GAAS 广汽安道拓GFrame金属件MOM项目
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.
 

61 lines
1.5 KiB

package container
import (
"errors"
"fmt"
"leit.com/LAPP_GAAS_GFrame/web/models"
"reflect"
)
type MethodInvoker struct {
method reflect.Value
parameterParsers []parameterParser
}
func NewMethodInvoker(method reflect.Value, parameterParsers []parameterParser) *MethodInvoker {
return &MethodInvoker{method, parameterParsers}
}
func (invoker *MethodInvoker) parseParameters(user *models.Usertab, jsonArray []interface{}) ([]reflect.Value, error) {
parsers := invoker.parameterParsers
count := len(parsers)
if len(jsonArray) != count {
return nil, errors.New("参数长度错误!")
} else {
parameterValues := make([]reflect.Value, count+1)
parameterValues[0] = reflect.ValueOf(user)
for i, parser := range parsers {
if parameter, err := parser(jsonArray[i], fmt.Sprintf("#%d", i+1)); err != nil {
return nil, err
} else {
parameterValues[i+1] = reflect.ValueOf(parameter)
}
}
return parameterValues, nil
}
}
func (invoker *MethodInvoker) Process(user *models.Usertab, jsonArray []interface{}) (interface{}, error) {
method := invoker.method
if parameterValues, err := invoker.parseParameters(user, jsonArray); err != nil {
return nil, err
} else {
returnValues := method.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
}
}
}