Skip to content

Commit

Permalink
feat: modify swagger index.html file to support mutil-namespace.
Browse files Browse the repository at this point in the history
  • Loading branch information
lenmx committed Apr 8, 2024
1 parent 95af9c9 commit 2144d29
Showing 1 changed file with 64 additions and 7 deletions.
71 changes: 64 additions & 7 deletions generate/swaggergen/g_docs.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@
package swaggergen

import (
"bufio"
"encoding/json"
"errors"
"fmt"
"go/ast"
"go/build"
"go/parser"
"go/token"
"io"
"os"
"path"
"path/filepath"
Expand Down Expand Up @@ -198,15 +200,15 @@ func GenerateDocs(curpath string) {
if f.Comments != nil {
for _, c := range f.Comments {
var namespacePrefix string
rootapi := &swagger.Swagger{
rootapi := swagger.Swagger{
Infos: swagger.Information{},
SwaggerVersion: "2.0",
}
for _, s := range strings.Split(c.Text(), "\n") {
if strings.HasPrefix(s, "@NamespacePrefix") {
namespacePrefix = strings.TrimSpace(s[len("@NamespacePrefix"):])
if _, exist := rootapiMap[namespacePrefix]; !exist {
rootapiMap[namespacePrefix] = rootapi
rootapiMap[namespacePrefix] = &rootapi
}
} else if strings.HasPrefix(s, "@APIVersion") {
rootapi.Infos.Version = strings.TrimSpace(s[len("@APIVersion"):])
Expand Down Expand Up @@ -293,10 +295,10 @@ func GenerateDocs(curpath string) {
}
}

// when namespacePrefix not defined, then add default namespacePrefix
if _, exist := rootapiMap[namespacePrefix]; !exist {
_, namespacePrefixExist := rootapiMap[namespacePrefix]
if !namespacePrefixExist && !rootapiSingle {
rootapiSingle = true
rootapiDefault = *rootapi
rootapiDefault = rootapi
}
}
}
Expand Down Expand Up @@ -340,7 +342,7 @@ func GenerateDocs(curpath string) {
}
}

if !rootapiSingle && rootapi.BasePath == "" {
if rootapi.BasePath == "" {
rootapi.BasePath = version
}

Expand All @@ -350,7 +352,7 @@ func GenerateDocs(curpath string) {
var controllerName string
if selname := pp.Fun.(*ast.SelectorExpr).Sel.String(); selname == "NSNamespace" {
s, params := analyseNewNamespace(pp)
if rootapiSingle {
if rootapi.BasePath == "" {
s = path.Join(version, s)
}

Expand Down Expand Up @@ -420,6 +422,8 @@ func GenerateDocs(curpath string) {
panic(err)
}
}

modifySwaggerIndexFile(curpath, rootapiSingle, rootapiMap)
}

// analyseNewNamespace returns version and the others params
Expand Down Expand Up @@ -1508,3 +1512,56 @@ func checkAndLoadPackage(imports []*ast.ImportSpec, realType, curPkgName string)

pkgLoadedCache[pkgPath] = struct{}{}
}

func modifySwaggerIndexFile(curpath string, rootapiSingle bool, rootapiMap map[string]*swagger.Swagger) {
swaggerIndexFilename := "index.html"
swaggerIndexFullname := path.Join(curpath, "swagger", swaggerIndexFilename)

swaggerJsonFilename := "swagger.json"
swaggerUIBundleSign := `SwaggerUIBundle(`
var swaggerUIBundleSignPass bool

if _, err := os.Stat(swaggerIndexFullname); !os.IsNotExist(err) {
var swaggerJsonUrl string
if rootapiSingle {
swaggerJsonUrl = fmt.Sprintf(` url: "%s",`, swaggerJsonFilename)
} else {
urls := make([]string, 0)
for namespace, _ := range rootapiMap {
namespace = strings.TrimLeft(namespace, "/")
urls = append(urls, fmt.Sprintf(`{url: "%s", name: "%s"}`, path.Join(namespace, swaggerJsonFilename), namespace))
}
swaggerJsonUrl = fmt.Sprintf(` urls: [%s],`, strings.Join(urls, ", "))
}

var indexFileContent string
if f, err := os.Open(swaggerIndexFullname); err == nil {
defer f.Close()

buf := bufio.NewReader(f)
for {
line, _, c := buf.ReadLine()
if c == io.EOF {
break
}

if strings.Contains(string(line), swaggerUIBundleSign) {
swaggerUIBundleSignPass = true
}
if swaggerUIBundleSignPass && (strings.Contains(string(line), "url:") || strings.Contains(string(line), "urls:")) {
indexFileContent += swaggerJsonUrl + "\n"
} else {
indexFileContent += string(line) + "\n"
}
}
}

if fw, err := os.OpenFile(swaggerIndexFullname, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666); err == nil {
defer fw.Close()

w := bufio.NewWriter(fw)
w.WriteString(indexFileContent)
w.Flush()
}
}
}

0 comments on commit 2144d29

Please sign in to comment.