axum_request_validator/
validation.rs

1//! Validation logic for axum types.
2
3use axum::body::Body;
4
5/// The [`axum`]-specific validation error type.
6pub type Error<V> = http_body_request_validator::Error<axum::Error, V>;
7
8/// The bufferer and validator data type to use for axum.
9pub type Data = bytes::Bytes;
10
11/// The bufferer type used by axum.
12pub type Bufferer = http_body_request_validator::http_body_util::Bufferer<Data>;
13
14/// The bufferer buffered type used by axum.
15pub type BuffererBuffered = http_body_request_validator::bufferer::BufferedFor<Bufferer, Body>;
16
17#[cfg(test)]
18static_assertions::assert_type_eq_all!(Data, bytes::Bytes);
19
20/// The custom implementation of the [`http_body_request_validator::convert::BufferedToBody`] for
21/// axum [`Body`].
22enum CustomBufferedToBody {}
23
24impl http_body_request_validator::convert::BufferedToBody for CustomBufferedToBody {
25    type Buffered = BuffererBuffered;
26    type Body = Body;
27
28    fn buffered_to_body(buffered: Self::Buffered) -> Self::Body {
29        let body =
30            http_body_request_validator::convert::Trivial::<Self::Buffered>::buffered_to_body(
31                buffered,
32            );
33        Body::new(body)
34    }
35}
36
37/// Validate the [`axum`] request.
38pub async fn validate<Validator>(
39    validator: Validator,
40    req: axum::http::Request<Body>,
41) -> Result<axum::http::Request<Body>, Error<Validator::Error>>
42where
43    Validator: http_request_validator::Validator<Data>,
44{
45    http_body_request_validator::BufferingValidator::new(Bufferer::new())
46        .with_buffered_to_out_body::<CustomBufferedToBody>()
47        .validate(validator, req)
48        .await
49}