tinc/private/http/
query.rs1use axum::response::IntoResponse;
2
3use crate::__private::error::HttpErrorResponse;
4use crate::__private::{HttpErrorResponseCode, TrackerDeserializer, TrackerSharedState, deserialize_tracker_target};
5
6#[allow(clippy::result_large_err)]
7pub fn deserialize_query_string<'de, T>(
8 parts: &'de http::request::Parts,
9 tracker: &mut T,
10 target: &mut T::Target,
11 state: &mut TrackerSharedState,
12) -> Result<(), axum::response::Response>
13where
14 T: TrackerDeserializer<'de>,
15{
16 let Some(query_string) = parts.uri.query() else {
17 return Ok(());
18 };
19
20 match serde_qs::Deserializer::new(query_string.as_bytes())
21 .map(|de| deserialize_tracker_target(state, de, tracker, target))
22 {
23 Err(err) | Ok(Err(err)) => Err(HttpErrorResponse {
24 code: HttpErrorResponseCode::InvalidArgument,
25 details: Default::default(),
26 message: &format!("invalid query string: {err}"),
27 }
28 .into_response()),
29 Ok(Ok(())) => Ok(()),
30 }
31}