Repository files navigation

oapi-codegen-rust

Generate idiomatic Rust APIs and clients from OpenAPI 3 specifications, inspired by oapi-codegen.

Quickstart

cargo install oapi-codegen

From this repository's root (e.g., after cloning), try the included bookstore example:

$ oapi-codegen --config-file examples/bookstore/oapi-codegen-server.yaml examples/bookstore/openapi.yaml✓ wrote generated/restapi.rs and 15 modules beside it note: add the crates the generated code references to Cargo.toml: serde = { version = "1.0.229", features = ["derive"] } serde_json = "1.0.151" http = "1.5.0" axum = { version = "0.8.9", features = ["multipart"] } axum-extra = { version = "0.12.6", features = ["query"] } # or: cargo add serde@1.0.229 --features derive cargo add serde_json@1.0.151 cargo add http@1.5.0 cargo add axum@0.8.9 --features multipart cargo add axum-extra@0.12.6 --features query

See docs/ for installation, configuration, and extensions.

Justification

This project aims to fill a gap that does not seem to have an established solution in the Rust ecosystem: Generating API servers and client boilerplate directly from OpenAPI specifications.

The project takes inspiration from oapi-codegen and aims to provide a similar experience for Rust developers. Since Rust has substantial differences from Go, some key design decisions differ:

