add swagger
This commit is contained in:
28
providers/swagger/config.go
Normal file
28
providers/swagger/config.go
Normal file
@@ -0,0 +1,28 @@
|
||||
package swagger
|
||||
|
||||
import (
|
||||
"github.com/rogeecn/atom/container"
|
||||
"github.com/rogeecn/atom/utils/opt"
|
||||
ginSwagger "github.com/swaggo/gin-swagger"
|
||||
)
|
||||
|
||||
const DefaultPrefix = "Swagger"
|
||||
|
||||
type Config struct {
|
||||
BaseRoute string
|
||||
Version string
|
||||
Host string
|
||||
BasePath string
|
||||
Title string
|
||||
Description string
|
||||
HandlerConfig *ginSwagger.Config
|
||||
}
|
||||
|
||||
func DefaultProvider() container.ProviderContainer {
|
||||
return container.ProviderContainer{
|
||||
Provider: Provide,
|
||||
Options: []opt.Option{
|
||||
opt.Prefix(DefaultPrefix),
|
||||
},
|
||||
}
|
||||
}
|
||||
55
providers/swagger/docs.go
Normal file
55
providers/swagger/docs.go
Normal file
@@ -0,0 +1,55 @@
|
||||
package swagger
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/rogeecn/atom/container"
|
||||
"github.com/rogeecn/atom/providers/http"
|
||||
"github.com/rogeecn/atom/utils/opt"
|
||||
swaggerFiles "github.com/swaggo/files"
|
||||
ginSwagger "github.com/swaggo/gin-swagger"
|
||||
"github.com/swaggo/swag"
|
||||
)
|
||||
|
||||
type Swagger struct {
|
||||
}
|
||||
|
||||
func Provide(opts ...opt.Option) error {
|
||||
o := opt.New(opts...)
|
||||
var config Config
|
||||
if err := o.UnmarshalConfig(&config); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return container.Container.Provide(func(http http.Service) *Swagger {
|
||||
if config.BaseRoute == "" {
|
||||
config.BaseRoute = "swagger"
|
||||
}
|
||||
|
||||
swaggerInfo := &swag.Spec{
|
||||
Version: config.Version,
|
||||
Host: config.Host,
|
||||
BasePath: config.BasePath,
|
||||
Schemes: []string{},
|
||||
Title: config.Title,
|
||||
Description: config.Description,
|
||||
InfoInstanceName: "swagger",
|
||||
SwaggerTemplate: docTemplate,
|
||||
LeftDelim: "{{",
|
||||
RightDelim: "}}",
|
||||
}
|
||||
swag.Register(swaggerInfo.InstanceName(), swaggerInfo)
|
||||
engine := http.GetEngine().(*gin.Engine)
|
||||
|
||||
var handler gin.HandlerFunc
|
||||
if config.HandlerConfig != nil {
|
||||
handler = ginSwagger.CustomWrapHandler(config.HandlerConfig, swaggerFiles.Handler)
|
||||
} else {
|
||||
handler = ginSwagger.WrapHandler(swaggerFiles.Handler)
|
||||
}
|
||||
engine.GET(fmt.Sprintf("/%s/*any", config.BaseRoute), handler)
|
||||
|
||||
return &Swagger{}
|
||||
}, o.DiOptions()...)
|
||||
}
|
||||
39
providers/swagger/template.go
Normal file
39
providers/swagger/template.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package swagger
|
||||
|
||||
const docTemplate = `{
|
||||
"schemes": {{ marshal .Schemes }},
|
||||
"swagger": "2.0",
|
||||
"info": {
|
||||
"description": "{{escape .Description}}",
|
||||
"title": "{{.Title}}",
|
||||
"contact": {},
|
||||
"version": "{{.Version}}"
|
||||
},
|
||||
"host": "{{.Host}}",
|
||||
"basePath": "{{.BasePath}}",
|
||||
"paths": {
|
||||
"/example/helloworld": {
|
||||
"get": {
|
||||
"description": "do ping",
|
||||
"consumes": [
|
||||
"application/json"
|
||||
],
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"example"
|
||||
],
|
||||
"summary": "ping example",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "OK",
|
||||
"schema": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}`
|
||||
Reference in New Issue
Block a user