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.
 

75 lines
2.6 KiB

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
}