From d203e100300f7b0610b1166cfbd70da38983689f Mon Sep 17 00:00:00 2001 From: Ilya Gusev Date: Sat, 18 Jul 2026 14:57:13 +0000 Subject: [PATCH] refactor(fetch): share query building between daemon and direct paths Follow-up to #52: the /v1/fetch query (url params + optional live=true) was built identically in the daemon handler and the direct-HTTP fallback; a future fetch param could silently drift between them. Extract DaemonRequest::fetch_query() as the single source. Co-Authored-By: Claude Fable 5 --- src/commands/search.rs | 6 +----- src/daemon.rs | 25 ++++++++++++++++++------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/commands/search.rs b/src/commands/search.rs index 2fbab3f..81f3c06 100644 --- a/src/commands/search.rs +++ b/src/commands/search.rs @@ -138,11 +138,7 @@ async fn execute(req: &DaemonRequest, api_key_override: Option<&str>) -> Result< handle_response(resp).await } "fetch" => { - let urls = req.urls.as_ref().ok_or_else(|| missing("urls"))?; - let mut query: Vec<(&str, &str)> = urls.iter().map(|u| ("url", u.as_str())).collect(); - if req.live { - query.push(("live", "true")); - } + let query = req.fetch_query().ok_or_else(|| missing("urls"))?; let resp = client .get(endpoint("/v1/fetch", authenticated)) .query(&query) diff --git a/src/daemon.rs b/src/daemon.rs index b612c02..bb2b0bb 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -19,6 +19,22 @@ impl DaemonRequest { pub fn idempotent(&self) -> bool { self.command != "feedback" } + + /// Query params for GET /v1/fetch, shared by the daemon and the direct + /// HTTP path so fetch params can't drift between them. None when `urls` + /// is missing. + pub fn fetch_query(&self) -> Option> { + let mut query: Vec<(&str, &str)> = self + .urls + .as_ref()? + .iter() + .map(|u| ("url", u.as_str())) + .collect(); + if self.live { + query.push(("live", "true")); + } + Some(query) + } } #[derive(Serialize, Deserialize, Debug)] @@ -276,15 +292,10 @@ mod platform { .await } "fetch" => { - let urls = match &req.urls { - Some(u) => u, + let query = match req.fetch_query() { + Some(q) => q, None => return err_response("Missing urls"), }; - let mut query: Vec<(&str, &str)> = - urls.iter().map(|u| ("url", u.as_str())).collect(); - if req.live { - query.push(("live", "true")); - } send_api( client .get(endpoint("/v1/fetch", authenticated))