//! Types and traits for generating responses. //! //! See [`axum::response`] for more details. //! //! [`axum::response`]: https://docs.rs/axum/latest/axum/response/index.html use crate::body::BoxBody; mod append_headers; mod into_response; mod into_response_parts; pub use self::{ append_headers::AppendHeaders, into_response::IntoResponse, into_response_parts::{IntoResponseParts, ResponseParts, TryIntoHeaderError}, }; /// Type alias for [`http::Response`] whose body type defaults to [`BoxBody`], the most common body /// type used with axum. pub type Response = http::Response; /// An [`IntoResponse`]-based result type that uses [`ErrorResponse`] as the error type. /// /// All types which implement [`IntoResponse`] can be converted to an [`ErrorResponse`]. This makes /// it useful as a general purpose error type for functions which combine multiple distinct error /// types that all implement [`IntoResponse`]. /// /// # Example /// /// ``` /// use axum::{ /// response::{IntoResponse, Response}, /// http::StatusCode, /// }; /// /// // two fallible functions with different error types /// fn try_something() -> Result<(), ErrorA> { /// // ... /// # unimplemented!() /// } /// /// fn try_something_else() -> Result<(), ErrorB> { /// // ... /// # unimplemented!() /// } /// /// // each error type implements `IntoResponse` /// struct ErrorA; /// /// impl IntoResponse for ErrorA { /// fn into_response(self) -> Response { /// // ... /// # unimplemented!() /// } /// } /// /// enum ErrorB { /// SomethingWentWrong, /// } /// /// impl IntoResponse for ErrorB { /// fn into_response(self) -> Response { /// // ... /// # unimplemented!() /// } /// } /// /// // we can combine them using `axum::response::Result` and still use `?` /// async fn handler() -> axum::response::Result<&'static str> { /// // the errors are automatically converted to `ErrorResponse` /// try_something()?; /// try_something_else()?; /// /// Ok("it worked!") /// } /// ``` /// /// # As a replacement for `std::result::Result` /// /// Since `axum::response::Result` has a default error type you only have to specify the `Ok` type: /// /// ``` /// use axum::{ /// response::{IntoResponse, Response, Result}, /// http::StatusCode, /// }; /// /// // `Result` automatically uses `ErrorResponse` as the error type. /// async fn handler() -> Result<&'static str> { /// try_something()?; /// /// Ok("it worked!") /// } /// /// // You can still specify the error even if you've imported `axum::response::Result` /// fn try_something() -> Result<(), StatusCode> { /// // ... /// # unimplemented!() /// } /// ``` pub type Result = std::result::Result; impl IntoResponse for Result where T: IntoResponse, { fn into_response(self) -> Response { match self { Ok(ok) => ok.into_response(), Err(err) => err.0, } } } /// An [`IntoResponse`]-based error type /// /// See [`Result`] for more details. #[derive(Debug)] pub struct ErrorResponse(Response); impl From for ErrorResponse where T: IntoResponse, { fn from(value: T) -> Self { Self(value.into_response()) } }