use crate::form::Limits;
use crate::form::State;
use crate::{Field, MultipartError};
use derive_more::{Deref, DerefMut};
use futures::future::LocalBoxFuture;
use ntex::web::{Error, HttpRequest};
use std::sync::Arc;
#[cfg(feature = "derive")]
pub use ntex_multipart_derive::MultipartForm;
pub trait MultipartCollect: Sized {
fn limit(field_name: &str) -> Option<usize>;
fn handle_field<'t>(
req: &'t HttpRequest,
field: Field,
limits: &'t mut Limits,
state: &'t mut State,
) -> LocalBoxFuture<'t, Result<(), MultipartError>>;
fn from_state(state: State) -> Result<Self, MultipartError>;
}
#[derive(Deref, DerefMut)]
pub struct MultipartForm<T: MultipartCollect>(pub T);
impl<T: MultipartCollect> MultipartForm<T> {
pub fn into_inner(self) -> T {
self.0
}
}
type MultipartFormErrorHandler =
Option<Arc<dyn Fn(MultipartError, &HttpRequest) -> Error + Send + Sync>>;
#[derive(Clone)]
pub struct MultipartFormConfig {
pub(crate) total_limit: usize,
pub(crate) memory_limit: usize,
pub(crate) err_handler: MultipartFormErrorHandler,
}
impl MultipartFormConfig {
pub fn total_limit(mut self, total_limit: usize) -> Self {
self.total_limit = total_limit;
self
}
pub fn memory_limit(mut self, memory_limit: usize) -> Self {
self.memory_limit = memory_limit;
self
}
pub(crate) fn from_req(req: &HttpRequest) -> &Self {
req.app_state::<Self>().unwrap_or(&DEFAULT_CONFIG)
}
}
const DEFAULT_CONFIG: MultipartFormConfig = MultipartFormConfig {
total_limit: 52_428_800, memory_limit: 2_097_152, err_handler: None,
};
impl Default for MultipartFormConfig {
fn default() -> Self {
DEFAULT_CONFIG
}
}