tinc 0.2.3

GRPc to REST transcoding library
Documentation
use axum::response::IntoResponse;

use crate::__private::error::HttpErrorResponse;
use crate::__private::{
    HttpErrorResponseCode, TrackerDeserializer, TrackerSharedState, deserialize_tracker_target,
};

#[allow(clippy::result_large_err)]
pub fn deserialize_query_string<'de, T>(
    parts: &'de http::request::Parts,
    tracker: &mut T,
    target: &mut T::Target,
    state: &mut TrackerSharedState,
) -> Result<(), axum::response::Response>
where
    T: TrackerDeserializer<'de>,
{
    let Some(query_string) = parts.uri.query() else {
        return Ok(());
    };

    match serde_qs::Deserializer::new(query_string.as_bytes())
        .map(|de| deserialize_tracker_target(state, de, tracker, target))
    {
        Err(err) | Ok(Err(err)) => Err(HttpErrorResponse {
            code: HttpErrorResponseCode::InvalidArgument,
            details: Default::default(),
            message: &format!("invalid query string: {err}"),
        }
        .into_response()),
        Ok(Ok(())) => Ok(()),
    }
}