1//! Rejection response types.
23use axum_core::__composite_rejection as composite_rejection;
4use axum_core::__define_rejection as define_rejection;
56pub use crate::extract::path::{FailedToDeserializePathParams, InvalidUtf8InPathParam};
7pub use axum_core::extract::rejection::*;
89#[cfg(feature = "json")]
10define_rejection! {
11#[status = UNPROCESSABLE_ENTITY]
12 #[body = "Failed to deserialize the JSON body into the target type"]
13 #[cfg_attr(docsrs, doc(cfg(feature = "json")))]
14/// Rejection type for [`Json`](super::Json).
15 ///
16 /// This rejection is used if the request body is syntactically valid JSON but couldn't be
17 /// deserialized into the target type.
18pub struct JsonDataError(Error);
19}
2021#[cfg(feature = "json")]
22define_rejection! {
23#[status = BAD_REQUEST]
24 #[body = "Failed to parse the request body as JSON"]
25 #[cfg_attr(docsrs, doc(cfg(feature = "json")))]
26/// Rejection type for [`Json`](super::Json).
27 ///
28 /// This rejection is used if the request body didn't contain syntactically valid JSON.
29pub struct JsonSyntaxError(Error);
30}
3132#[cfg(feature = "json")]
33define_rejection! {
34#[status = UNSUPPORTED_MEDIA_TYPE]
35 #[body = "Expected request with `Content-Type: application/json`"]
36 #[cfg_attr(docsrs, doc(cfg(feature = "json")))]
37/// Rejection type for [`Json`](super::Json) used if the `Content-Type`
38 /// header is missing.
39pub struct MissingJsonContentType;
40}
4142define_rejection! {
43#[status = INTERNAL_SERVER_ERROR]
44 #[body = "Missing request extension"]
45/// Rejection type for [`Extension`](super::Extension) if an expected
46 /// request extension was not found.
47pub struct MissingExtension(Error);
48}
4950define_rejection! {
51#[status = INTERNAL_SERVER_ERROR]
52 #[body = "No paths parameters found for matched route"]
53/// Rejection type used if axum's internal representation of path parameters
54 /// is missing. This is commonly caused by extracting `Request<_>`. `Path`
55 /// must be extracted first.
56pub struct MissingPathParams;
57}
5859define_rejection! {
60#[status = UNSUPPORTED_MEDIA_TYPE]
61 #[body = "Form requests must have `Content-Type: application/x-www-form-urlencoded`"]
62/// Rejection type for [`Form`](super::Form) or [`RawForm`](super::RawForm)
63 /// used if the `Content-Type` header is missing
64 /// or its value is not `application/x-www-form-urlencoded`.
65pub struct InvalidFormContentType;
66}
6768define_rejection! {
69#[status = BAD_REQUEST]
70 #[body = "No host found in request"]
71/// Rejection type used if the [`Host`](super::Host) extractor is unable to
72 /// resolve a host.
73pub struct FailedToResolveHost;
74}
7576define_rejection! {
77#[status = BAD_REQUEST]
78 #[body = "Failed to deserialize form"]
79/// Rejection type used if the [`Form`](super::Form) extractor is unable to
80 /// deserialize the form into the target type.
81pub struct FailedToDeserializeForm(Error);
82}
8384define_rejection! {
85#[status = UNPROCESSABLE_ENTITY]
86 #[body = "Failed to deserialize form body"]
87/// Rejection type used if the [`Form`](super::Form) extractor is unable to
88 /// deserialize the form body into the target type.
89pub struct FailedToDeserializeFormBody(Error);
90}
9192define_rejection! {
93#[status = BAD_REQUEST]
94 #[body = "Failed to deserialize query string"]
95/// Rejection type used if the [`Query`](super::Query) extractor is unable to
96 /// deserialize the query string into the target type.
97pub struct FailedToDeserializeQueryString(Error);
98}
99100composite_rejection! {
101/// Rejection used for [`Query`](super::Query).
102 ///
103 /// Contains one variant for each way the [`Query`](super::Query) extractor
104 /// can fail.
105pub enum QueryRejection {
106 FailedToDeserializeQueryString,
107 }
108}
109110composite_rejection! {
111/// Rejection used for [`Form`](super::Form).
112 ///
113 /// Contains one variant for each way the [`Form`](super::Form) extractor
114 /// can fail.
115pub enum FormRejection {
116 InvalidFormContentType,
117 FailedToDeserializeForm,
118 FailedToDeserializeFormBody,
119 BytesRejection,
120 }
121}
122123composite_rejection! {
124/// Rejection used for [`RawForm`](super::RawForm).
125 ///
126 /// Contains one variant for each way the [`RawForm`](super::RawForm) extractor
127 /// can fail.
128pub enum RawFormRejection {
129 InvalidFormContentType,
130 BytesRejection,
131 }
132}
133134#[cfg(feature = "json")]
135composite_rejection! {
136/// Rejection used for [`Json`](super::Json).
137 ///
138 /// Contains one variant for each way the [`Json`](super::Json) extractor
139 /// can fail.
140#[cfg_attr(docsrs, doc(cfg(feature = "json")))]
141pub enum JsonRejection {
142 JsonDataError,
143 JsonSyntaxError,
144 MissingJsonContentType,
145 BytesRejection,
146 }
147}
148149composite_rejection! {
150/// Rejection used for [`Extension`](super::Extension).
151 ///
152 /// Contains one variant for each way the [`Extension`](super::Extension) extractor
153 /// can fail.
154pub enum ExtensionRejection {
155 MissingExtension,
156 }
157}
158159composite_rejection! {
160/// Rejection used for [`Path`](super::Path).
161 ///
162 /// Contains one variant for each way the [`Path`](super::Path) extractor
163 /// can fail.
164pub enum PathRejection {
165 FailedToDeserializePathParams,
166 MissingPathParams,
167 }
168}
169170composite_rejection! {
171/// Rejection used for [`RawPathParams`](super::RawPathParams).
172 ///
173 /// Contains one variant for each way the [`RawPathParams`](super::RawPathParams) extractor
174 /// can fail.
175pub enum RawPathParamsRejection {
176 InvalidUtf8InPathParam,
177 MissingPathParams,
178 }
179}
180181composite_rejection! {
182/// Rejection used for [`Host`](super::Host).
183 ///
184 /// Contains one variant for each way the [`Host`](super::Host) extractor
185 /// can fail.
186pub enum HostRejection {
187 FailedToResolveHost,
188 }
189}
190191#[cfg(feature = "matched-path")]
192define_rejection! {
193#[status = INTERNAL_SERVER_ERROR]
194 #[body = "No matched path found"]
195/// Rejection if no matched path could be found.
196 ///
197 /// See [`MatchedPath`](super::MatchedPath) for more details.
198#[cfg_attr(docsrs, doc(cfg(feature = "matched-path")))]
199pub struct MatchedPathMissing;
200}
201202#[cfg(feature = "matched-path")]
203composite_rejection! {
204/// Rejection used for [`MatchedPath`](super::MatchedPath).
205#[cfg_attr(docsrs, doc(cfg(feature = "matched-path")))]
206pub enum MatchedPathRejection {
207 MatchedPathMissing,
208 }
209}
210211define_rejection! {
212#[status = INTERNAL_SERVER_ERROR]
213 #[body = "The matched route is not nested"]
214/// Rejection type for [`NestedPath`](super::NestedPath).
215 ///
216 /// This rejection is used if the matched route wasn't nested.
217pub struct NestedPathRejection;
218}