Design differences

  • axum only — no multi-framework generation.
  • One server mode: a typed trait Api (comparable to Go's strict server) — no unstructured handler variant.
  • Typed status-code response enums instead of response structs.
  • Token-based generation (quote/syn), not user-overridable text/template.
  • Blocking reqwest client — no async runtime forced on consumers.
  • Reuses your oapi-codegen YAML config — unknown keys are ignored.
  • Explicit over implicit: --config-file is required, and an output path must be given via --output-file or the config's output: key; empty generation fails loudly (Go defaults these and prints to stdout).
  • Fails fast where Go assumes: where oapi-codegen silently defaults, guesses, or ignores an ambiguity, this generator stops with a guided error and lets a person decide. For example, two schemas that produce one Rust type name are an error, and Go writes MyWidget2 instead. A <Op>Response enum that clashes with a same-named schema, and a path parameter that does not match the path template, are errors for the same reason. The generator surfaces the decision and does not bake in an assumption.
  • x-rust-* vendor extensions; x-go-* keys ignored.

See design decisions vs. Go for the rationale.

Otherwise, the project strives to be a faithful drop-in from the Go-based version in as idiomatic Rust as possible, with similar command-line interface and configuration options.

OpenAPI Version Support 1

Adding full support to all OpenAPI versions is not trivial, and is done in iterations which all require various design decisions to support.

VersionStatusNotes
v3.0.0SupportedSupported in v1.0.0.
v3.1.0PlannedTracking here.
v3.2.0PlannedTracking here.

Documentation

Note

These documents are primarily written by LLMs and are not intended for human reading. This project aims to be self-explanatory through a sharp focus on TUI UX and guided error messaging. The documentation exists to help guide LLM context where needed. They have been checked and verified by humans, and can be read if interested.

Footnotes

  1. This table and the tracking issues are maintained automatically by the OpenAPI version check workflow, which probes the upstream spec releases against .github/openapi-versions.json.

About

CLI tool to generate Rust server boilerplate from OpenAPI 3 specifications.

Topics

Resources

Contributing

Security policy

Stars

4 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

oapi-codegen-rust

Generate idiomatic Rust APIs and clients from OpenAPI 3 specifications, inspired by oapi-codegen.

Quickstart

cargo install oapi-codegen

From this repository's root (e.g., after cloning), try the included bookstore example:

$ oapi-codegen --config-file examples/bookstore/oapi-codegen-server.yaml examples/bookstore/openapi.yaml✓ wrote generated/restapi.rs and 15 modules beside it note: add the crates the generated code references to Cargo.toml: serde = { version = "1.0.229", features = ["derive"] } serde_json = "1.0.151" http = "1.5.0" axum = { version = "0.8.9", features = ["multipart"] } axum-extra = { version = "0.12.6", features = ["query"] } # or: cargo add serde@1.0.229 --features derive cargo add serde_json@1.0.151 cargo add http@1.5.0 cargo add axum@0.8.9 --features multipart cargo add axum-extra@0.12.6 --features query

See docs/ for installation, configuration, and extensions.

Justification

This project aims to fill a gap that does not seem to have an established solution in the Rust ecosystem: Generating API servers and client boilerplate directly from OpenAPI specifications.

The project takes inspiration from oapi-codegen and aims to provide a similar experience for Rust developers. Since Rust has substantial differences from Go, some key design decisions differ:

Design differences

  • axum only — no multi-framework generation.
  • One server mode: a typed trait Api (comparable to Go's strict server) — no unstructured handler variant.
  • Typed status-code response enums instead of response structs.
  • Token-based generation (quote/syn), not user-overridable text/template.
  • Blocking reqwest client — no async runtime forced on consumers.
  • Reuses your oapi-codegen YAML config — unknown keys are ignored.
  • Explicit over implicit: --config-file is required, and an output path must be given via --output-file or the config's output: key; empty generation fails loudly (Go defaults these and prints to stdout).
  • Fails fast where Go assumes: where oapi-codegen silently defaults, guesses, or ignores an ambiguity, this generator stops with a guided error and lets a person decide. For example, two schemas that produce one Rust type name are an error, and Go writes MyWidget2 instead. A <Op>Response enum that clashes with a same-named schema, and a path parameter that does not match the path template, are errors for the same reason. The generator surfaces the decision and does not bake in an assumption.
  • x-rust-* vendor extensions; x-go-* keys ignored.

See design decisions vs. Go for the rationale.

Otherwise, the project strives to be a faithful drop-in from the Go-based version in as idiomatic Rust as possible, with similar command-line interface and configuration options.

OpenAPI Version Support 1

Adding full support to all OpenAPI versions is not trivial, and is done in iterations which all require various design decisions to support.

VersionStatusNotes
v3.0.0SupportedSupported in v1.0.0.
v3.1.0PlannedTracking here.
v3.2.0PlannedTracking here.

Documentation

Note

These documents are primarily written by LLMs and are not intended for human reading. This project aims to be self-explanatory through a sharp focus on TUI UX and guided error messaging. The documentation exists to help guide LLM context where needed. They have been checked and verified by humans, and can be read if interested.

Footnotes

  1. This table and the tracking issues are maintained automatically by the OpenAPI version check workflow, which probes the upstream spec releases against .github/openapi-versions.json.

About

CLI tool to generate Rust server boilerplate from OpenAPI 3 specifications.

Topics

Resources

Contributing

Security policy

Stars

4 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

oapi-codegen-rust

Generate idiomatic Rust APIs and clients from OpenAPI 3 specifications, inspired by oapi-codegen.

Quickstart

cargo install oapi-codegen

From this repository's root (e.g., after cloning), try the included bookstore example:

$ oapi-codegen --config-file examples/bookstore/oapi-codegen-server.yaml examples/bookstore/openapi.yaml✓ wrote generated/restapi.rs and 15 modules beside it note: add the crates the generated code references to Cargo.toml: serde = { version = "1.0.229", features = ["derive"] } serde_json = "1.0.151" http = "1.5.0" axum = { version = "0.8.9", features = ["multipart"] } axum-extra = { version = "0.12.6", features = ["query"] } # or: cargo add serde@1.0.229 --features derive cargo add serde_json@1.0.151 cargo add http@1.5.0 cargo add axum@0.8.9 --features multipart cargo add axum-extra@0.12.6 --features query

See docs/ for installation, configuration, and extensions.

Justification

This project aims to fill a gap that does not seem to have an established solution in the Rust ecosystem: Generating API servers and client boilerplate directly from OpenAPI specifications.

The project takes inspiration from oapi-codegen and aims to provide a similar experience for Rust developers. Since Rust has substantial differences from Go, some key design decisions differ:

Design differences

  • axum only — no multi-framework generation.
  • One server mode: a typed trait Api (comparable to Go's strict server) — no unstructured handler variant.
  • Typed status-code response enums instead of response structs.
  • Token-based generation (quote/syn), not user-overridable text/template.
  • Blocking reqwest client — no async runtime forced on consumers.
  • Reuses your oapi-codegen YAML config — unknown keys are ignored.
  • Explicit over implicit: --config-file is required, and an output path must be given via --output-file or the config's output: key; empty generation fails loudly (Go defaults these and prints to stdout).
  • Fails fast where Go assumes: where oapi-codegen silently defaults, guesses, or ignores an ambiguity, this generator stops with a guided error and lets a person decide. For example, two schemas that produce one Rust type name are an error, and Go writes MyWidget2 instead. A <Op>Response enum that clashes with a same-named schema, and a path parameter that does not match the path template, are errors for the same reason. The generator surfaces the decision and does not bake in an assumption.
  • x-rust-* vendor extensions; x-go-* keys ignored.

See design decisions vs. Go for the rationale.

Otherwise, the project strives to be a faithful drop-in from the Go-based version in as idiomatic Rust as possible, with similar command-line interface and configuration options.

OpenAPI Version Support 1

Adding full support to all OpenAPI versions is not trivial, and is done in iterations which all require various design decisions to support.

VersionStatusNotes
v3.0.0SupportedSupported in v1.0.0.
v3.1.0PlannedTracking here.
v3.2.0PlannedTracking here.

Documentation

Note

These documents are primarily written by LLMs and are not intended for human reading. This project aims to be self-explanatory through a sharp focus on TUI UX and guided error messaging. The documentation exists to help guide LLM context where needed. They have been checked and verified by humans, and can be read if interested.

Footnotes

  1. This table and the tracking issues are maintained automatically by the OpenAPI version check workflow, which probes the upstream spec releases against .github/openapi-versions.json.

About

CLI tool to generate Rust server boilerplate from OpenAPI 3 specifications.

Topics

Resources

Contributing

Security policy

Stars

4 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

oapi-codegen-rust

Generate idiomatic Rust APIs and clients from OpenAPI 3 specifications, inspired by oapi-codegen.

Quickstart

cargo install oapi-codegen

From this repository's root (e.g., after cloning), try the included bookstore example:

$ oapi-codegen --config-file examples/bookstore/oapi-codegen-server.yaml examples/bookstore/openapi.yaml✓ wrote generated/restapi.rs and 15 modules beside it note: add the crates the generated code references to Cargo.toml: serde = { version = "1.0.229", features = ["derive"] } serde_json = "1.0.151" http = "1.5.0" axum = { version = "0.8.9", features = ["multipart"] } axum-extra = { version = "0.12.6", features = ["query"] } # or: cargo add serde@1.0.229 --features derive cargo add serde_json@1.0.151 cargo add http@1.5.0 cargo add axum@0.8.9 --features multipart cargo add axum-extra@0.12.6 --features query

See docs/ for installation, configuration, and extensions.

Justification

This project aims to fill a gap that does not seem to have an established solution in the Rust ecosystem: Generating API servers and client boilerplate directly from OpenAPI specifications.

The project takes inspiration from oapi-codegen and aims to provide a similar experience for Rust developers. Since Rust has substantial differences from Go, some key design decisions differ:

Design differences

  • axum only — no multi-framework generation.
  • One server mode: a typed trait Api (comparable to Go's strict server) — no unstructured handler variant.
  • Typed status-code response enums instead of response structs.
  • Token-based generation (quote/syn), not user-overridable text/template.
  • Blocking reqwest client — no async runtime forced on consumers.
  • Reuses your oapi-codegen YAML config — unknown keys are ignored.
  • Explicit over implicit: --config-file is required, and an output path must be given via --output-file or the config's output: key; empty generation fails loudly (Go defaults these and prints to stdout).
  • Fails fast where Go assumes: where oapi-codegen silently defaults, guesses, or ignores an ambiguity, this generator stops with a guided error and lets a person decide. For example, two schemas that produce one Rust type name are an error, and Go writes MyWidget2 instead. A <Op>Response enum that clashes with a same-named schema, and a path parameter that does not match the path template, are errors for the same reason. The generator surfaces the decision and does not bake in an assumption.
  • x-rust-* vendor extensions; x-go-* keys ignored.

See design decisions vs. Go for the rationale.

Otherwise, the project strives to be a faithful drop-in from the Go-based version in as idiomatic Rust as possible, with similar command-line interface and configuration options.

OpenAPI Version Support 1

Adding full support to all OpenAPI versions is not trivial, and is done in iterations which all require various design decisions to support.

VersionStatusNotes
v3.0.0SupportedSupported in v1.0.0.
v3.1.0PlannedTracking here.
v3.2.0PlannedTracking here.

Documentation

Note

These documents are primarily written by LLMs and are not intended for human reading. This project aims to be self-explanatory through a sharp focus on TUI UX and guided error messaging. The documentation exists to help guide LLM context where needed. They have been checked and verified by humans, and can be read if interested.

Footnotes

  1. This table and the tracking issues are maintained automatically by the OpenAPI version check workflow, which probes the upstream spec releases against .github/openapi-versions.json.

About

CLI tool to generate Rust server boilerplate from OpenAPI 3 specifications.

Topics

Resources

Contributing

Security policy

Stars

4 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

oapi-codegen-rust

Generate idiomatic Rust APIs and clients from OpenAPI 3 specifications, inspired by oapi-codegen.

Quickstart

cargo install oapi-codegen

From this repository's root (e.g., after cloning), try the included bookstore example:

$ oapi-codegen --config-file examples/bookstore/oapi-codegen-server.yaml examples/bookstore/openapi.yaml✓ wrote generated/restapi.rs and 15 modules beside it note: add the crates the generated code references to Cargo.toml: serde = { version = "1.0.229", features = ["derive"] } serde_json = "1.0.151" http = "1.5.0" axum = { version = "0.8.9", features = ["multipart"] } axum-extra = { version = "0.12.6", features = ["query"] } # or: cargo add serde@1.0.229 --features derive cargo add serde_json@1.0.151 cargo add http@1.5.0 cargo add axum@0.8.9 --features multipart cargo add axum-extra@0.12.6 --features query

See docs/ for installation, configuration, and extensions.

Justification

This project aims to fill a gap that does not seem to have an established solution in the Rust ecosystem: Generating API servers and client boilerplate directly from OpenAPI specifications.

The project takes inspiration from oapi-codegen and aims to provide a similar experience for Rust developers. Since Rust has substantial differences from Go, some key design decisions differ:

Design differences

  • axum only — no multi-framework generation.
  • One server mode: a typed trait Api (comparable to Go's strict server) — no unstructured handler variant.
  • Typed status-code response enums instead of response structs.
  • Token-based generation (quote/syn), not user-overridable text/template.
  • Blocking reqwest client — no async runtime forced on consumers.
  • Reuses your oapi-codegen YAML config — unknown keys are ignored.
  • Explicit over implicit: --config-file is required, and an output path must be given via --output-file or the config's output: key; empty generation fails loudly (Go defaults these and prints to stdout).
  • Fails fast where Go assumes: where oapi-codegen silently defaults, guesses, or ignores an ambiguity, this generator stops with a guided error and lets a person decide. For example, two schemas that produce one Rust type name are an error, and Go writes MyWidget2 instead. A <Op>Response enum that clashes with a same-named schema, and a path parameter that does not match the path template, are errors for the same reason. The generator surfaces the decision and does not bake in an assumption.
  • x-rust-* vendor extensions; x-go-* keys ignored.

See design decisions vs. Go for the rationale.

Otherwise, the project strives to be a faithful drop-in from the Go-based version in as idiomatic Rust as possible, with similar command-line interface and configuration options.

OpenAPI Version Support 1

Adding full support to all OpenAPI versions is not trivial, and is done in iterations which all require various design decisions to support.

VersionStatusNotes
v3.0.0SupportedSupported in v1.0.0.
v3.1.0PlannedTracking here.
v3.2.0PlannedTracking here.

Documentation

Note

These documents are primarily written by LLMs and are not intended for human reading. This project aims to be self-explanatory through a sharp focus on TUI UX and guided error messaging. The documentation exists to help guide LLM context where needed. They have been checked and verified by humans, and can be read if interested.

Footnotes

  1. This table and the tracking issues are maintained automatically by the OpenAPI version check workflow, which probes the upstream spec releases against .github/openapi-versions.json.

About

CLI tool to generate Rust server boilerplate from OpenAPI 3 specifications.

Topics

Resources

Contributing

Security policy

Stars

4 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

oapi-codegen-rust

Generate idiomatic Rust APIs and clients from OpenAPI 3 specifications, inspired by oapi-codegen.

Quickstart

cargo install oapi-codegen

From this repository's root (e.g., after cloning), try the included bookstore example:

$ oapi-codegen --config-file examples/bookstore/oapi-codegen-server.yaml examples/bookstore/openapi.yaml✓ wrote generated/restapi.rs and 15 modules beside it note: add the crates the generated code references to Cargo.toml: serde = { version = "1.0.229", features = ["derive"] } serde_json = "1.0.151" http = "1.5.0" axum = { version = "0.8.9", features = ["multipart"] } axum-extra = { version = "0.12.6", features = ["query"] } # or: cargo add serde@1.0.229 --features derive cargo add serde_json@1.0.151 cargo add http@1.5.0 cargo add axum@0.8.9 --features multipart cargo add axum-extra@0.12.6 --features query

See docs/ for installation, configuration, and extensions.

Justification

This project aims to fill a gap that does not seem to have an established solution in the Rust ecosystem: Generating API servers and client boilerplate directly from OpenAPI specifications.

The project takes inspiration from oapi-codegen and aims to provide a similar experience for Rust developers. Since Rust has substantial differences from Go, some key design decisions differ:

Design differences

  • axum only — no multi-framework generation.
  • One server mode: a typed trait Api (comparable to Go's strict server) — no unstructured handler variant.
  • Typed status-code response enums instead of response structs.
  • Token-based generation (quote/syn), not user-overridable text/template.
  • Blocking reqwest client — no async runtime forced on consumers.
  • Reuses your oapi-codegen YAML config — unknown keys are ignored.
  • Explicit over implicit: --config-file is required, and an output path must be given via --output-file or the config's output: key; empty generation fails loudly (Go defaults these and prints to stdout).
  • Fails fast where Go assumes: where oapi-codegen silently defaults, guesses, or ignores an ambiguity, this generator stops with a guided error and lets a person decide. For example, two schemas that produce one Rust type name are an error, and Go writes MyWidget2 instead. A <Op>Response enum that clashes with a same-named schema, and a path parameter that does not match the path template, are errors for the same reason. The generator surfaces the decision and does not bake in an assumption.
  • x-rust-* vendor extensions; x-go-* keys ignored.

See design decisions vs. Go for the rationale.

Otherwise, the project strives to be a faithful drop-in from the Go-based version in as idiomatic Rust as possible, with similar command-line interface and configuration options.

OpenAPI Version Support 1

Adding full support to all OpenAPI versions is not trivial, and is done in iterations which all require various design decisions to support.

VersionStatusNotes
v3.0.0SupportedSupported in v1.0.0.
v3.1.0PlannedTracking here.
v3.2.0PlannedTracking here.

Documentation

Note

These documents are primarily written by LLMs and are not intended for human reading. This project aims to be self-explanatory through a sharp focus on TUI UX and guided error messaging. The documentation exists to help guide LLM context where needed. They have been checked and verified by humans, and can be read if interested.

Footnotes

  1. This table and the tracking issues are maintained automatically by the OpenAPI version check workflow, which probes the upstream spec releases against .github/openapi-versions.json.

About

CLI tool to generate Rust server boilerplate from OpenAPI 3 specifications.

Topics

Resources

Contributing

Security policy

Stars

4 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

oapi-codegen-rust

Generate idiomatic Rust APIs and clients from OpenAPI 3 specifications, inspired by oapi-codegen.

Quickstart

cargo install oapi-codegen

From this repository's root (e.g., after cloning), try the included bookstore example:

$ oapi-codegen --config-file examples/bookstore/oapi-codegen-server.yaml examples/bookstore/openapi.yaml✓ wrote generated/restapi.rs and 15 modules beside it note: add the crates the generated code references to Cargo.toml: serde = { version = "1.0.229", features = ["derive"] } serde_json = "1.0.151" http = "1.5.0" axum = { version = "0.8.9", features = ["multipart"] } axum-extra = { version = "0.12.6", features = ["query"] } # or: cargo add serde@1.0.229 --features derive cargo add serde_json@1.0.151 cargo add http@1.5.0 cargo add axum@0.8.9 --features multipart cargo add axum-extra@0.12.6 --features query

See docs/ for installation, configuration, and extensions.

Justification

This project aims to fill a gap that does not seem to have an established solution in the Rust ecosystem: Generating API servers and client boilerplate directly from OpenAPI specifications.

The project takes inspiration from oapi-codegen and aims to provide a similar experience for Rust developers. Since Rust has substantial differences from Go, some key design decisions differ:

Design differences

  • axum only — no multi-framework generation.
  • One server mode: a typed trait Api (comparable to Go's strict server) — no unstructured handler variant.
  • Typed status-code response enums instead of response structs.
  • Token-based generation (quote/syn), not user-overridable text/template.
  • Blocking reqwest client — no async runtime forced on consumers.
  • Reuses your oapi-codegen YAML config — unknown keys are ignored.
  • Explicit over implicit: --config-file is required, and an output path must be given via --output-file or the config's output: key; empty generation fails loudly (Go defaults these and prints to stdout).
  • Fails fast where Go assumes: where oapi-codegen silently defaults, guesses, or ignores an ambiguity, this generator stops with a guided error and lets a person decide. For example, two schemas that produce one Rust type name are an error, and Go writes MyWidget2 instead. A <Op>Response enum that clashes with a same-named schema, and a path parameter that does not match the path template, are errors for the same reason. The generator surfaces the decision and does not bake in an assumption.
  • x-rust-* vendor extensions; x-go-* keys ignored.

See design decisions vs. Go for the rationale.

Otherwise, the project strives to be a faithful drop-in from the Go-based version in as idiomatic Rust as possible, with similar command-line interface and configuration options.

OpenAPI Version Support 1

Adding full support to all OpenAPI versions is not trivial, and is done in iterations which all require various design decisions to support.

VersionStatusNotes
v3.0.0SupportedSupported in v1.0.0.
v3.1.0PlannedTracking here.
v3.2.0PlannedTracking here.

Documentation

Note

These documents are primarily written by LLMs and are not intended for human reading. This project aims to be self-explanatory through a sharp focus on TUI UX and guided error messaging. The documentation exists to help guide LLM context where needed. They have been checked and verified by humans, and can be read if interested.

Footnotes

  1. This table and the tracking issues are maintained automatically by the OpenAPI version check workflow, which probes the upstream spec releases against .github/openapi-versions.json.

About

CLI tool to generate Rust server boilerplate from OpenAPI 3 specifications.

Topics

Resources

Contributing

Security policy

Stars

4 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

oapi-codegen-rust

Generate idiomatic Rust APIs and clients from OpenAPI 3 specifications, inspired by oapi-codegen.

Quickstart

cargo install oapi-codegen

From this repository's root (e.g., after cloning), try the included bookstore example:

$ oapi-codegen --config-file examples/bookstore/oapi-codegen-server.yaml examples/bookstore/openapi.yaml✓ wrote generated/restapi.rs and 15 modules beside it note: add the crates the generated code references to Cargo.toml: serde = { version = "1.0.229", features = ["derive"] } serde_json = "1.0.151" http = "1.5.0" axum = { version = "0.8.9", features = ["multipart"] } axum-extra = { version = "0.12.6", features = ["query"] } # or: cargo add serde@1.0.229 --features derive cargo add serde_json@1.0.151 cargo add http@1.5.0 cargo add axum@0.8.9 --features multipart cargo add axum-extra@0.12.6 --features query

See docs/ for installation, configuration, and extensions.

Justification

This project aims to fill a gap that does not seem to have an established solution in the Rust ecosystem: Generating API servers and client boilerplate directly from OpenAPI specifications.

The project takes inspiration from oapi-codegen and aims to provide a similar experience for Rust developers. Since Rust has substantial differences from Go, some key design decisions differ:

Design differences

  • axum only — no multi-framework generation.
  • One server mode: a typed trait Api (comparable to Go's strict server) — no unstructured handler variant.
  • Typed status-code response enums instead of response structs.
  • Token-based generation (quote/syn), not user-overridable text/template.
  • Blocking reqwest client — no async runtime forced on consumers.
  • Reuses your oapi-codegen YAML config — unknown keys are ignored.
  • Explicit over implicit: --config-file is required, and an output path must be given via --output-file or the config's output: key; empty generation fails loudly (Go defaults these and prints to stdout).
  • Fails fast where Go assumes: where oapi-codegen silently defaults, guesses, or ignores an ambiguity, this generator stops with a guided error and lets a person decide. For example, two schemas that produce one Rust type name are an error, and Go writes MyWidget2 instead. A <Op>Response enum that clashes with a same-named schema, and a path parameter that does not match the path template, are errors for the same reason. The generator surfaces the decision and does not bake in an assumption.
  • x-rust-* vendor extensions; x-go-* keys ignored.

See design decisions vs. Go for the rationale.

Otherwise, the project strives to be a faithful drop-in from the Go-based version in as idiomatic Rust as possible, with similar command-line interface and configuration options.

OpenAPI Version Support 1

Adding full support to all OpenAPI versions is not trivial, and is done in iterations which all require various design decisions to support.

VersionStatusNotes
v3.0.0SupportedSupported in v1.0.0.
v3.1.0PlannedTracking here.
v3.2.0PlannedTracking here.

Documentation

Note

These documents are primarily written by LLMs and are not intended for human reading. This project aims to be self-explanatory through a sharp focus on TUI UX and guided error messaging. The documentation exists to help guide LLM context where needed. They have been checked and verified by humans, and can be read if interested.

Footnotes

  1. This table and the tracking issues are maintained automatically by the OpenAPI version check workflow, which probes the upstream spec releases against .github/openapi-versions.json.

About

CLI tool to generate Rust server boilerplate from OpenAPI 3 specifications.

Topics

Resources

Contributing

Security policy

Stars

4 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages