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