Skip to content

Commit 1c5e373

Browse files
fredbiclaude
andauthored
doc: doc site on github pages (#448)
Configured hugo build and CI. Published a complete documentation site for github pages, with many code examples. * fixes #124 doc(site): externalize Go code examples to docs/examples/ (separate module). > go code lives better as actual source that builds, lint and format > without any extra tools. Hugo uses a custom shortcode to render source. {{< code file=... region=... >}} shortcode includes sourced from a new docs/examples/ module (separate go.mod). The shortcode supports named regions via // snippet:NAME / // endsnippet:NAME markers, auto-emits a "Full source" link to GitHub URL, and auto-strips //nolint: directives so they do not leak into rendered snippets. interface defs identical to source, excerpt and pseudocode blocks intentionally left inline. doc(site): add Features and Tutorials sections Adds a Features overview page with normative RFC references for the standards this runtime implements (HTTP, content negotiation, URI template, media types, auth, tracing). Adds a Tutorials section that absorbs the formerly top-level FAQ.md, MEDIA_TYPES.md and KEEP-ALIVE.md as Hugo pages. doc(site): integrate compression middleware example Adds a new "Custom middleware" subsection under usage/examples/ and its first recipe page (compression). Signed-off-by: Frederic BIDON <fredbi@yahoo.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 6244633 commit 1c5e373

104 files changed

Lines changed: 7505 additions & 123 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/update-doc.yml

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
name: "Update documentation"
2+
3+
permissions:
4+
contents: read
5+
6+
on:
7+
push:
8+
tags:
9+
- v*
10+
branches: [ "master" ]
11+
paths:
12+
- docs/**
13+
- hack/doc-site/**
14+
- .github/workflows/update-doc.yml
15+
16+
pull_request:
17+
paths:
18+
- docs/**
19+
- hack/doc-site/**
20+
- .github/workflows/update-doc.yml
21+
22+
concurrency:
23+
group: "pages"
24+
cancel-in-progress: false
25+
26+
defaults:
27+
run:
28+
shell: bash
29+
30+
jobs:
31+
build-doc:
32+
runs-on: ubuntu-latest
33+
steps:
34+
-
35+
name: Checkout
36+
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
37+
with:
38+
fetch-depth: '1'
39+
submodules: recursive
40+
sparse-checkout: |
41+
hack/
42+
docs/
43+
-
44+
name: Get all tags [go-openapi repo]
45+
if: ${{ github.repository == 'go-openapi/runtime' }}
46+
run: |
47+
git fetch origin --prune --update-shallow --tags 'refs/tags/*:refs/tags/*'
48+
-
49+
name: Get all tags [fork]
50+
if: ${{ github.repository != 'go-openapi/runtime' }}
51+
run: |
52+
git remote add upstream "https://github.com/go-openapi/runtime"
53+
git fetch upstream --prune --update-shallow --tags 'refs/tags/*:refs/tags/*'
54+
git fetch origin --prune --update-shallow --tags 'refs/tags/*:refs/tags/*'
55+
-
56+
name: Initialize theme
57+
env:
58+
RELEARN_VERSION: 9.0.3
59+
run: |
60+
cd hack/doc-site/hugo
61+
62+
# Clone theme
63+
curl -sL -o relearn.tgz https://github.com/McShelby/hugo-theme-relearn/archive/refs/tags/"${RELEARN_VERSION}".tar.gz
64+
tar xf relearn.tgz
65+
rm -rf themes/hugo-relearn
66+
mv "hugo-theme-relearn-${RELEARN_VERSION}" hugo-relearn
67+
mv hugo-relearn themes/
68+
-
69+
name: Prepare config
70+
run: |
71+
# Builds a commit-dependant extra config to inject parameterization.
72+
# HUGO doesn't support config from the command line.
73+
#
74+
# Set specific parameters that are used in some parameterized document.
75+
# This is used to keep up-to-date installation instructions.
76+
cd hack/doc-site/hugo
77+
78+
ROOT=$(git rev-parse --show-toplevel)
79+
VERSION_MESSAGE="Documentation set for latest master."
80+
REQUIRED_GO_VERSION=$(grep "^go\s" "${ROOT}"/go.mod|cut -d" " -f2)
81+
LATEST_RELEASE=$(git tag --list --sort -version:refname 'v*' 2>/dev/null | head -1 || echo "dev")
82+
BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
83+
84+
echo " Latest release: ${LATEST_RELEASE}"
85+
echo " Go version: ${REQUIRED_GO_VERSION}"
86+
echo " Build time: ${BUILD_TIME}"
87+
echo " Version message: ${VERSION_MESSAGE}"
88+
89+
# Generate dynamic config
90+
cat runtime.yaml.template \
91+
| sed "s|{{ GO_VERSION }}|${REQUIRED_GO_VERSION}|g" \
92+
| sed "s|{{ LATEST_RELEASE }}|${LATEST_RELEASE}|g" \
93+
| sed "s|{{ VERSION_MESSAGE }}|${VERSION_MESSAGE}|g" \
94+
| sed "s|{{ BUILD_TIME }}|${BUILD_TIME}|g" \
95+
> runtime.yaml
96+
-
97+
name: Build site with Hugo
98+
uses: crazy-max/ghaction-hugo@58bd8ea36dbac3f6155d275a04e0b55604a93c48 # v3.2.0
99+
with:
100+
version: v0.153.3 # <- pin the HUGO version, as they often break things
101+
extended: true
102+
args: >
103+
--config hugo.yaml,runtime.yaml
104+
--buildDrafts
105+
--cleanDestinationDir
106+
--minify
107+
--printPathWarnings
108+
--ignoreCache
109+
--noBuildLock
110+
--logLevel info
111+
--source ${{ github.workspace }}/hack/doc-site/hugo
112+
-
113+
name: Upload artifact
114+
uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0
115+
with:
116+
path: hack/doc-site/hugo/public
117+
118+
deploy-doc:
119+
if: ${{ github.event_name != 'pull_request' }}
120+
needs: build-doc
121+
outputs:
122+
url: ${{ steps.deployment.outputs.page_url }}
123+
runs-on: ubuntu-latest
124+
permissions:
125+
pages: write
126+
id-token: write
127+
environment:
128+
name: github-pages
129+
url: ${{ steps.deployment.outputs.page_url }}
130+
steps:
131+
-
132+
name: Deploy to GitHub Pages
133+
id: deployment
134+
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5
135+
-
136+
name: Report URL
137+
run: |
138+
echo "::notice::Deployed doc site to ${{ steps.deployment.outputs.page_url }}"

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ on top of which it has been built.
9494

9595
## Other documentation
9696

97-
* [FAQ](docs/FAQ.md)
97+
* [FAQ](https://go-openapi.github.io/runtime/tutorials/faq/) · [Media-type selection](https://go-openapi.github.io/runtime/tutorials/media-types/) · [Client keep-alive](https://go-openapi.github.io/runtime/tutorials/keep-alive/)
9898
* [All-time contributors](./CONTRIBUTORS.md)
9999
* [Contributing guidelines][contributing-doc-site]
100100
* [Maintainers documentation][maintainers-doc-site]

client-middleware/opentracing/go.mod

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,20 @@ require (
1313
github.com/go-logr/stdr v1.2.2 // indirect
1414
github.com/go-openapi/analysis v0.25.0 // indirect
1515
github.com/go-openapi/errors v0.22.7 // indirect
16-
github.com/go-openapi/jsonpointer v0.22.5 // indirect
16+
github.com/go-openapi/jsonpointer v0.23.1 // indirect
1717
github.com/go-openapi/jsonreference v0.21.5 // indirect
1818
github.com/go-openapi/loads v0.23.3 // indirect
1919
github.com/go-openapi/runtime/server-middleware v0.30.0 // indirect
2020
github.com/go-openapi/spec v0.22.4 // indirect
2121
github.com/go-openapi/swag/conv v0.26.0 // indirect
2222
github.com/go-openapi/swag/fileutils v0.26.0 // indirect
23-
github.com/go-openapi/swag/jsonname v0.25.5 // indirect
23+
github.com/go-openapi/swag/jsonname v0.26.0 // indirect
2424
github.com/go-openapi/swag/jsonutils v0.26.0 // indirect
25-
github.com/go-openapi/swag/loading v0.25.5 // indirect
26-
github.com/go-openapi/swag/mangling v0.25.5 // indirect
25+
github.com/go-openapi/swag/loading v0.26.0 // indirect
26+
github.com/go-openapi/swag/mangling v0.26.0 // indirect
2727
github.com/go-openapi/swag/stringutils v0.26.0 // indirect
2828
github.com/go-openapi/swag/typeutils v0.26.0 // indirect
29-
github.com/go-openapi/swag/yamlutils v0.25.5 // indirect
29+
github.com/go-openapi/swag/yamlutils v0.26.0 // indirect
3030
github.com/go-openapi/validate v0.25.2 // indirect
3131
github.com/go-viper/mapstructure/v2 v2.5.0 // indirect
3232
github.com/google/uuid v1.6.0 // indirect
@@ -36,9 +36,9 @@ require (
3636
go.opentelemetry.io/otel/metric v1.43.0 // indirect
3737
go.opentelemetry.io/otel/trace v1.43.0 // indirect
3838
go.yaml.in/yaml/v3 v3.0.4 // indirect
39-
golang.org/x/net v0.53.0 // indirect
39+
golang.org/x/net v0.54.0 // indirect
4040
golang.org/x/sync v0.20.0 // indirect
41-
golang.org/x/text v0.36.0 // indirect
41+
golang.org/x/text v0.37.0 // indirect
4242
)
4343

4444
replace (

client-middleware/opentracing/go.sum

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ github.com/go-openapi/analysis v0.25.0 h1:EnjAq1yO8wEO9HbPmY8vLPEIkdZuuFhCAKBPvC
1212
github.com/go-openapi/analysis v0.25.0/go.mod h1:5WFTRE43WLkPG9r9OtlMfqkkvUTYLVVCIxLlEpyF8kE=
1313
github.com/go-openapi/errors v0.22.7 h1:JLFBGC0Apwdzw3484MmBqspjPbwa2SHvpDm0u5aGhUA=
1414
github.com/go-openapi/errors v0.22.7/go.mod h1://QW6SD9OsWtH6gHllUCddOXDL0tk0ZGNYHwsw4sW3w=
15-
github.com/go-openapi/jsonpointer v0.22.5 h1:8on/0Yp4uTb9f4XvTrM2+1CPrV05QPZXu+rvu2o9jcA=
16-
github.com/go-openapi/jsonpointer v0.22.5/go.mod h1:gyUR3sCvGSWchA2sUBJGluYMbe1zazrYWIkWPjjMUY0=
15+
github.com/go-openapi/jsonpointer v0.23.1 h1:1HBACs7XIwR2RcmItfdSFlALhGbe6S92p0ry4d1GWg4=
16+
github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfNBngqRT2UG3BxSqY=
1717
github.com/go-openapi/jsonreference v0.21.5 h1:6uCGVXU/aNF13AQNggxfysJ+5ZcU4nEAe+pJyVWRdiE=
1818
github.com/go-openapi/jsonreference v0.21.5/go.mod h1:u25Bw85sX4E2jzFodh1FOKMTZLcfifd1Q+iKKOUxExw=
1919
github.com/go-openapi/loads v0.23.3 h1:g5Xap1JfwKkUnZdn+S0L3SzBDpcTIYzZ5Qaag0YDkKQ=
@@ -26,22 +26,22 @@ github.com/go-openapi/swag/conv v0.26.0 h1:5yGGsPYI1ZCva93U0AoKi/iZrNhaJEjr324YV
2626
github.com/go-openapi/swag/conv v0.26.0/go.mod h1:tpAmIL7X58VPnHHiSO4uE3jBeRamGsFsfdDeDtb5ECE=
2727
github.com/go-openapi/swag/fileutils v0.26.0 h1:WJoPRvsA7QRiiWluowkLJa9jaYR7FCuxmDvnCgaRRxU=
2828
github.com/go-openapi/swag/fileutils v0.26.0/go.mod h1:0WDJ7lp67eNjPMO50wAWYlKvhOb6CQ37rzR7wrgI8Tc=
29-
github.com/go-openapi/swag/jsonname v0.25.5 h1:8p150i44rv/Drip4vWI3kGi9+4W9TdI3US3uUYSFhSo=
30-
github.com/go-openapi/swag/jsonname v0.25.5/go.mod h1:jNqqikyiAK56uS7n8sLkdaNY/uq6+D2m2LANat09pKU=
29+
github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w=
30+
github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M=
3131
github.com/go-openapi/swag/jsonutils v0.26.0 h1:FawFML2iAXsPqmERscuMPIHmFsoP1tOqWkxBaKNMsnA=
3232
github.com/go-openapi/swag/jsonutils v0.26.0/go.mod h1:2VmA0CJlyFqgawOaPI9psnjFDqzyivIqLYN34t9p91E=
3333
github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0 h1:apqeINu/ICHouqiRZbyFvuDge5jCmmLTqGQ9V95EaOM=
3434
github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0/go.mod h1:AyM6QT8uz5IdKxk5akv0y6u4QvcL9GWERt0Jx/F/R8Y=
35-
github.com/go-openapi/swag/loading v0.25.5 h1:odQ/umlIZ1ZVRteI6ckSrvP6e2w9UTF5qgNdemJHjuU=
36-
github.com/go-openapi/swag/loading v0.25.5/go.mod h1:I8A8RaaQ4DApxhPSWLNYWh9NvmX2YKMoB9nwvv6oW6g=
37-
github.com/go-openapi/swag/mangling v0.25.5 h1:hyrnvbQRS7vKePQPHHDso+k6CGn5ZBs5232UqWZmJZw=
38-
github.com/go-openapi/swag/mangling v0.25.5/go.mod h1:6hadXM/o312N/h98RwByLg088U61TPGiltQn71Iw0NY=
35+
github.com/go-openapi/swag/loading v0.26.0 h1:Apg6zaKhCJurpJer0DCxq99qwmhFddBhaMX7kilDcko=
36+
github.com/go-openapi/swag/loading v0.26.0/go.mod h1:dBxQ/6V2uBaAQdevN18VELE6xSpJWZxLX4txe12JwDg=
37+
github.com/go-openapi/swag/mangling v0.26.0 h1:Du2YC4YLA/Y5m/YKQd7AnY5qq0wRKSFZTTt8ktFaXcQ=
38+
github.com/go-openapi/swag/mangling v0.26.0/go.mod h1:jifS7W9vbg+pw63bT+GI53otluMQL3CeemuyCHKwVx0=
3939
github.com/go-openapi/swag/stringutils v0.26.0 h1:qZQngLxs5s7SLijc3N2ZO+fUq2o8LjuWAASSrJuh+xg=
4040
github.com/go-openapi/swag/stringutils v0.26.0/go.mod h1:sWn5uY+QIIspwPhvgnqJsH8xqFT2ZbYcvbcFanRyhFE=
4141
github.com/go-openapi/swag/typeutils v0.26.0 h1:2kdEwdiNWy+JJdOvu5MA2IIg2SylWAFuuyQIKYybfq4=
4242
github.com/go-openapi/swag/typeutils v0.26.0/go.mod h1:oovDuIUvTrEHVMqWilQzKzV4YlSKgyZmFh7AlfABNVE=
43-
github.com/go-openapi/swag/yamlutils v0.25.5 h1:kASCIS+oIeoc55j28T4o8KwlV2S4ZLPT6G0iq2SSbVQ=
44-
github.com/go-openapi/swag/yamlutils v0.25.5/go.mod h1:Gek1/SjjfbYvM+Iq4QGwa/2lEXde9n2j4a3wI3pNuOQ=
43+
github.com/go-openapi/swag/yamlutils v0.26.0 h1:H7O8l/8NJJQ/oiReEN+oMpnGMyt8G0hl460nRZxhLMQ=
44+
github.com/go-openapi/swag/yamlutils v0.26.0/go.mod h1:1evKEGAtP37Pkwcc7EWMF0hedX0/x3Rkvei2wtG/TbU=
4545
github.com/go-openapi/testify/enable/yaml/v2 v2.5.0 h1:3hZD1fwydvCx/cc1R2uYNQirHqf2s6lqpKV3FcNTURA=
4646
github.com/go-openapi/testify/enable/yaml/v2 v2.5.0/go.mod h1:TvDZKBH7ZbMaF3EqH2AwTvNQCmzyZq8K1agRjf1B+Nk=
4747
github.com/go-openapi/testify/v2 v2.5.0 h1:UOCr63aAsMIDydZbZGqo5Ev01D4eydItRbekDuZMJLw=
@@ -83,14 +83,14 @@ go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09
8383
go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=
8484
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
8585
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
86-
golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
87-
golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
86+
golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w=
87+
golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ=
8888
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
8989
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
90-
golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
91-
golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
92-
golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
93-
golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
90+
golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
91+
golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
92+
golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
93+
golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
9494
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
9595
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
9696
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=

docs/doc-site/_index.md

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
---
2+
title: "go-openapi runtime"
3+
type: home
4+
description: HTTP runtime for OpenAPI clients and servers in Go.
5+
weight: 1
6+
---
7+
8+
`github.com/go-openapi/runtime` is a runtime library used to work with OpenAPI.
9+
10+
At this moment, it only supports OpenAPI v2 (aka Swagger).
11+
12+
It is used by clients and servers generated with [go-swagger][go-swagger].
13+
or directly by applications that build untyped OpenAPI / Swagger clients or servers.
14+
15+
It ships:
16+
17+
* a configurable HTTP **client transport** (`client.Runtime`) — TLS, proxy,
18+
timeouts, OpenTelemetry tracing, pluggable authentication
19+
* a **server middleware pipeline** that turns an analyzed OpenAPI spec into a
20+
working `http.Handler` — routing, security, parameter binding, validation
21+
and operation execution
22+
* a **dependency-free server-middleware module** with media-type processing, content
23+
negotiation and doc-UI helpers, usable from any plain `net/http` server
24+
25+
### Status
26+
27+
{{% button href="https://github.com/go-openapi/runtime/fork" hint="fork me on github" style=primary icon=code-fork %}}Fork me{{% /button %}}
28+
Stable API. Actively maintained.
29+
30+
<!-- See our [ROADMAP](./project/maintainers/ROADMAP.md). -->
31+
32+
### Getting started
33+
34+
```cmd
35+
go get github.com/go-openapi/runtime
36+
```
37+
38+
Using only the dependency-free middleware (media types, negotiation, doc UIs):
39+
40+
```cmd
41+
go get github.com/go-openapi/runtime/server-middleware
42+
```
43+
44+
### Where to go next
45+
46+
{{< cards >}}
47+
{{% card title="Features" %}}
48+
Features supported by our client and server, with normative references.
49+
[usage/features](./usage/features/)
50+
{{% /card %}}
51+
{{% card title="Core" %}}
52+
The five interfaces (`Consumer`, `Producer`, `Authenticator`, `Authorizer`,
53+
`OperationHandler`) every other piece is built on, plus content-type and
54+
validation plumbing.
55+
56+
[usage/core](./usage/core/)
57+
{{% /card %}}
58+
59+
{{% card title="Client" %}}
60+
Configuring `client.Runtime` for TLS, auth, OpenTelemetry tracing and
61+
context-aware request submission.
62+
63+
[usage/client](./usage/client/)
64+
{{% /card %}}
65+
66+
{{% card title="Server" %}}
67+
The Router → Binder → Validator → Security → OperationExecutor → Responder
68+
pipeline that turns a spec into a handler.
69+
70+
[usage/server](./usage/server/)
71+
{{% /card %}}
72+
73+
{{% card title="Standalone" %}}
74+
Use the media-type, content-negotiation and doc-UI helpers from any plain
75+
`net/http` server, with no transitive OpenAPI dependencies.
76+
77+
[usage/standalone](./usage/standalone/)
78+
{{% /card %}}
79+
{{< /cards >}}
80+
81+
Looking for runnable code? See [examples](./usage/examples/).
82+
83+
## Licensing
84+
85+
`SPDX-FileCopyrightText: Copyright 2025 go-swagger maintainers`
86+
87+
This library ships under the [Apache-2.0 license](./project/LICENSE.md).
88+
89+
## Contributing
90+
91+
Issues and pull requests welcome.
92+
93+
See the shared [go-openapi contributing guidelines][contributing-doc-site] and
94+
the per-repo notes in [project/](./project/).
95+
96+
---
97+
98+
{{< children type="card" description="true" >}}
99+
100+
[go-swagger]: https://github.com/go-swagger/go-swagger
101+
[contributing-doc-site]: https://go-openapi.github.io/doc-site/contributing/contributing/index.html
102+
[maintainers-doc-site]: https://go-openapi.github.io/doc-site/maintainers/index.html

0 commit comments

Comments
 (0)