diff --git a/Cargo.lock b/Cargo.lock index 006c7630..7b0186a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2361,6 +2361,7 @@ dependencies = [ "serde", "serde-wasm-bindgen 0.6.1", "serde_json", + "serde_urlencoded", "tokio", "tokio-postgres", "url", diff --git a/worker/Cargo.toml b/worker/Cargo.toml index 27ea99ad..c45a3180 100644 --- a/worker/Cargo.toml +++ b/worker/Cargo.toml @@ -30,6 +30,7 @@ url = "2.4.0" wasm-bindgen = "=0.2.87" wasm-bindgen-futures = "0.4.36" serde-wasm-bindgen = "0.6.1" +serde_urlencoded = "0.7" wasm-streams = "0.3.0" worker-kv = "0.6.0" worker-macros = { path = "../worker-macros", version = "0.0.10" } diff --git a/worker/src/error.rs b/worker/src/error.rs index ca0bcc05..f16c712f 100644 --- a/worker/src/error.rs +++ b/worker/src/error.rs @@ -34,6 +34,12 @@ impl From for Error { } } +impl From for Error { + fn from(e: serde_urlencoded::de::Error) -> Self { + Self::RustError(e.to_string()) + } +} + impl From for Error { fn from(e: serde_wasm_bindgen::Error) -> Self { let val: JsValue = e.into(); diff --git a/worker/src/request.rs b/worker/src/request.rs index 4ac8bfbe..7cd1c3fe 100644 --- a/worker/src/request.rs +++ b/worker/src/request.rs @@ -242,6 +242,15 @@ impl Request { .map_err(|e| Error::RustError(format!("failed to parse Url from {e}: {url}"))) } + /// Deserialize the url query + pub fn query(&self) -> Result { + let url = self.url()?; + let pairs = url.query_pairs(); + let deserializer = serde_urlencoded::Deserializer::new(pairs); + + Q::deserialize(deserializer).map_err(Error::from) + } + #[allow(clippy::should_implement_trait)] pub fn clone(&self) -> Result { self.edge_request