From ba8b11420281a0cf2e60616d65704bf74559e171 Mon Sep 17 00:00:00 2001 From: Cody Date: Sun, 5 Apr 2026 18:20:15 -0400 Subject: [PATCH] refactor(client): extract constants and clean up patterns - Extract repeated (200..300) status range to SUCCESS_STATUS constant - Remove trailing comma in format string (get_duckling_config) - Extract trim().to_string() pattern to trimmed() helper in auth Co-Authored-By: Claude Opus 4.6 (1M context) --- crates/dkdc-md-cli/src/auth.rs | 23 ++++++++++++++--------- crates/dkdc-md-cli/src/client.rs | 7 ++++--- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/crates/dkdc-md-cli/src/auth.rs b/crates/dkdc-md-cli/src/auth.rs index 945d746..be0ff80 100644 --- a/crates/dkdc-md-cli/src/auth.rs +++ b/crates/dkdc-md-cli/src/auth.rs @@ -9,6 +9,11 @@ const ENV_VARS: &[&str] = &[ "MOTHERDUCK_API_KEY", ]; +/// Trim whitespace and convert to an owned `String`. +fn trimmed(s: &str) -> String { + s.trim().to_string() +} + /// Resolve token: CLI flag takes precedence over env vars. /// Pass `Some("-")` to read from stdin. pub fn resolve_token_or(cli_token: Option<&str>) -> Result { @@ -24,9 +29,9 @@ fn resolve_token_or_with( if token == "-" { return read_token_from_reader(stdin); } - let trimmed = token.trim(); - anyhow::ensure!(!trimmed.is_empty(), "--token value must not be empty"); - return Ok(trimmed.to_string()); + let t = trimmed(token); + anyhow::ensure!(!t.is_empty(), "--token value must not be empty"); + return Ok(t); } resolve_token_with(env_var) } @@ -36,9 +41,9 @@ fn read_token_from_reader(mut reader: impl Read) -> Result { reader .read_to_string(&mut buf) .context("failed to read token from stdin")?; - let trimmed = buf.trim().to_string(); - anyhow::ensure!(!trimmed.is_empty(), "stdin was empty; expected a token"); - Ok(trimmed) + let t = trimmed(&buf); + anyhow::ensure!(!t.is_empty(), "stdin was empty; expected a token"); + Ok(t) } fn resolve_token_with( @@ -46,9 +51,9 @@ fn resolve_token_with( ) -> Result { for var in ENV_VARS { if let Ok(val) = env_var(var) { - let trimmed = val.trim().to_string(); - if !trimmed.is_empty() { - return Ok(trimmed); + let t = trimmed(&val); + if !t.is_empty() { + return Ok(t); } } } diff --git a/crates/dkdc-md-cli/src/client.rs b/crates/dkdc-md-cli/src/client.rs index f67b469..ada4b26 100644 --- a/crates/dkdc-md-cli/src/client.rs +++ b/crates/dkdc-md-cli/src/client.rs @@ -9,6 +9,7 @@ use ureq::{Agent, http}; const BASE_URL: &str = "https://api.motherduck.com"; const TIMEOUT: Duration = Duration::from_secs(10); const USER_AGENT: &str = concat!("dkdc-md-cli/", env!("CARGO_PKG_VERSION")); +const SUCCESS_STATUS: std::ops::Range = 200..300; /// Characters that must be percent-encoded in a URL path segment. const PATH_SEGMENT: &AsciiSet = &CONTROLS.add(b' ').add(b'#').add(b'%').add(b'/').add(b'?'); @@ -150,7 +151,7 @@ impl MotherduckClient { // -- Ducklings -- pub fn get_duckling_config(&self, username: &str) -> Result { - self.get(&format!("/v1/users/{}/instances", encode_path(username),)) + self.get(&format!("/v1/users/{}/instances", encode_path(username))) } pub fn set_duckling_config( @@ -189,7 +190,7 @@ fn handle_response(mut resp: http::Response) -> Result { fn parse_response(status: u16, text: String) -> Result { match serde_json::from_str::(&text) { - Ok(body) if (200..300).contains(&status) => Ok(body), + Ok(body) if SUCCESS_STATUS.contains(&status) => Ok(body), Ok(body) => { let message = body .get("message") @@ -197,7 +198,7 @@ fn parse_response(status: u16, text: String) -> Result { .unwrap_or(&text); bail!("API error ({status}): {message}"); } - Err(_) if (200..300).contains(&status) => Ok(Value::String(text)), + Err(_) if SUCCESS_STATUS.contains(&status) => Ok(Value::String(text)), Err(_) => bail!("API error ({status}): {text}"), } }