mirror of
https://gitee.com/johng/gf.git
synced 2024-11-30 11:18:02 +08:00
144 lines
4.2 KiB
Go
144 lines
4.2 KiB
Go
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
|
//
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
// If a copy of the MIT was not distributed with this file,
|
|
// You can obtain one at https://github.com/gogf/gf.
|
|
|
|
// Package goai implements and provides document generating for OpenApi specification.
|
|
//
|
|
// https://editor.swagger.io/
|
|
package goai
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/gogf/gf/errors/gcode"
|
|
"github.com/gogf/gf/errors/gerror"
|
|
"github.com/gogf/gf/internal/intlog"
|
|
"github.com/gogf/gf/internal/json"
|
|
"reflect"
|
|
)
|
|
|
|
// OpenApiV3 is the structure defined from:
|
|
// https://swagger.io/specification/
|
|
// https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md
|
|
type OpenApiV3 struct {
|
|
Config Config `json:"-" yaml:"-"`
|
|
OpenAPI string `json:"openapi" yaml:"openapi"`
|
|
Components Components `json:"components,omitempty" yaml:"components,omitempty"`
|
|
Info Info `json:"info" yaml:"info"`
|
|
Paths Paths `json:"paths" yaml:"paths"`
|
|
Security *SecurityRequirements `json:"security,omitempty" yaml:"security,omitempty"`
|
|
Servers *Servers `json:"servers,omitempty" yaml:"servers,omitempty"`
|
|
Tags *Tags `json:"tags,omitempty" yaml:"tags,omitempty"`
|
|
ExternalDocs *ExternalDocs `json:"externalDocs,omitempty" yaml:"externalDocs,omitempty"`
|
|
}
|
|
|
|
// ExternalDocs is specified by OpenAPI/Swagger standard version 3.0.
|
|
type ExternalDocs struct {
|
|
URL string `json:"url,omitempty"`
|
|
Description string `json:"description,omitempty"`
|
|
}
|
|
|
|
const (
|
|
HttpMethodAll = `ALL`
|
|
HttpMethodGet = `GET`
|
|
HttpMethodPut = `PUT`
|
|
HttpMethodPost = `POST`
|
|
HttpMethodDelete = `DELETE`
|
|
HttpMethodConnect = `CONNECT`
|
|
HttpMethodHead = `HEAD`
|
|
HttpMethodOptions = `OPTIONS`
|
|
HttpMethodPatch = `PATCH`
|
|
HttpMethodTrace = `TRACE`
|
|
)
|
|
|
|
const (
|
|
TypeNumber = `number`
|
|
TypeBoolean = `boolean`
|
|
TypeArray = `array`
|
|
TypeString = `string`
|
|
TypeObject = `object`
|
|
FormatInt32 = `int32`
|
|
FormatInt64 = `int64`
|
|
FormatDouble = `double`
|
|
FormatByte = `byte`
|
|
FormatBinary = `binary`
|
|
FormatDate = `date`
|
|
FormatDateTime = `date-time`
|
|
FormatPassword = `password`
|
|
)
|
|
|
|
const (
|
|
ParameterInHeader = `header`
|
|
ParameterInPath = `path`
|
|
ParameterInQuery = `query`
|
|
ParameterInCookie = `cookie`
|
|
)
|
|
|
|
const (
|
|
TagNamePath = `path`
|
|
TagNameMethod = `method`
|
|
TagNameIn = `in`
|
|
TagNameMime = `mime`
|
|
)
|
|
|
|
var (
|
|
defaultReadContentTypes = []string{`application/json`, `application/xml`}
|
|
defaultWriteContentTypes = []string{`application/json`, `application/xml`}
|
|
)
|
|
|
|
// New creates and returns a OpenApiV3 implements object.
|
|
func New() *OpenApiV3 {
|
|
oai := &OpenApiV3{}
|
|
oai.fillWithDefaultValue()
|
|
return oai
|
|
}
|
|
|
|
// AddInput is the structured parameter for function OpenApiV3.Add.
|
|
type AddInput struct {
|
|
Path string // Path specifies the custom path if this is not configured in Meta of struct tag.
|
|
Method string // Method specifies the custom HTTP method if this is not configured in Meta of struct tag.
|
|
Object interface{} // Object can be an instance of struct or a route function.
|
|
}
|
|
|
|
// Add adds an instance of struct or a route function to OpenApiV3 definition implements.
|
|
func (oai *OpenApiV3) Add(in AddInput) error {
|
|
var (
|
|
reflectValue = reflect.ValueOf(in.Object)
|
|
)
|
|
for reflectValue.Kind() == reflect.Ptr {
|
|
reflectValue = reflectValue.Elem()
|
|
}
|
|
switch reflectValue.Kind() {
|
|
case reflect.Struct:
|
|
return oai.addSchema(in.Object)
|
|
|
|
case reflect.Func:
|
|
return oai.addPath(addPathInput{
|
|
Path: in.Path,
|
|
Method: in.Method,
|
|
Function: in.Object,
|
|
})
|
|
|
|
default:
|
|
return gerror.NewCodef(
|
|
gcode.CodeInvalidParameter,
|
|
`unsupported parameter type "%s", only struct/function type is supported`,
|
|
reflect.TypeOf(in.Object).String(),
|
|
)
|
|
}
|
|
}
|
|
|
|
func (oai OpenApiV3) String() string {
|
|
b, err := json.Marshal(oai)
|
|
if err != nil {
|
|
intlog.Error(context.TODO(), err)
|
|
}
|
|
return string(b)
|
|
}
|
|
|
|
func formatRefToBytes(ref string) []byte {
|
|
return []byte(fmt.Sprintf(`{"$ref":"#/components/schemas/%s"}`, ref))
|
|
}
|