From 2bfea64ffcbd621d134ef7e717d23e80fe3ce9d7 Mon Sep 17 00:00:00 2001 From: Lewis Date: Sun, 19 Jul 2026 17:19:22 +0300 Subject: [PATCH] api: add xrpc query extractor Lewis: May this revision serve well! --- crates/tranquil-pds/src/api/mod.rs | 1 + crates/tranquil-pds/src/api/query.rs | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 crates/tranquil-pds/src/api/query.rs diff --git a/crates/tranquil-pds/src/api/mod.rs b/crates/tranquil-pds/src/api/mod.rs index 4e17789..dd05958 100644 --- a/crates/tranquil-pds/src/api/mod.rs +++ b/crates/tranquil-pds/src/api/mod.rs @@ -2,6 +2,7 @@ pub mod error; pub mod invite; pub mod proxy; pub mod proxy_client; +pub mod query; pub mod responses; pub mod validation; diff --git a/crates/tranquil-pds/src/api/query.rs b/crates/tranquil-pds/src/api/query.rs new file mode 100644 index 0000000..b09711b --- /dev/null +++ b/crates/tranquil-pds/src/api/query.rs @@ -0,0 +1,18 @@ +use axum::extract::FromRequestParts; +use axum::http::request::Parts; +use serde::de::DeserializeOwned; + +use super::error::ApiError; + +pub struct XrpcQuery(pub T); + +impl FromRequestParts for XrpcQuery { + type Rejection = ApiError; + + async fn from_request_parts(parts: &mut Parts, _state: &S) -> Result { + let raw = parts.uri.query().unwrap_or_default(); + serde_urlencoded::from_str(raw) + .map(Self) + .map_err(|e| ApiError::InvalidRequest(e.to_string())) + } +}