Swgen
Swagger Generator
Install / Use
/learn @lazada/SwgenREADME
Swagger Generator (swgen)
Swagger Generator is a library which helps to generate Swagger Specification in JSON format on-the-fly.
Installation
You can use go get to install the swgen package
go get github.com/lazada/swgen
Then import it into your own code
import "github.com/lazada/swgen"
Example
package main
import (
"fmt"
"github.com/lazada/swgen"
)
// PetsRequest defines all params for /pets request
type PetsRequest struct {
Tags []string `schema:"tags" in:"query" required:"-" description:"tags to filter by"`
Limit int32 `schema:"limit" in:"query" required:"-" description:"maximum number of results to return"`
}
// Pet contains information of a pet
type Pet struct {
ID int64 `json:"id"`
Name string `json:"name"`
Tag string `json:"tag"`
}
func main() {
gen := swgen.NewGenerator()
gen.SetHost("petstore.swagger.io").SetBasePath("/api")
gen.SetInfo("Swagger Petstore (Simple)", "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", "http://helloreverb.com/terms/", "2.0")
gen.SetLicense("MIT", "http://opensource.org/licenses/MIT")
gen.SetContact("Swagger API team", "http://swagger.io", "foo@example.com")
gen.AddSecurityDefinition("BasicAuth", swgen.SecurityDef{Type: swgen.SecurityBasicAuth})
pathInf := swgen.PathItemInfo{
Path: "/pets",
Method: "GET",
Title: "findPets",
Description: "Returns all pets from the system that the user has access to",
Tag: "v1",
Deprecated: false,
Security: []string{"BasicAuth"},
}
pathInf.AddExtendedField("x-example", "example")
gen.SetPathItem(
pathInf,
PetsRequest{}, // request object
nil, // body data if any
[]Pet{}, // response object
)
// extended field
gen.AddExtendedField("x-uppercase-version", true)
docData, _ := gen.GenDocument()
fmt.Println(string(docData))
// output:
// {"swagger":"2.0","info":{"title":"Swagger Petstore (Simple)","description":"A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification","termsOfService":"http://helloreverb.com/terms/","contact":{"name":"Swagger API team","url":"http://swagger.io","email":"foo@example.com"},"license":{"name":"MIT","url":"http://opensource.org/licenses/MIT"},"version":"2.0"},"host":"petstore.swagger.io","basePath":"/api","schemes":["http","https"],"paths":{"/pets":{"get":{"tags":["v1"],"summary":"findPets","description":"Returns all pets from the system that the user has access to","parameters":[{"name":"tags","in":"query","type":"array","items":{"type":"string"},"collectionFormat":"multi","description":"tags to filter by"},{"name":"limit","in":"query","type":"integer","format":"int32","description":"maximum number of results to return"}],"responses":{"200":{"description":"request success","schema":{"type":"array","items":{"$ref":"#/definitions/Pet"}}}},"security":{"BasicAuth":[]},"x-example":"example"}}},"definitions":{"Pet":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"tag":{"type":"string"}}}},"securityDefinitions":{"BasicAuth":{"type":"basic"}},"x-uppercase-version":true}
}
Generate swagger docs for RPC service
You even can use swgen to generate swagger document for a JSON-RPC service as below example
package main
import (
"fmt"
"github.com/lazada/swgen"
)
const (
// XServiceType is a swagger vendor extension
XServiceType = `x-service-type`
// XAttachVersionToHead is a swagger vendor extension
XAttachVersionToHead = `x-attach-version-to-head`
)
// Pet contains information of a pet
type Pet struct {
ID int64 `json:"id"`
Name string `json:"name"`
Tag string `json:"tag"`
}
func main() {
gen := swgen.NewGenerator()
gen.SetHost("petstore.swagger.io")
gen.SetBasePath("/rpc") // set JSON-RPC path
gen.SetInfo("Swagger Petstore (Simple)", "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", "http://helloreverb.com/terms/", "2.0")
gen.SetLicense("MIT", "http://opensource.org/licenses/MIT")
gen.SetContact("Swagger API team", "http://swagger.io", "foo@example.com")
// set service type is JSON-RPC
gen.AddExtendedField(XServiceType, swgen.ServiceTypeJSONRPC)
gen.AddExtendedField(XAttachVersionToHead, false)
pathInf := swgen.PathItemInfo{
Path: "addPet", // in JSON-RPC, use name of method for Path
Method: "POST", // JSON-RPC always use POST method
Title: "Add new Pet",
Description: "Add a new pet to the store",
Tag: "v1",
Deprecated: false,
}
gen.SetPathItem(
pathInf,
nil, // no param, all in body
Pet{}, // body data if any
Pet{}, // response object
)
docData, _ := gen.GenDocument()
fmt.Println(string(docData))
// output:
// {"swagger":"2.0","info":{"title":"Swagger Petstore (Simple)","description":"A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification","termsOfService":"http://helloreverb.com/terms/","contact":{"name":"Swagger API team","url":"http://swagger.io","email":"foo@example.com"},"license":{"name":"MIT","url":"http://opensource.org/licenses/MIT"},"version":"2.0"},"host":"petstore.swagger.io","basePath":"/rpc","schemes":["http","https"],"paths":{"addPet":{"post":{"tags":["v1"],"summary":"Add new Pet","description":"Add a new pet to the store","parameters":[{"name":"body","in":"body","schema":{"$ref":"#/definitions/Pet"},"required":true}],"responses":{"200":{"description":"request success","schema":{"$ref":"#/definitions/Pet"}}}}}},"definitions":{"Pet":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"tag":{"type":"string"}}}},"x-attach-version-to-head":false,"x-service-type":"json-rpc"}
}
License
Distributed under the Apache License, version 2.0. Please see license file in code for more details.
Related Skills
node-connect
343.3kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
92.1kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
343.3kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
343.3kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
