Task Attachments (#104)
This commit is contained in:
183
vendor/github.com/swaggo/swag/gen/gen.go
generated
vendored
183
vendor/github.com/swaggo/swag/gen/gen.go
generated
vendored
@ -1,22 +1,26 @@
|
||||
package gen
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go/format"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
"text/template"
|
||||
"time"
|
||||
|
||||
"github.com/go-openapi/spec"
|
||||
|
||||
"github.com/ghodss/yaml"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/swaggo/swag"
|
||||
)
|
||||
|
||||
// Gen presents a generate tool for swag.
|
||||
type Gen struct {
|
||||
}
|
||||
type Gen struct{}
|
||||
|
||||
// New creates a new Gen.
|
||||
func New() *Gen {
|
||||
@ -28,41 +32,51 @@ type Config struct {
|
||||
// SearchDir the swag would be parse
|
||||
SearchDir string
|
||||
|
||||
//OutputDir represents the output directory for al the generated files
|
||||
// OutputDir represents the output directory for al the generated files
|
||||
OutputDir string
|
||||
|
||||
//MainAPIFile the Go file path in which 'swagger general API Info' is written
|
||||
// MainAPIFile the Go file path in which 'swagger general API Info' is written
|
||||
MainAPIFile string
|
||||
|
||||
//PropNamingStrategy represents property naming strategy like snakecase,camelcase,pascalcase
|
||||
// PropNamingStrategy represents property naming strategy like snakecase,camelcase,pascalcase
|
||||
PropNamingStrategy string
|
||||
|
||||
//ParseVendor whether swag should be parse vendor folder
|
||||
// ParseVendor whether swag should be parse vendor folder
|
||||
ParseVendor bool
|
||||
|
||||
// ParseDependencies whether swag should be parse outside dependency folder
|
||||
ParseDependency bool
|
||||
|
||||
// MarkdownFilesDir used to find markdownfiles, which can be used for tag descriptions
|
||||
MarkdownFilesDir string
|
||||
}
|
||||
|
||||
// Build builds swagger json file for gived searchDir and mainAPIFile. Returns json
|
||||
// Build builds swagger json file for given searchDir and mainAPIFile. Returns json
|
||||
func (g *Gen) Build(config *Config) error {
|
||||
if _, err := os.Stat(config.SearchDir); os.IsNotExist(err) {
|
||||
return fmt.Errorf("dir: %s is not exist", config.SearchDir)
|
||||
}
|
||||
|
||||
log.Println("Generate swagger docs....")
|
||||
p := swag.New()
|
||||
p := swag.New(swag.SetMarkdownFileDirectory(config.MarkdownFilesDir))
|
||||
p.PropNamingStrategy = config.PropNamingStrategy
|
||||
p.ParseVendor = config.ParseVendor
|
||||
p.ParseDependency = config.ParseDependency
|
||||
|
||||
if err := p.ParseAPI(config.SearchDir, config.MainAPIFile); err != nil {
|
||||
return err
|
||||
}
|
||||
swagger := p.GetSwagger()
|
||||
|
||||
b, err := json.MarshalIndent(swagger, "", " ")
|
||||
b, err := g.jsonIndent(swagger)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
os.MkdirAll(config.OutputDir, os.ModePerm)
|
||||
if err := os.MkdirAll(config.OutputDir, os.ModePerm); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
docs, err := os.Create(path.Join(config.OutputDir, "docs.go"))
|
||||
if err != nil {
|
||||
return err
|
||||
@ -73,9 +87,11 @@ func (g *Gen) Build(config *Config) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer swaggerJSON.Close()
|
||||
swaggerJSON.Write(b)
|
||||
|
||||
if _, err := swaggerJSON.Write(b); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
swaggerYAML, err := os.Create(path.Join(config.OutputDir, "swagger.yaml"))
|
||||
if err != nil {
|
||||
@ -85,18 +101,16 @@ func (g *Gen) Build(config *Config) error {
|
||||
defer swaggerYAML.Close()
|
||||
y, err := yaml.JSONToYAML(b)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "cannot covert json to yaml")
|
||||
return fmt.Errorf("cannot covert json to yaml error: %s", err)
|
||||
}
|
||||
|
||||
swaggerYAML.Write(y)
|
||||
if _, err := swaggerYAML.Write(y); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := packageTemplate.Execute(docs, struct {
|
||||
Timestamp time.Time
|
||||
Doc string
|
||||
}{
|
||||
Timestamp: time.Now(),
|
||||
Doc: "`" + string(b) + "`",
|
||||
}); err != nil {
|
||||
// Write doc
|
||||
err = g.writeGoDoc(docs, swagger)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@ -107,7 +121,102 @@ func (g *Gen) Build(config *Config) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
var packageTemplate = template.Must(template.New("").Parse(`// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
|
||||
func (g *Gen) jsonIndent(data interface{}) ([]byte, error) {
|
||||
return json.MarshalIndent(data, "", " ")
|
||||
}
|
||||
|
||||
func (g *Gen) formatSource(src []byte) []byte {
|
||||
code, err := format.Source(src)
|
||||
if err != nil {
|
||||
code = src // Output the unformated code anyway
|
||||
}
|
||||
return code
|
||||
}
|
||||
|
||||
func (g *Gen) writeGoDoc(output io.Writer, swagger *spec.Swagger) error {
|
||||
|
||||
generator, err := template.New("swagger_info").Funcs(template.FuncMap{
|
||||
"printDoc": func(v string) string {
|
||||
// Add schemes
|
||||
v = "{\n \"schemes\": {{ marshal .Schemes }}," + v[1:]
|
||||
// Sanitize backticks
|
||||
return strings.Replace(v, "`", "`+\"`\"+`", -1)
|
||||
},
|
||||
}).Parse(packageTemplate)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
swaggerSpec := &spec.Swagger{
|
||||
VendorExtensible: swagger.VendorExtensible,
|
||||
SwaggerProps: spec.SwaggerProps{
|
||||
ID: swagger.ID,
|
||||
Consumes: swagger.Consumes,
|
||||
Produces: swagger.Produces,
|
||||
Swagger: swagger.Swagger,
|
||||
Info: &spec.Info{
|
||||
VendorExtensible: swagger.Info.VendorExtensible,
|
||||
InfoProps: spec.InfoProps{
|
||||
Description: "{{.Description}}",
|
||||
Title: "{{.Title}}",
|
||||
TermsOfService: swagger.Info.TermsOfService,
|
||||
Contact: swagger.Info.Contact,
|
||||
License: swagger.Info.License,
|
||||
Version: "{{.Version}}",
|
||||
},
|
||||
},
|
||||
Host: "{{.Host}}",
|
||||
BasePath: "{{.BasePath}}",
|
||||
Paths: swagger.Paths,
|
||||
Definitions: swagger.Definitions,
|
||||
Parameters: swagger.Parameters,
|
||||
Responses: swagger.Responses,
|
||||
SecurityDefinitions: swagger.SecurityDefinitions,
|
||||
Security: swagger.Security,
|
||||
Tags: swagger.Tags,
|
||||
ExternalDocs: swagger.ExternalDocs,
|
||||
},
|
||||
}
|
||||
|
||||
// crafted docs.json
|
||||
buf, err := g.jsonIndent(swaggerSpec)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
buffer := &bytes.Buffer{}
|
||||
err = generator.Execute(buffer, struct {
|
||||
Timestamp time.Time
|
||||
Doc string
|
||||
Host string
|
||||
BasePath string
|
||||
Schemes []string
|
||||
Title string
|
||||
Description string
|
||||
Version string
|
||||
}{
|
||||
Timestamp: time.Now(),
|
||||
Doc: string(buf),
|
||||
Host: swagger.Host,
|
||||
BasePath: swagger.BasePath,
|
||||
Schemes: swagger.Schemes,
|
||||
Title: swagger.Info.Title,
|
||||
Description: swagger.Info.Description,
|
||||
Version: swagger.Info.Version,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
code := g.formatSource(buffer.Bytes())
|
||||
|
||||
// write
|
||||
_, err = output.Write(code)
|
||||
return err
|
||||
|
||||
}
|
||||
|
||||
var packageTemplate = `// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
|
||||
// This file was generated by swaggo/swag at
|
||||
// {{ .Timestamp }}
|
||||
|
||||
@ -115,34 +224,52 @@ package docs
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"strings"
|
||||
|
||||
"github.com/alecthomas/template"
|
||||
"github.com/swaggo/swag"
|
||||
)
|
||||
|
||||
var doc = {{.Doc}}
|
||||
var doc = ` + "`{{ printDoc .Doc}}`" + `
|
||||
|
||||
type swaggerInfo struct {
|
||||
Version string
|
||||
Host string
|
||||
BasePath string
|
||||
Schemes []string
|
||||
Title string
|
||||
Description string
|
||||
}
|
||||
|
||||
// SwaggerInfo holds exported Swagger Info so clients can modify it
|
||||
var SwaggerInfo swaggerInfo
|
||||
var SwaggerInfo = swaggerInfo{
|
||||
Version: {{ printf "%q" .Version}},
|
||||
Host: {{ printf "%q" .Host}},
|
||||
BasePath: {{ printf "%q" .BasePath}},
|
||||
Schemes: []string{ {{ range $index, $schema := .Schemes}}{{if gt $index 0}},{{end}}{{printf "%q" $schema}}{{end}} },
|
||||
Title: {{ printf "%q" .Title}},
|
||||
Description: {{ printf "%q" .Description}},
|
||||
}
|
||||
|
||||
type s struct{}
|
||||
|
||||
func (s *s) ReadDoc() string {
|
||||
t, err := template.New("swagger_info").Parse(doc)
|
||||
sInfo := SwaggerInfo
|
||||
sInfo.Description = strings.Replace(sInfo.Description, "\n", "\\n", -1)
|
||||
|
||||
t, err := template.New("swagger_info").Funcs(template.FuncMap{
|
||||
"marshal": func(v interface{}) string {
|
||||
a, _ := json.Marshal(v)
|
||||
return string(a)
|
||||
},
|
||||
}).Parse(doc)
|
||||
if err != nil {
|
||||
return doc
|
||||
}
|
||||
|
||||
var tpl bytes.Buffer
|
||||
if err := t.Execute(&tpl, SwaggerInfo); err != nil {
|
||||
if err := t.Execute(&tpl, sInfo); err != nil {
|
||||
return doc
|
||||
}
|
||||
|
||||
@ -152,4 +279,4 @@ func (s *s) ReadDoc() string {
|
||||
func init() {
|
||||
swag.Register(swag.Name, &s{})
|
||||
}
|
||||
`))
|
||||
`
|
||||
|
Reference in New Issue
Block a user