package rpc import ( "LEIT_PM/container" "errors" "fmt" "github.com/kataras/iris/v12" "reflect" ) var DefaultValueParserBuilder = &ValueParserBuilder{} var DefaultMethodInvokerBuilder = &RouteBuilder{&MethodInvokerBuilder{&ValueParserBuilder{}, map[reflect.Type]ValueParser{container.RequestContextType: keepValue}}} type RouteBuilder struct { methodInvokerBuilder *MethodInvokerBuilder } func (builder *RouteBuilder) Build(serviceMethodName string, methodType container.Method) (container.HttpMethod, container.ParametersParser, string, error) { parameterParsers, err := builder.buildParameterParsers(serviceMethodName, methodType) if err != nil { return "", nil, "", err } parametersParser := func(context iris.Context) ([]interface{}, error) { if context.GetContentLength() <= 0 { return nil, errors.New(fmt.Sprintf("未找到内容!")) } var json interface{} err := context.ReadJSON(&json) if err != nil { return nil, err } if json == nil { return nil, errors.New(fmt.Sprintf("JSON解析失败!")) } jsonArray, ok := json.([]interface{}) if !ok { return nil, errors.New(fmt.Sprintf("JSON数组解析失败!")) } parameters := make([]interface{}, len(parameterParsers)) for i, parameterParser := range parameterParsers { parameters[i], err = parameterParser(jsonArray[i], fmt.Sprintf("#%d", i+1)) if err != nil { return nil, err } } return parameters, nil } return container.HttpPost, parametersParser, "", nil } func (builder *RouteBuilder) buildParameterParsers(serviceMethodName string, methodType reflect.Type) ([]ValueParser, error) { if methodType.NumOut() < 1 || 2 < methodType.NumOut() { return nil, errors.New(fmt.Sprintf("返回值数量错误! Service: %s 返回值数量: %d", serviceMethodName, methodType.NumOut())) } if methodType.Out(methodType.NumOut()-1) != container.ErrorType { return nil, errors.New(fmt.Sprintf("最后一个返回值类型错误! Service: %s 类型:%s", serviceMethodName, methodType.Out(methodType.NumOut()-1))) } for i := 0; i < methodType.NumOut(); i++ { if ok, typeText := builder.methodInvokerBuilder.checkOutType(methodType.Out(i)); !ok { return nil, errors.New(fmt.Sprintf("不支持的返回值类型! Service: %s 参数: #%d 类型: %s", serviceMethodName, i+1, typeText)) } } parameterParsers := make([]ValueParser, 0, 10) for i := 1; i < methodType.NumIn(); i++ { if parameterParser, err := builder.methodInvokerBuilder.buildParameterParser(serviceMethodName, methodType.In(i), i); err != nil { return nil, err } else { parameterParsers = append(parameterParsers, parameterParser) } } return parameterParsers, nil }