use crate::error::{Error, Result};
use crate::form::{ActiveForm, FormDeserializer, MultipartForm};
use crate::http::IHttpContext;
use serde::de::DeserializeOwned;
use std::sync::Arc;
pub async fn bind_form_request<T>(ctx: &mut dyn IHttpContext) -> Result<Option<T>>
where
T: DeserializeOwned + Send + 'static,
{
if !ctx.request().is_multipart() {
return Ok(None);
}
let route_params = ctx.request().route_params().clone();
let form: Arc<MultipartForm> = ctx.request_mut().multipart().await?;
let bound = ActiveForm::run(Arc::clone(&form), || {
T::deserialize(FormDeserializer::new(&form, &route_params))
})
.map_err(|err| Error::Validation(format!("invalid multipart form data: {err}")))?;
Ok(Some(bound))
}