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())) + } +}