protoc-gen-coco/router_generate.go
2023-03-12 23:37:02 +08:00

76 lines
1.9 KiB
Go

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
}