|
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
|
|
}
|