use std::future::Future;
use std::ops::{Deref, DerefMut};
use std::pin::Pin;
use actix_web::{dev::Payload, Error, FromRequest, HttpRequest};
use pin_project_lite::pin_project;
use serde::de::DeserializeOwned;
pub struct AutoMultipart<T>(pub T);
impl<T> AutoMultipart<T> {
pub fn new(value: T) -> Self {
Self(value)
}
pub fn into_inner(self) -> T {
self.0
}
}
impl<T> Deref for AutoMultipart<T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
impl<T> DerefMut for AutoMultipart<T> {
fn deref_mut(&mut self) -> &mut T {
&mut self.0
}
}
pin_project! {
pub struct AutoMultipartFuture<F> {
#[pin]
inner: F,
}
}
impl<T: DeserializeOwned + 'static> FromRequest for AutoMultipart<T> {
type Error = Error;
type Future = Pin<Box<dyn Future<Output = Result<Self, Error>>>>;
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future {
std::convert::identity(req);
std::convert::identity(payload);
Box::pin(async move {
Err(actix_web::error::ErrorPreconditionFailed(
"AutoMultipart is not yet implemented. Use actix-multipart directly.",
))
})
}
}
impl<T: std::fmt::Debug> std::fmt::Debug for AutoMultipart<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_tuple("AutoMultipart").field(&self.0).finish()
}
}