tinc/private/http/
query.rs

1use 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}