vld_rama/extract/
query.rs1use crate::rejection::VldRejection;
2use rama::http::request::Parts;
3use rama::http::service::web::extract::FromPartsStateRefPair;
4use vld::schema::VldParse;
5use vld_http_common::query_string_to_json;
6
7pub struct VldQuery<T>(pub T);
11
12impl<T, State> FromPartsStateRefPair<State> for VldQuery<T>
13where
14 T: VldParse + Send + Sync + 'static,
15 State: Send + Sync + 'static,
16{
17 type Rejection = VldRejection;
18
19 async fn from_parts_state_ref_pair(
20 parts: &Parts,
21 _state: &State,
22 ) -> Result<Self, Self::Rejection> {
23 let query_string = parts
24 .uri
25 .query()
26 .map(|q| q.as_encoded_str().into_owned())
27 .unwrap_or_default();
28 let value = query_string_to_json(&query_string);
29 let parsed = T::vld_parse_value(&value).map_err(VldRejection::from_vld)?;
30 Ok(VldQuery(parsed))
31 }
32}