84 lines
1.9 KiB
Go
84 lines
1.9 KiB
Go
package swagger
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"backend/providers/http"
|
|
|
|
"git.ipao.vip/rogeecn/atom/container"
|
|
"git.ipao.vip/rogeecn/atom/utils/opt"
|
|
jsonpatch "github.com/evanphx/json-patch"
|
|
"github.com/gofiber/fiber/v2"
|
|
fiberSwagger "github.com/swaggo/fiber-swagger"
|
|
"github.com/swaggo/swag"
|
|
)
|
|
|
|
type Swagger struct {
|
|
config *Config
|
|
http http.Service
|
|
}
|
|
|
|
const infoTpl = `{"schemes": "__ marshal .Schemes __",
|
|
"swagger": "2.0",
|
|
"info": {
|
|
"description": "{{escape .Description}}",
|
|
"title": "{{.Title}}",
|
|
"contact": {},
|
|
"version": "{{.Version}}"
|
|
},
|
|
"host": "{{.Host}}",
|
|
"basePath": "{{.BasePath}}"}`
|
|
|
|
func (swagger *Swagger) Load(spec string) error {
|
|
original := []byte(spec)
|
|
target := []byte(infoTpl)
|
|
patch, err := jsonpatch.MergeMergePatches(original, target)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
merged, err := jsonpatch.MergePatch(original, patch)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
spec = strings.NewReplacer(`"__`, "{{", `__"`, "}}").Replace(string(merged))
|
|
|
|
swaggerInfo := &swag.Spec{
|
|
Version: swagger.config.Version,
|
|
Host: swagger.config.Host,
|
|
BasePath: swagger.config.BasePath,
|
|
Schemes: []string{},
|
|
Title: swagger.config.Title,
|
|
Description: swagger.config.Description,
|
|
InfoInstanceName: "swagger",
|
|
SwaggerTemplate: spec,
|
|
LeftDelim: "{{",
|
|
RightDelim: "}}",
|
|
}
|
|
swag.Register(swaggerInfo.InstanceName(), swaggerInfo)
|
|
engine := swagger.http.GetEngine().(*fiber.App)
|
|
|
|
engine.Get(fmt.Sprintf("/%s/*", swagger.config.BaseRoute), fiberSwagger.WrapHandler)
|
|
return nil
|
|
}
|
|
|
|
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"
|
|
}
|
|
return &Swagger{
|
|
config: &config,
|
|
http: http,
|
|
}
|
|
}, o.DiOptions()...)
|
|
}
|