add swagger

This commit is contained in:
yanghao05
2023-06-09 14:32:21 +08:00
parent 37bf456102
commit 3f27dee0b2
23 changed files with 245 additions and 89 deletions

View 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
View 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()...)
}

View 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"
}
}
}
}
}
}
}`