Skip to main content

vld_rama/extract/
query.rs

1use 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
7/// Rama extractor that validates **URL query parameters**.
8///
9/// Values are coerced: `"42"` → number, `"true"`/`"false"` → boolean, empty → null.
10pub 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}