diff --git a/crates/aide/src/axum/outputs.rs b/crates/aide/src/axum/outputs.rs index 975457d..ab7742f 100644 --- a/crates/aide/src/axum/outputs.rs +++ b/crates/aide/src/axum/outputs.rs @@ -1,9 +1,12 @@ -use crate::openapi::{MediaType, Operation, Response, SchemaObject}; +use crate::{ + openapi::{MediaType, Operation, Response, SchemaObject}, + util::no_content_response, +}; #[cfg(feature = "axum-form")] use axum::extract::rejection::FormRejection; #[cfg(feature = "axum-json")] use axum::extract::rejection::JsonRejection; -use axum::response::{Html, Redirect}; +use axum::response::{Html, NoContent, Redirect}; #[cfg(any(feature = "axum-json", feature = "axum-form"))] use http::StatusCode; use indexmap::IndexMap; @@ -13,6 +16,21 @@ use schemars::JsonSchema; use crate::{generate::GenContext, operation::OperationOutput}; +impl OperationOutput for NoContent { + type Inner = (); + + fn operation_response(_ctx: &mut GenContext, _operation: &mut Operation) -> Option { + Some(no_content_response()) + } + + fn inferred_responses( + _ctx: &mut GenContext, + _operation: &mut Operation, + ) -> Vec<(Option, Response)> { + vec![(Some(204), no_content_response())] + } +} + #[cfg(feature = "axum-json")] impl OperationOutput for axum::Json where diff --git a/crates/aide/src/impls/mod.rs b/crates/aide/src/impls/mod.rs index 1a591b6..10952d4 100644 --- a/crates/aide/src/impls/mod.rs +++ b/crates/aide/src/impls/mod.rs @@ -3,6 +3,7 @@ use std::{borrow::Cow, convert::Infallible, rc::Rc, sync::Arc}; use crate::{ openapi::{MediaType, Operation, RequestBody, Response}, operation::set_body, + util::no_content_response, OperationInput, }; use indexmap::IndexMap; @@ -290,10 +291,7 @@ impl OperationOutput for () { _ctx: &mut crate::generate::GenContext, _operation: &mut Operation, ) -> Option { - Some(Response { - description: "no content".to_string(), - ..Default::default() - }) + Some(no_content_response()) } fn inferred_responses( diff --git a/crates/aide/src/util.rs b/crates/aide/src/util.rs index 13c6790..5648fb7 100644 --- a/crates/aide/src/util.rs +++ b/crates/aide/src/util.rs @@ -3,7 +3,7 @@ use crate::{ generate::GenContext, - openapi::{Operation, PathItem}, + openapi::{Operation, PathItem, Response}, Error, }; @@ -135,6 +135,13 @@ pub(crate) fn merge_paths(ctx: &mut GenContext, path: &str, target: &mut PathIte target.extensions.extend(from.extensions); } +pub(crate) fn no_content_response() -> Response { + Response { + description: "no content".to_string(), + ..Default::default() + } +} + // FIXME: remove the code below when the upstream openapiv3 3.1 is available. pub(crate) use spec::*; mod spec {