1use crate::error::{Error, Result};
4use crate::form::{ActiveForm, FormDeserializer, MultipartForm};
5use crate::http::IHttpContext;
6use serde::de::DeserializeOwned;
7use std::sync::Arc;
8
9pub async fn bind_form_request<T>(ctx: &mut dyn IHttpContext) -> Result<Option<T>>
20where
21 T: DeserializeOwned + Send + 'static,
22{
23 if !ctx.request().is_multipart() {
24 return Ok(None);
25 }
26
27 let route_params = ctx.request().route_params().clone();
28 let form: Arc<MultipartForm> = ctx.request_mut().multipart().await?;
29
30 let bound = ActiveForm::run(Arc::clone(&form), || {
31 T::deserialize(FormDeserializer::new(&form, &route_params))
32 })
33 .map_err(|err| Error::Validation(format!("invalid multipart form data: {err}")))?;
34
35 Ok(Some(bound))
36}