package main import ( "bytes" "fmt" "google.golang.org/protobuf/compiler/protogen" "text/template" ) type generateRouterMethod struct { MethodName string InputName string OutputName string API string Author string Describe string Method string } type generateRouters struct { StructName string BaseURL string GenTo string Methods []generateRouterMethod } const routerGenerateTpl = `type AutoGen{{.StructName}}Impl interface { ` + `{{range .Methods}} {{.MethodName}}(ctx *core.Context, req *{{.InputName}}) (resp *{{.OutputName}}, err error){{end}} } var ( AutoGen{{.StructName}} = &core.Routers{ BaseURL: "{{.BaseURL}}", Apis: core.RouterMap{ {{range .Methods}} "{{.MethodName}}": { API: "{{.API}}", Method: "{{.Method}}", Author: "{{.Author}}", Describe: "{{.Describe}}", },{{end}} }, } ) ` func GenerateRouterMap(srv *protogen.Service) (string, error) { var generate = new(generateRouters) generate.StructName = srv.GoName generate.BaseURL = GetCommentBaseURL(srv.Comments) generate.GenTo = GetCommentGenerateTo(srv.Comments) for _, method := range srv.Methods { generate.Methods = append(generate.Methods, generateRouterMethod{ MethodName: method.GoName, InputName: method.Input.GoIdent.GoName, OutputName: method.Output.GoIdent.GoName, API: GetCommentApiURL(method), Author: GetCommentAuthor(method.Comments), Describe: GetCommentDescribe(method.Comments), Method: GetCommentHttpMethod(method.Comments), }) } tpl, err := template.New("group_router").Parse(routerGenerateTpl) if err != nil { return "", fmt.Errorf("parse %s group router template failed: %v", srv.GoName, err) } tpl.DefinedTemplates() var buf bytes.Buffer if err = tpl.Execute(&buf, generate); err != nil { return "", fmt.Errorf("execute %s group router template failed: %v", srv.GoName, err) } return buf.String(), nil }