use crate::AsBuf as _;
#[derive(Debug)]
pub enum Error<B, V> {
BodyBuffering(B),
Validation(V),
}
pub type TrivialBufferedToOutBodyFor<Bufferer, InBody> =
crate::convert::Trivial<crate::bufferer::BufferedFor<Bufferer, InBody>>;
pub struct BufferingValidator<
Bufferer,
InBody,
BufferedToOutBody = TrivialBufferedToOutBodyFor<Bufferer, InBody>,
> {
pub bufferer: Bufferer,
pub phantom_data: core::marker::PhantomData<(fn() -> InBody, BufferedToOutBody)>,
}
impl<Bufferer, InBody>
BufferingValidator<Bufferer, InBody, TrivialBufferedToOutBodyFor<Bufferer, InBody>>
where
InBody: http_body::Body,
Bufferer: crate::Bufferer<InBody>,
{
pub const fn new(bufferer: Bufferer) -> Self {
Self {
bufferer,
phantom_data: core::marker::PhantomData,
}
}
}
impl<Bufferer, InBody, BufferedToOutBody> BufferingValidator<Bufferer, InBody, BufferedToOutBody>
where
InBody: http_body::Body,
Bufferer: crate::Bufferer<InBody>,
{
pub fn with_buffered_to_out_body<New>(self) -> BufferingValidator<Bufferer, InBody, New> {
let Self {
bufferer,
phantom_data: _,
} = self;
BufferingValidator {
bufferer,
phantom_data: core::marker::PhantomData,
}
}
}
impl<Bufferer, InBody, BufferedToOutBody> BufferingValidator<Bufferer, InBody, BufferedToOutBody>
where
InBody: http_body::Body,
Bufferer: crate::Bufferer<InBody>,
BufferedToOutBody:
crate::convert::BufferedToBody<Buffered = crate::bufferer::BufferedFor<Bufferer, InBody>>,
{
pub async fn validate<Validator>(
&self,
validator: Validator,
req: http::Request<InBody>,
) -> Result<http::Request<BufferedToOutBody::Body>, Error<Bufferer::Error, Validator::Error>>
where
Validator: http_request_validator::Validator<crate::bufferer::DataFor<Bufferer, InBody>>,
{
let (parts, body) = req.into_parts();
let buffered = self
.bufferer
.buffer(body)
.await
.map_err(Error::BodyBuffering)?;
validator
.validate(&parts, buffered.as_buf())
.await
.map_err(Error::Validation)?;
let req = http::Request::from_parts(parts, BufferedToOutBody::buffered_to_body(buffered));
Ok(req)
}
}