{"id":37090999,"url":"https://github.com/rizalgowandy/swag","last_synced_at":"2026-01-14T11:01:46.701Z","repository":{"id":45409322,"uuid":"394200283","full_name":"rizalgowandy/swag","owner":"rizalgowandy","description":"Automatically generate RESTful API documentation with Swagger 2.0 for Go.","archived":false,"fork":true,"pushed_at":"2024-08-20T13:26:37.000Z","size":4508,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-04T14:11:57.103Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"swaggo/swag","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rizalgowandy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"license","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-08-09T07:51:36.000Z","updated_at":"2021-12-10T22:22:29.000Z","dependencies_parsed_at":"2023-02-09T11:00:34.165Z","dependency_job_id":null,"html_url":"https://github.com/rizalgowandy/swag","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/rizalgowandy/swag","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rizalgowandy%2Fswag","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rizalgowandy%2Fswag/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rizalgowandy%2Fswag/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rizalgowandy%2Fswag/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rizalgowandy","download_url":"https://codeload.github.com/rizalgowandy/swag/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rizalgowandy%2Fswag/sbom","scorecard":{"id":777723,"data":{"date":"2025-08-11","repo":{"name":"github.com/rizalgowandy/swag","commit":"00a256c5ac54fdf8bcbb881effac288aabb9f976"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: license:0","Info: FSF or OSI recognized license: MIT License: license:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/rizalgowandy/swag/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/rizalgowandy/swag/ci.yml/master?enable=pin","Warn: containerImage not pinned by hash: .github/actions/danger/Dockerfile:1: pin your Docker image by updating ruby:2.6 to ruby:2.6@sha256:a79c8ddb7f3d3748427e2d3a45dcae6d42f1d80d9ae3b98959b3a27b220bf434","Warn: containerImage not pinned by hash: Dockerfile:4","Warn: downloadThenRun not pinned by hash: .github/workflows/ci.yml:51","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned","Info:   0 out of   1 downloadThenRun dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":0,"reason":"12 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-3vp4-m3rf-835h","Warn: Project is vulnerable to: GO-2023-1737 / GHSA-2c4m-59x9-fr2g","Warn: Project is vulnerable to: GO-2022-0493 / GHSA-p782-xgp4-8hr8","Warn: Project is vulnerable to: GO-2025-3770","Warn: Project is vulnerable to: GO-2022-0427 / GHSA-49w7-5r33-jm9m / GHSA-xg75-q3q5-cqmv","Warn: Project is vulnerable to: GO-2021-0227 / GHSA-3vm4-22fp-5rfm","Warn: Project is vulnerable to: GO-2022-0968 / GHSA-gwc9-m7rh-j2ww","Warn: Project is vulnerable to: GO-2021-0356 / GHSA-8c26-wmh5-6g9v","Warn: Project is vulnerable to: GO-2024-2961","Warn: Project is vulnerable to: GO-2023-2402 / GHSA-45x7-px36-x8w8","Warn: Project is vulnerable to: GO-2024-3321 / GHSA-v778-237x-gjrc","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T04:03:10.689Z","repository_id":45409322,"created_at":"2025-08-23T04:03:10.689Z","updated_at":"2025-08-23T04:03:10.689Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28417815,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T10:47:48.104Z","status":"ssl_error","status_checked_at":"2026-01-14T10:46:19.031Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-14T11:01:45.876Z","updated_at":"2026-01-14T11:01:46.692Z","avatar_url":"https://github.com/rizalgowandy.png","language":"Go","funding_links":["https://opencollective.com/swag"],"categories":[],"sub_categories":[],"readme":"# swag\n\n🌍 *[English](README.md) ∙ [简体中文](README_zh-CN.md)*\n\n\u003cimg align=\"right\" width=\"180px\" src=\"https://raw.githubusercontent.com/swaggo/swag/master/assets/swaggo.png\"\u003e\n\n[![Build Status](https://github.com/swaggo/swag/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/features/actions)\n[![Coverage Status](https://img.shields.io/codecov/c/github/swaggo/swag/master.svg)](https://codecov.io/gh/swaggo/swag)\n[![Go Report Card](https://goreportcard.com/badge/github.com/swaggo/swag)](https://goreportcard.com/report/github.com/swaggo/swag)\n[![codebeat badge](https://codebeat.co/badges/71e2f5e5-9e6b-405d-baf9-7cc8b5037330)](https://codebeat.co/projects/github-com-swaggo-swag-master)\n[![Go Doc](https://godoc.org/github.com/swaggo/swagg?status.svg)](https://godoc.org/github.com/swaggo/swag)\n[![Backers on Open Collective](https://opencollective.com/swag/backers/badge.svg)](#backers) \n[![Sponsors on Open Collective](https://opencollective.com/swag/sponsors/badge.svg)](#sponsors) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fswaggo%2Fswag.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fswaggo%2Fswag?ref=badge_shield)\n[![Release](https://img.shields.io/github/release/swaggo/swag.svg?style=flat-square)](https://github.com/swaggo/swag/releases)\n\n\nSwag converts Go annotations to Swagger Documentation 2.0. We've created a variety of plugins for popular [Go web frameworks](#supported-web-frameworks). This allows you to quickly integrate with an existing Go project (using Swagger UI).\n\n## Contents\n - [Getting started](#getting-started)\n - [Supported Web Frameworks](#supported-web-frameworks)\n - [How to use it with Gin](#how-to-use-it-with-gin)\n - [The swag formatter](#The swag formatter)\n - [Implementation Status](#implementation-status)\n - [Declarative Comments Format](#declarative-comments-format)\n\t- [General API Info](#general-api-info)\n\t- [API Operation](#api-operation)\n\t- [Security](#security)\n - [Examples](#examples)\n\t- [Descriptions over multiple lines](#descriptions-over-multiple-lines)\n\t- [User defined structure with an array type](#user-defined-structure-with-an-array-type)\n\t- [Model composition in response](#model-composition-in-response)\n\t- [Add a headers in response](#add-a-headers-in-response) \n\t- [Use multiple path params](#use-multiple-path-params)\n\t- [Example value of struct](#example-value-of-struct)\n\t- [Description of struct](#description-of-struct)\n\t- [Use swaggertype tag to supported custom type](#use-swaggertype-tag-to-supported-custom-type)\n\t- [Use global overrides to support a custom type](#use-global-overrides-to-support-a-custom-type)\n\t- [Use swaggerignore tag to exclude a field](#use-swaggerignore-tag-to-exclude-a-field)\n\t- [Add extension info to struct field](#add-extension-info-to-struct-field)\n\t- [Rename model to display](#rename-model-to-display)\n\t- [How to use security annotations](#how-to-use-security-annotations)\n\t- [Add a description for enum items](#add-a-description-for-enum-items)\n- [About the Project](#about-the-project)\n\n## Getting started\n\n1. Add comments to your API source code, See [Declarative Comments Format](#declarative-comments-format).\n\n2. Download swag by using:\n```sh\n$ go get -u github.com/swaggo/swag/cmd/swag\n\n# 1.16 or newer\n$ go install github.com/swaggo/swag/cmd/swag@latest\n```\nTo build from source you need [Go](https://golang.org/dl/) (1.13 or newer).\n\nOr download a pre-compiled binary from the [release page](https://github.com/swaggo/swag/releases).\n\n3. Run `swag init` in the project's root folder which contains the `main.go` file. This will parse your comments and generate the required files (`docs` folder and `docs/docs.go`).\n```sh\n$ swag init\n```\n\n  Make sure to import the generated `docs/docs.go` so that your specific configuration gets `init`'ed. If your General API annotations do not live in `main.go`, you can let swag know with `-g` flag.\n  ```sh\n  swag init -g http/api.go\n  ```\n\n4. (optional) Use `swag fmt` format the SWAG comment. (Please upgrade to the latest version)\n\n  ```sh\n  swag fmt\n  ```\n\n## swag cli\n\n```sh\n$ swag init -h\nNAME:\n   swag init - Create docs.go\n\nUSAGE:\n   swag init [command options] [arguments...]\n\nOPTIONS:\n   --generalInfo value, -g value          Go file path in which 'swagger general API Info' is written (default: \"main.go\")\n   --dir value, -d value                  Directory you want to parse (default: \"./\")\n   --exclude value                        Exclude directories and files when searching, comma separated\n   --propertyStrategy value, -p value     Property Naming Strategy like snakecase,camelcase,pascalcase (default: \"camelcase\")\n   --output value, -o value               Output directory for all the generated files(swagger.json, swagger.yaml and doc.go) (default: \"./docs\")\n   --parseVendor                          Parse go files in 'vendor' folder, disabled by default (default: false)\n   --parseDependency                      Parse go files in outside dependency folder, disabled by default (default: false)\n   --markdownFiles value, --md value      Parse folder containing markdown files to use as description, disabled by default\n   --codeExampleFiles value, --cef value  Parse folder containing code example files to use for the x-codeSamples extension, disabled by default\n   --parseInternal                        Parse go files in internal packages, disabled by default (default: false)\n   --generatedTime                        Generate timestamp at the top of docs.go, disabled by default (default: false)\n   --parseDepth value                     Dependency parse depth (default: 100)\n   --instanceName value                   Set the swagger document instance name (default: \"swagger\")\n   --help, -h                             show help (default: false)\n```\n\n```bash\nswag fmt -h\nNAME:\n   swag fmt - format swag comments\n\nUSAGE:\n   swag fmt [command options] [arguments...]\n\nOPTIONS:\n   --dir value, -d value          Directories you want to parse,comma separated and general-info file must be in the first one (default: \"./\")\n   --exclude value                Exclude directories and files when searching, comma separated\n   --generalInfo value, -g value  Go file path in which 'swagger general API Info' is written (default: \"main.go\")\n   --help, -h                     show help (default: false)\n\n```\n\n## Supported Web Frameworks\n\n- [gin](http://github.com/swaggo/gin-swagger)\n- [echo](http://github.com/swaggo/echo-swagger)\n- [buffalo](https://github.com/swaggo/buffalo-swagger)\n- [net/http](https://github.com/swaggo/http-swagger)\n- [flamingo](https://github.com/i-love-flamingo/swagger)\n- [fiber](https://github.com/arsmn/fiber-swagger)\n- [atreugo](https://github.com/Nerzal/atreugo-swagger)\n\n## How to use it with Gin\n\nFind the example source code [here](https://github.com/swaggo/swag/tree/master/example/celler).\n\n1. After using `swag init` to generate Swagger 2.0 docs, import the following packages:\n```go\nimport \"github.com/swaggo/gin-swagger\" // gin-swagger middleware\nimport \"github.com/swaggo/files\" // swagger embed files\n```\n\n2. Add [General API](#general-api-info) annotations in `main.go` code:\n\n```go\n// @title           Swagger Example API\n// @version         1.0\n// @description     This is a sample server celler server.\n// @termsOfService  http://swagger.io/terms/\n\n// @contact.name   API Support\n// @contact.url    http://www.swagger.io/support\n// @contact.email  support@swagger.io\n\n// @license.name  Apache 2.0\n// @license.url   http://www.apache.org/licenses/LICENSE-2.0.html\n\n// @host      localhost:8080\n// @BasePath  /api/v1\n\n// @securityDefinitions.basic  BasicAuth\nfunc main() {\n\tr := gin.Default()\n\n\tc := controller.NewController()\n\n\tv1 := r.Group(\"/api/v1\")\n\t{\n\t\taccounts := v1.Group(\"/accounts\")\n\t\t{\n\t\t\taccounts.GET(\":id\", c.ShowAccount)\n\t\t\taccounts.GET(\"\", c.ListAccounts)\n\t\t\taccounts.POST(\"\", c.AddAccount)\n\t\t\taccounts.DELETE(\":id\", c.DeleteAccount)\n\t\t\taccounts.PATCH(\":id\", c.UpdateAccount)\n\t\t\taccounts.POST(\":id/images\", c.UploadAccountImage)\n\t\t}\n    //...\n\t}\n\tr.GET(\"/swagger/*any\", ginSwagger.WrapHandler(swaggerFiles.Handler))\n\tr.Run(\":8080\")\n}\n//...\n```\n\nAdditionally some general API info can be set dynamically. The generated code package `docs` exports `SwaggerInfo` variable which we can use to set the title, description, version, host and base path programmatically. Example using Gin:\n\n```go\npackage main\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/swaggo/files\"\n\t\"github.com/swaggo/gin-swagger\"\n\t\n\t\"./docs\" // docs is generated by Swag CLI, you have to import it.\n)\n\n// @contact.name   API Support\n// @contact.url    http://www.swagger.io/support\n// @contact.email  support@swagger.io\n\n// @license.name  Apache 2.0\n// @license.url   http://www.apache.org/licenses/LICENSE-2.0.html\nfunc main() {\n\n\t// programmatically set swagger info\n\tdocs.SwaggerInfo.Title = \"Swagger Example API\"\n\tdocs.SwaggerInfo.Description = \"This is a sample server Petstore server.\"\n\tdocs.SwaggerInfo.Version = \"1.0\"\n\tdocs.SwaggerInfo.Host = \"petstore.swagger.io\"\n\tdocs.SwaggerInfo.BasePath = \"/v2\"\n\tdocs.SwaggerInfo.Schemes = []string{\"http\", \"https\"}\n\t\t\n\tr := gin.New()\n\n\t// use ginSwagger middleware to serve the API docs\n\tr.GET(\"/swagger/*any\", ginSwagger.WrapHandler(swaggerFiles.Handler))\n\n\tr.Run()\n}\n```\n\n3. Add [API Operation](#api-operation) annotations in `controller` code\n\n``` go\npackage controller\n\nimport (\n    \"fmt\"\n    \"net/http\"\n    \"strconv\"\n\n    \"github.com/gin-gonic/gin\"\n    \"github.com/swaggo/swag/example/celler/httputil\"\n    \"github.com/swaggo/swag/example/celler/model\"\n)\n\n// ShowAccount godoc\n// @Summary      Show an account\n// @Description  get string by ID\n// @Tags         accounts\n// @Accept       json\n// @Produce      json\n// @Param        id   path      int  true  \"Account ID\"\n// @Success      200  {object}  model.Account\n// @Failure      400  {object}  httputil.HTTPError\n// @Failure      404  {object}  httputil.HTTPError\n// @Failure      500  {object}  httputil.HTTPError\n// @Router       /accounts/{id} [get]\nfunc (c *Controller) ShowAccount(ctx *gin.Context) {\n  id := ctx.Param(\"id\")\n  aid, err := strconv.Atoi(id)\n  if err != nil {\n    httputil.NewError(ctx, http.StatusBadRequest, err)\n    return\n  }\n  account, err := model.AccountOne(aid)\n  if err != nil {\n    httputil.NewError(ctx, http.StatusNotFound, err)\n    return\n  }\n  ctx.JSON(http.StatusOK, account)\n}\n\n// ListAccounts godoc\n// @Summary      List accounts\n// @Description  get accounts\n// @Tags         accounts\n// @Accept       json\n// @Produce      json\n// @Param        q    query     string  false  \"name search by q\"  Format(email)\n// @Success      200  {array}   model.Account\n// @Failure      400  {object}  httputil.HTTPError\n// @Failure      404  {object}  httputil.HTTPError\n// @Failure      500  {object}  httputil.HTTPError\n// @Router       /accounts [get]\nfunc (c *Controller) ListAccounts(ctx *gin.Context) {\n  q := ctx.Request.URL.Query().Get(\"q\")\n  accounts, err := model.AccountsAll(q)\n  if err != nil {\n    httputil.NewError(ctx, http.StatusNotFound, err)\n    return\n  }\n  ctx.JSON(http.StatusOK, accounts)\n}\n//...\n```\n\n```console\n$ swag init\n```\n\n4. Run your app, and browse to http://localhost:8080/swagger/index.html. You will see Swagger 2.0 Api documents as shown below:\n\n![swagger_index.html](https://raw.githubusercontent.com/swaggo/swag/master/assets/swagger-image.png)\n\n## The swag formatter\n\nThe Swag Comments can be automatically formatted, just like 'go fmt'.  \nFind the result of formatting [here](https://github.com/swaggo/swag/tree/master/example/celler).\n\nUsage: \n```shell\nswag fmt\n```\n\nExclude folder：\n```shell\nswag fmt -d ./ --exclude ./internal\n```\n\n## Implementation Status\n\n[Swagger 2.0 document](https://swagger.io/docs/specification/2-0/basic-structure/)\n\n- [x] Basic Structure\n- [x] API Host and Base Path\n- [x] Paths and Operations\n- [x] Describing Parameters\n- [x] Describing Request Body\n- [x] Describing Responses\n- [x] MIME Types\n- [x] Authentication\n  - [x] Basic Authentication\n  - [x] API Keys\n- [x] Adding Examples\n- [x] File Upload\n- [x] Enums\n- [x] Grouping Operations With Tags\n- [ ] Swagger Extensions\n\n# Declarative Comments Format\n\n## General API Info\n\n**Example**\n[celler/main.go](https://github.com/swaggo/swag/blob/master/example/celler/main.go)\n\n| annotation  | description                                | example                         |\n|-------------|--------------------------------------------|---------------------------------|\n| title       | **Required.** The title of the application.| // @title Swagger Example API   |\n| version     | **Required.** Provides the version of the application API.| // @version 1.0  |\n| description | A short description of the application.    |// @description This is a sample server celler server.         \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t |\n| tag.name    | Name of a tag.| // @tag.name This is the name of the tag                     |\n| tag.description   | Description of the tag  | // @tag.description Cool Description         |\n| tag.docs.url      | Url of the external Documentation of the tag | // @tag.docs.url https://example.com|\n| tag.docs.description  | Description of the external Documentation of the tag| // @tag.docs.description Best example documentation |\n| termsOfService | The Terms of Service for the API.| // @termsOfService http://swagger.io/terms/                     |\n| contact.name | The contact information for the exposed API.| // @contact.name API Support  |\n| contact.url  | The URL pointing to the contact information. MUST be in the format of a URL.  | // @contact.url http://www.swagger.io/support|\n| contact.email| The email address of the contact person/organization. MUST be in the format of an email address.| // @contact.email support@swagger.io                                   |\n| license.name | **Required.** The license name used for the API.|// @license.name Apache 2.0|\n| license.url  | A URL to the license used for the API. MUST be in the format of a URL.                       | // @license.url http://www.apache.org/licenses/LICENSE-2.0.html |\n| host        | The host (name or ip) serving the API.     | // @host localhost:8080         |\n| BasePath    | The base path on which the API is served. | // @BasePath /api/v1             |\n| accept      | A list of MIME types the APIs can consume. Note that Accept only affects operations with a request body, such as POST, PUT and PATCH.  Value MUST be as described under [Mime Types](#mime-types).                     | // @accept json |\n| produce     | A list of MIME types the APIs can produce. Value MUST be as described under [Mime Types](#mime-types).                     | // @produce json |\n| query.collection.format | The default collection(array) param format in query,enums:csv,multi,pipes,tsv,ssv. If not set, csv is the default.| // @query.collection.format multi\n| schemes     | The transfer protocol for the operation that separated by spaces. | // @schemes http https |\n| x-name      | The extension key, must be start by x- and take only json value | // @x-example-key {\"key\": \"value\"} |\n\n### Using markdown descriptions\nWhen a short string in your documentation is insufficient, or you need images, code examples and things like that you may want to use markdown descriptions. In order to use markdown descriptions use the following annotations.\n\n\n| annotation  | description                                | example                         |\n|-------------|--------------------------------------------|---------------------------------|\n| title       | **Required.** The title of the application.| // @title Swagger Example API   |\n| version     | **Required.** Provides the version of the application API.| // @version 1.0  |\n| description.markdown  | A short description of the application. Parsed from the api.md file. This is an alternative to @description    |// @description.markdown No value needed, this parses the description from api.md         \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t |\n| tag.name    | Name of a tag.| // @tag.name This is the name of the tag                     |\n| tag.description.markdown   | Description of the tag this is an alternative to tag.description. The description will be read from a file named like tagname.md  | // @tag.description.markdown         |\n\n\n## API Operation\n\n**Example**\n[celler/controller](https://github.com/swaggo/swag/tree/master/example/celler/controller)\n\n\n| annotation  | description                                                                                                                |\n|-------------|----------------------------------------------------------------------------------------------------------------------------|\n| description | A verbose explanation of the operation behavior.                                                                           |\n| description.markdown     |  A short description of the application. The description will be read from a file named like endpointname.md| // @description.file endpoint.description.markdown  |\n| id          | A unique string used to identify the operation. Must be unique among all API operations.                                   |\n| tags        | A list of tags to each API operation that separated by commas.                                                             |\n| summary     | A short summary of what the operation does.                                                                                |\n| accept      | A list of MIME types the APIs can consume. Note that Accept only affects operations with a request body, such as POST, PUT and PATCH.  Value MUST be as described under [Mime Types](#mime-types).                     |\n| produce     | A list of MIME types the APIs can produce. Value MUST be as described under [Mime Types](#mime-types).                     |\n| param       | Parameters that separated by spaces. `param name`,`param type`,`data type`,`is mandatory?`,`comment` `attribute(optional)` |\n| security    | [Security](#security) to each API operation.                                                                               |\n| success     | Success response that separated by spaces. `return code or default`,`{param type}`,`data type`,`comment`                   |\n| failure     | Failure response that separated by spaces. `return code or default`,`{param type}`,`data type`,`comment`                    |\n| response    | As same as `success` and `failure` |\n| header      | Header in response that separated by spaces. `return code`,`{param type}`,`data type`,`comment`                            |\n| router      | Path definition that separated by spaces. `path`,`[httpMethod]`                                                            |\n| x-name      | The extension key, must be start by x- and take only json value.                                                           |\n| x-codeSample      | Optional Markdown usage. take `file` as parameter. This will then search for a file named like the summary in the given folder.                                      |\n| deprecated  | Mark endpoint as deprecated.                                                                                               |\n\n\n\n## Mime Types\n\n`swag` accepts all MIME Types which are in the correct format, that is, match `*/*`.\nBesides that, `swag` also accepts aliases for some MIME Types as follows:\n\n| Alias                 | MIME Type                         |\n|-----------------------|-----------------------------------|\n| json                  | application/json                  |\n| xml                   | text/xml                          |\n| plain                 | text/plain                        |\n| html                  | text/html                         |\n| mpfd                  | multipart/form-data               |\n| x-www-form-urlencoded | application/x-www-form-urlencoded |\n| json-api              | application/vnd.api+json          |\n| json-stream           | application/x-json-stream         |\n| octet-stream          | application/octet-stream          |\n| png                   | image/png                         |\n| jpeg                  | image/jpeg                        |\n| gif                   | image/gif                         |\n\n\n\n## Param Type\n\n- query\n- path\n- header\n- body\n- formData\n\n## Data Type\n\n- string (string)\n- integer (int, uint, uint32, uint64)\n- number (float32)\n- boolean (bool)\n- user defined struct\n\n## Security\n| annotation | description | parameters | example |\n|------------|-------------|------------|---------|\n| securitydefinitions.basic  | [Basic](https://swagger.io/docs/specification/2-0/authentication/basic-authentication/) auth.  |                                   | // @securityDefinitions.basic BasicAuth                      |\n| securitydefinitions.apikey | [API key](https://swagger.io/docs/specification/2-0/authentication/api-keys/) auth.            | in, name                          | // @securityDefinitions.apikey ApiKeyAuth                    |\n| securitydefinitions.oauth2.application  | [OAuth2 application](https://swagger.io/docs/specification/authentication/oauth2/) auth.       | tokenUrl, scope                   | // @securitydefinitions.oauth2.application OAuth2Application |\n| securitydefinitions.oauth2.implicit     | [OAuth2 implicit](https://swagger.io/docs/specification/authentication/oauth2/) auth.          | authorizationUrl, scope           | // @securitydefinitions.oauth2.implicit OAuth2Implicit       |\n| securitydefinitions.oauth2.password     | [OAuth2 password](https://swagger.io/docs/specification/authentication/oauth2/) auth.          | tokenUrl, scope                   | // @securitydefinitions.oauth2.password OAuth2Password       |\n| securitydefinitions.oauth2.accessCode   | [OAuth2 access code](https://swagger.io/docs/specification/authentication/oauth2/) auth.       | tokenUrl, authorizationUrl, scope | // @securitydefinitions.oauth2.accessCode OAuth2AccessCode   |\n\n\n| parameters annotation | example                                                  |\n|-----------------------|----------------------------------------------------------|\n| in                    | // @in header                                            |\n| name                  | // @name Authorization                                   |\n| tokenUrl              | // @tokenUrl https://example.com/oauth/token             |\n| authorizationurl      | // @authorizationurl https://example.com/oauth/authorize |\n| scope.hoge            | // @scope.write Grants write access                      |\n\n\n## Attribute\n\n```go\n// @Param   enumstring  query     string     false  \"string enums\"       Enums(A, B, C)\n// @Param   enumint     query     int        false  \"int enums\"          Enums(1, 2, 3)\n// @Param   enumnumber  query     number     false  \"int enums\"          Enums(1.1, 1.2, 1.3)\n// @Param   string      query     string     false  \"string valid\"       minlength(5)  maxlength(10)\n// @Param   int         query     int        false  \"int valid\"          minimum(1)    maximum(10)\n// @Param   default     query     string     false  \"string default\"     default(A)\n// @Param   collection  query     []string   false  \"string collection\"  collectionFormat(multi)\n// @Param   extensions  query     []string   false  \"string collection\"  extensions(x-example=test,x-nullable)\n```\n\nIt also works for the struct fields:\n\n```go\ntype Foo struct {\n    Bar string `minLength:\"4\" maxLength:\"16\"`\n    Baz int `minimum:\"10\" maximum:\"20\" default:\"15\"`\n    Qux []string `enums:\"foo,bar,baz\"`\n}\n```\n\n### Available\n\nField Name | Type | Description\n---|:---:|---\n\u003ca name=\"validate\"\u003e\u003c/a\u003evalidate | `string` | \tDetermines the validation for the parameter. Possible values are: `required`. \n\u003ca name=\"parameterDefault\"\u003e\u003c/a\u003edefault | * | Declares the value of the parameter that the server will use if none is provided, for example a \"count\" to control the number of results per page might default to 100 if not supplied by the client in the request. (Note: \"default\" has no meaning for required parameters.)  See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2. Unlike JSON Schema this value MUST conform to the defined [`type`](#parameterType) for this parameter.\n\u003ca name=\"parameterMaximum\"\u003e\u003c/a\u003emaximum | `number` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.2.\n\u003ca name=\"parameterMinimum\"\u003e\u003c/a\u003eminimum | `number` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.3.\n\u003ca name=\"parameterMultipleOf\"\u003e\u003c/a\u003emultipleOf | `number` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.1.\n\u003ca name=\"parameterMaxLength\"\u003e\u003c/a\u003emaxLength | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.1.\n\u003ca name=\"parameterMinLength\"\u003e\u003c/a\u003eminLength | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.2.\n\u003ca name=\"parameterEnums\"\u003e\u003c/a\u003eenums | [\\*] | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1.\n\u003ca name=\"parameterFormat\"\u003e\u003c/a\u003eformat | `string` | The extending format for the previously mentioned [`type`](#parameterType). See [Data Type Formats](https://swagger.io/specification/v2/#dataTypeFormat) for further details.\n\u003ca name=\"parameterCollectionFormat\"\u003e\u003c/a\u003ecollectionFormat | `string` |Determines the format of the array if type array is used. Possible values are: \u003cul\u003e\u003cli\u003e`csv` - comma separated values `foo,bar`. \u003cli\u003e`ssv` - space separated values `foo bar`. \u003cli\u003e`tsv` - tab separated values `foo\\tbar`. \u003cli\u003e`pipes` - pipe separated values \u003ccode\u003efoo\u0026#124;bar\u003c/code\u003e. \u003cli\u003e`multi` - corresponds to multiple parameter instances instead of multiple values for a single instance `foo=bar\u0026foo=baz`. This is valid only for parameters [`in`](#parameterIn) \"query\" or \"formData\". \u003c/ul\u003e Default value is `csv`.\n\u003ca name=\"parameterExtensions\"\u003e\u003c/a\u003eextensions | `string` | Add extension to parameters.\n\n### Future\n\nField Name | Type | Description\n---|:---:|---\n\u003ca name=\"parameterPattern\"\u003e\u003c/a\u003epattern | `string` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3.\n\u003ca name=\"parameterMaxItems\"\u003e\u003c/a\u003emaxItems | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.2.\n\u003ca name=\"parameterMinItems\"\u003e\u003c/a\u003eminItems | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.3.\n\u003ca name=\"parameterUniqueItems\"\u003e\u003c/a\u003euniqueItems | `boolean` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.4.\n\n## Examples\n\n### Descriptions over multiple lines\n\nYou can add descriptions spanning multiple lines in either the general api description or routes definitions like so: \n\n```go\n// @description This is the first line\n// @description This is the second line\n// @description And so forth.\n```\n\n### User defined structure with an array type\n\n```go\n// @Success 200 {array} model.Account \u003c-- This is a user defined struct.\n```\n\n```go\npackage model\n\ntype Account struct {\n    ID   int    `json:\"id\" example:\"1\"`\n    Name string `json:\"name\" example:\"account name\"`\n}\n```\n\n### Model composition in response\n```go\n// JSONResult's data field will be overridden by the specific type proto.Order\n@success 200 {object} jsonresult.JSONResult{data=proto.Order} \"desc\"\n```\n\n```go\ntype JSONResult struct {\n    Code    int          `json:\"code\" `\n    Message string       `json:\"message\"`\n    Data    interface{}  `json:\"data\"`\n}\n\ntype Order struct { //in `proto` package\n    Id  uint            `json:\"id\"`\n    Data  interface{}   `json:\"data\"`\n}\n```\n\n- also support array of objects and primitive types as nested response\n```go\n@success 200 {object} jsonresult.JSONResult{data=[]proto.Order} \"desc\"\n@success 200 {object} jsonresult.JSONResult{data=string} \"desc\"\n@success 200 {object} jsonresult.JSONResult{data=[]string} \"desc\"\n```\n\n- overriding multiple fields. field will be added if not exists \n```go\n@success 200 {object} jsonresult.JSONResult{data1=string,data2=[]string,data3=proto.Order,data4=[]proto.Order} \"desc\"\n```\n- overriding deep-level fields\n```go\ntype DeepObject struct { //in `proto` package\n\t...\n}\n@success 200 {object} jsonresult.JSONResult{data1=proto.Order{data=proto.DeepObject},data2=[]proto.Order{data=[]proto.DeepObject}} \"desc\"\n```\n### Add a headers in response\n\n```go\n// @Success      200              {string}  string    \"ok\"\n// @failure      400              {string}  string    \"error\"\n// @response     default          {string}  string    \"other error\"\n// @Header       200              {string}  Location  \"/entity/1\"\n// @Header       200,400,default  {string}  Token     \"token\"\n// @Header       all              {string}  Token2    \"token2\"\n```\n\n### Use multiple path params\n\n```go\n/// ...\n// @Param group_id   path int true \"Group ID\"\n// @Param account_id path int true \"Account ID\"\n// ...\n// @Router /examples/groups/{group_id}/accounts/{account_id} [get]\n```\n\n### Add multiple paths\n\n```go\n/// ...\n// @Param group_id path int true \"Group ID\"\n// @Param user_id  path int true \"User ID\"\n// ...\n// @Router /examples/groups/{group_id}/user/{user_id}/address [put]\n// @Router /examples/user/{user_id}/address [put]\n```\n\n### Example value of struct\n\n```go\ntype Account struct {\n    ID   int    `json:\"id\" example:\"1\"`\n    Name string `json:\"name\" example:\"account name\"`\n    PhotoUrls []string `json:\"photo_urls\" example:\"http://test/image/1.jpg,http://test/image/2.jpg\"`\n}\n```\n\n### Description of struct\n\n```go\ntype Account struct {\n\t// ID this is userid\n\tID   int    `json:\"id\"`\n\tName string `json:\"name\"` // This is Name\n}\n```\n\n### Use swaggertype tag to supported custom type\n[#201](https://github.com/swaggo/swag/issues/201#issuecomment-475479409)\n\n```go\ntype TimestampTime struct {\n    time.Time\n}\n\n///implement encoding.JSON.Marshaler interface\nfunc (t *TimestampTime) MarshalJSON() ([]byte, error) {\n    bin := make([]byte, 16)\n    bin = strconv.AppendInt(bin[:0], t.Time.Unix(), 10)\n    return bin, nil\n}\n\nfunc (t *TimestampTime) UnmarshalJSON(bin []byte) error {\n    v, err := strconv.ParseInt(string(bin), 10, 64)\n    if err != nil {\n        return err\n    }\n    t.Time = time.Unix(v, 0)\n    return nil\n}\n///\n\ntype Account struct {\n    // Override primitive type by simply specifying it via `swaggertype` tag\n    ID     sql.NullInt64 `json:\"id\" swaggertype:\"integer\"`\n\n    // Override struct type to a primitive type 'integer' by specifying it via `swaggertype` tag\n    RegisterTime TimestampTime `json:\"register_time\" swaggertype:\"primitive,integer\"`\n\n    // Array types can be overridden using \"array,\u003cprim_type\u003e\" format\n    Coeffs []big.Float `json:\"coeffs\" swaggertype:\"array,number\"`\n}\n```\n\n[#379](https://github.com/swaggo/swag/issues/379)\n```go\ntype CerticateKeyPair struct {\n\tCrt []byte `json:\"crt\" swaggertype:\"string\" format:\"base64\" example:\"U3dhZ2dlciByb2Nrcw==\"`\n\tKey []byte `json:\"key\" swaggertype:\"string\" format:\"base64\" example:\"U3dhZ2dlciByb2Nrcw==\"`\n}\n```\ngenerated swagger doc as follows:\n```go\n\"api.MyBinding\": {\n  \"type\":\"object\",\n  \"properties\":{\n    \"crt\":{\n      \"type\":\"string\",\n      \"format\":\"base64\",\n      \"example\":\"U3dhZ2dlciByb2Nrcw==\"\n    },\n    \"key\":{\n      \"type\":\"string\",\n      \"format\":\"base64\",\n      \"example\":\"U3dhZ2dlciByb2Nrcw==\"\n    }\n  }\n}\n\n```\n\n### Use global overrides to support a custom type\n\nIf you are using generated files, the [`swaggertype`](#use-swaggertype-tag-to-supported-custom-type) or `swaggerignore` tags may not be possible.\n\nBy passing a mapping to swag with `--overridesFile` you can tell swag to use one type in place of another wherever it appears. By default, if a `.swaggo` file is present in the current directory it will be used.\n\nGo code:\n```go\ntype MyStruct struct {\n  ID     sql.NullInt64 `json:\"id\"`\n  Name   sql.NullString `json:\"name\"`\n}\n```\n\n`.swaggo`:\n```\n// Replace all NullInt64 with int\nreplace database/sql.NullInt64 int\n\n// Don't include any fields of type database/sql.NullString in the swagger docs\nskip    database/sql.NullString\n```\n\nPossible directives are comments (beginning with `//`), `replace path/to/a.type path/to/b.type`, and `skip path/to/a.type`.\n\n(Note that the full paths to any named types must be provided to prevent problems when multiple packages define a type with the same name)\n\nRendered:\n```go\n\"types.MyStruct\": {\n  \"id\": \"integer\"\n}\n```\n    \n\n### Use swaggerignore tag to exclude a field\n\n```go\ntype Account struct {\n    ID   string    `json:\"id\"`\n    Name string     `json:\"name\"`\n    Ignored int     `swaggerignore:\"true\"`\n}\n```\n\n### Add extension info to struct field\n\n```go\ntype Account struct {\n    ID   string    `json:\"id\"   extensions:\"x-nullable,x-abc=def,!x-omitempty\"` // extensions fields must start with \"x-\"\n}\n```\n\ngenerate swagger doc as follows:\n\n```go\n\"Account\": {\n    \"type\": \"object\",\n    \"properties\": {\n        \"id\": {\n            \"type\": \"string\",\n            \"x-nullable\": true,\n            \"x-abc\": \"def\",\n            \"x-omitempty\": false\n        }\n    }\n}\n```\n### Rename model to display\n\n```golang\ntype Resp struct {\n\tCode int\n}//@name Response\n```\n\n### How to use security annotations\n\nGeneral API info.\n\n```go\n// @securityDefinitions.basic BasicAuth\n\n// @securitydefinitions.oauth2.application OAuth2Application\n// @tokenUrl https://example.com/oauth/token\n// @scope.write Grants write access\n// @scope.admin Grants read and write access to administrative information\n```\n\nEach API operation.\n\n```go\n// @Security ApiKeyAuth\n```\n\nMake it AND condition\n\n```go\n// @Security ApiKeyAuth\n// @Security OAuth2Application[write, admin]\n```\n\n### Add a description for enum items\n\n```go\ntype Example struct {\n\t// Sort order:\n\t// * asc - Ascending, from A to Z.\n\t// * desc - Descending, from Z to A.\n\tOrder string `enums:\"asc,desc\"`\n}\n```\n\n## About the Project\nThis project was inspired by [yvasiyarov/swagger](https://github.com/yvasiyarov/swagger) but we simplified the usage and added support a variety of [web frameworks](#supported-web-frameworks). Gopher image source is [tenntenn/gopher-stickers](https://github.com/tenntenn/gopher-stickers). It has licenses [creative commons licensing](http://creativecommons.org/licenses/by/3.0/deed.en).\n## Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n\u003ca href=\"https://github.com/swaggo/swag/graphs/contributors\"\u003e\u003cimg src=\"https://opencollective.com/swag/contributors.svg?width=890\u0026button=false\" /\u003e\u003c/a\u003e\n\n\n## Backers\n\nThank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/swag#backer)]\n\n\u003ca href=\"https://opencollective.com/swag#backers\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/swag/backers.svg?width=890\"\u003e\u003c/a\u003e\n\n\n## Sponsors\n\nSupport this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/swag#sponsor)]\n\n\u003ca href=\"https://opencollective.com/swag/sponsor/0/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/swag/sponsor/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/swag/sponsor/1/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/swag/sponsor/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/swag/sponsor/2/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/swag/sponsor/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/swag/sponsor/3/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/swag/sponsor/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/swag/sponsor/4/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/swag/sponsor/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/swag/sponsor/5/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/swag/sponsor/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/swag/sponsor/6/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/swag/sponsor/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/swag/sponsor/7/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/swag/sponsor/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/swag/sponsor/8/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/swag/sponsor/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/swag/sponsor/9/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/swag/sponsor/9/avatar.svg\"\u003e\u003c/a\u003e\n\n\n\n\n## License\n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fswaggo%2Fswag.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fswaggo%2Fswag?ref=badge_large)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frizalgowandy%2Fswag","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frizalgowandy%2Fswag","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frizalgowandy%2Fswag/lists"}