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.

179 lines
4.9 KiB

package grmi
import (
"LEIT_PM/container"
"LEIT_PM/rpc"
"errors"
"fmt"
"github.com/kataras/iris/v12"
"reflect"
)
type ParameterInfo struct {
Type reflect.Type
UrlParameterName string
Parser ParameterParser
}
func buildStringFromUrlParameterParser(urlParameterName string) ParameterParser {
return func(context iris.Context) (interface{}, error) {
return context.Params().Get(urlParameterName), nil
}
}
var getMoudleNameFromUrlParameter = buildStringFromUrlParameterParser("moudleName")
var getModelNameFromUrlParameter = buildStringFromUrlParameterParser("modelName")
func BuildParserOfType(bodyParser rpc.ValueParser) ParameterParser {
return func(context iris.Context) (interface{}, error) {
if context.GetContentLength() <= 0 {
return nil, nil
}
var json interface{}
err := context.ReadJSON(&json)
if err != nil {
return nil, err
}
entityValue, err := bodyParser(json, "json")
if err != nil {
fmt.Println(err.Error())
return nil, err
}
return entityValue, nil
}
}
func getJsonObjectFromHttpContent(context iris.Context) (interface{}, error) {
var json interface{}
if context.GetContentLength() <= 0 {
return nil, errors.New(fmt.Sprintf("未找到内容!"))
}
err := context.ReadJSON(&json)
if err != nil {
return nil, err
}
if json == nil {
return nil, errors.New(fmt.Sprintf("JSON解析失败!"))
}
jsonObject, ok := json.(map[string]interface{})
if !ok {
return nil, errors.New(fmt.Sprintf("JSON对象解析失败!"))
}
return jsonObject, nil
}
func getJsonListFromHttpContent(context iris.Context) (interface{}, error) {
var json interface{}
if context.GetContentLength() <= 0 {
return nil, errors.New(fmt.Sprintf("未找到内容!"))
}
err := context.ReadJSON(&json)
if err != nil {
return nil, err
}
if json == nil {
return nil, errors.New(fmt.Sprintf("JSON解析失败!"))
}
jsonList, ok := json.([]interface{})
if !ok {
return nil, errors.New(fmt.Sprintf("JSON数组解析失败!"))
}
return jsonList, nil
}
func getUrlParameters(context iris.Context) (interface{}, error) {
return context.URLParams(), nil
}
func buildParametersParser(parsers []ParameterParser) func(context iris.Context) ([]interface{}, error) {
return func(context iris.Context) ([]interface{}, error) {
parameters := make([]interface{}, len(parsers))
for i := 0; i < len(parsers); i++ {
parser := parsers[i]
value, err := parser(context)
if err != nil {
return nil, err
}
parameters[i] = value
}
return parameters, nil
}
}
var MoudleNameInfo = &ParameterInfo{
container.StringType,
"moudleName",
getMoudleNameFromUrlParameter,
}
var ModelNameInfo = &ParameterInfo{
container.StringType,
"modelName",
getModelNameFromUrlParameter,
}
var JsonObjectContentInfo = &ParameterInfo{
container.JsonObjectType,
"",
getJsonObjectFromHttpContent,
}
var JsonListContentInfo = &ParameterInfo{
container.JsonListType,
"",
getJsonListFromHttpContent,
}
var UrlParametersInfo = &ParameterInfo{
reflect.TypeOf(map[string]string{}),
"",
getUrlParameters,
}
func BuildWebParser(httpMethod container.HttpMethod, inInfos []*ParameterInfo, outTypes []reflect.Type) container.WebParser {
return func(serviceMethodName string, methodType container.Method) (container.HttpMethod, container.ParametersParser, string, error) {
if methodType.NumIn() != len(inInfos)+1 {
return "", nil, "", errors.New(fmt.Sprintf("参数数量错误! Service: %s 参数数量: %d", serviceMethodName, methodType.NumIn()))
}
path := ""
parsers := make([]ParameterParser, len(inInfos))
for i := 1; i <= len(inInfos); i++ {
inInfo := inInfos[i-1]
urlParameterName := inInfo.UrlParameterName
if urlParameterName != "" {
path += fmt.Sprintf("/{%s}", urlParameterName)
}
inType := inInfo.Type
if inType == nil {
if !container.IsEmptyInterface(methodType.In(i)) {
return "", nil, "", errors.New(fmt.Sprintf("第%d个参数类型错误! Service: %s 参数类型: %s", i, serviceMethodName, inType.String()))
}
} else {
if methodType.In(i) != inType {
return "", nil, "", errors.New(fmt.Sprintf("第%d个参数类型错误! Service: %s 参数类型: %s", i, serviceMethodName, inType.String()))
}
}
parsers[i-1] = inInfo.Parser
}
if methodType.NumOut() != len(outTypes)+1 {
return "", nil, "", errors.New(fmt.Sprintf("返回值数量错误! Service: %s 返回值数量: %d", serviceMethodName, methodType.NumOut()))
}
for i := 0; i <= len(outTypes)-1; i++ {
outType := outTypes[i]
if outType == nil {
if !container.IsEmptyInterface(methodType.Out(i)) {
return "", nil, "", errors.New(fmt.Sprintf("第%d个参数类型不能为空! Service: %s", i, serviceMethodName))
}
} else {
if methodType.Out(i) != outType {
return "", nil, "", errors.New(fmt.Sprintf("第%d个参数类型错误! Service: %s 参数类型: %s", i, serviceMethodName, outType.String()))
}
}
}
return httpMethod, buildParametersParser(parsers), path, nil
}
}