package docgen import ( "bytes" "fmt" "html/template" "strconv" "strings" "github.com/tal-tech/go-zero/core/stringx" "github.com/tal-tech/go-zero/tools/goctl/api/gogen" "github.com/tal-tech/go-zero/tools/goctl/api/spec" "github.com/tal-tech/go-zero/tools/goctl/api/util" ) const ( markdownTemplate = ` ### {{.index}}. {{.routeComment}} 1. 路由定义 - Url: {{.uri}} - Method: {{.method}} - Request: {{.requestType}} - Response: {{.responseType}} 2. 类型定义 {{.responseContent}} ` ) func genDoc(api *spec.ApiSpec, dir string, filename string) error { fp, _, err := util.MaybeCreateFile(dir, "", filename) if err != nil { return err } defer fp.Close() var builder strings.Builder for index, route := range api.Service.Routes() { routeComment, _ := util.GetAnnotationValue(route.Annotations, "doc", "summary") if len(routeComment) == 0 { routeComment = "N/A" } responseContent, err := responseBody(api, route) if err != nil { return err } t := template.Must(template.New("markdownTemplate").Parse(markdownTemplate)) var tmplBytes bytes.Buffer err = t.Execute(&tmplBytes, map[string]string{ "index": strconv.Itoa(index + 1), "routeComment": routeComment, "method": strings.ToUpper(route.Method), "uri": route.Path, "requestType": "`" + stringx.TakeOne(route.RequestType.Name, "-") + "`", "responseType": "`" + stringx.TakeOne(route.ResponseType.Name, "-") + "`", "responseContent": responseContent, }) if err != nil { return err } builder.Write(tmplBytes.Bytes()) } _, err = fp.WriteString(strings.Replace(builder.String(), """, `"`, -1)) return err } func responseBody(api *spec.ApiSpec, route spec.Route) (string, error) { tps := util.GetLocalTypes(api, route) value, err := gogen.BuildTypes(tps) if err != nil { return "", err } return fmt.Sprintf("\n\n```golang\n%s\n```\n", value), nil }