From 2e8f0bb8308912c00030ebb65cdbb22381d9d27f Mon Sep 17 00:00:00 2001 From: Niraj Chowdhary Date: Mon, 29 Sep 2025 18:36:04 +0000 Subject: [PATCH 1/4] fix: make q settings delete functionality user friendly --- crates/chat-cli/src/cli/settings.rs | 40 ++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/crates/chat-cli/src/cli/settings.rs b/crates/chat-cli/src/cli/settings.rs index 0993fb5dc3..357b15fed1 100644 --- a/crates/chat-cli/src/cli/settings.rs +++ b/crates/chat-cli/src/cli/settings.rs @@ -13,6 +13,7 @@ use eyre::{ }; use globset::Glob; use serde_json::json; +use crossterm::style::Stylize; use super::OutputFormat; use crate::database::settings::Setting; @@ -37,7 +38,7 @@ pub enum SettingsSubcommands { #[derive(Clone, Debug, Args, PartialEq, Eq)] #[command(subcommand_negates_reqs = true)] #[command(args_conflicts_with_subcommands = true)] -#[command(group(ArgGroup::new("vals").requires("key").args(&["value", "delete", "format"])))] +#[command(group(ArgGroup::new("vals").requires("key").args(&["value", "format"])))] pub struct SettingsArgs { #[command(subcommand)] cmd: Option, @@ -45,7 +46,7 @@ pub struct SettingsArgs { key: Option, /// value value: Option, - /// Delete a value + /// Delete a key (No value needed) #[arg(long, short)] delete: bool, /// Format of the output @@ -92,6 +93,12 @@ impl SettingsArgs { let key = Setting::try_from(key.as_str())?; match (&self.value, self.delete) { + (Some(_), true) => { + Err(eyre::eyre!("the argument {} cannot be used with {}\n Usage: q settings {} {key}", + "'--delete'".yellow(), + "'[VALUE]'".yellow(), + "--delete".yellow())) + }, (None, false) => match os.database.settings.get(key) { Some(value) => { match self.format { @@ -146,10 +153,35 @@ impl SettingsArgs { } Ok(ExitCode::SUCCESS) - }, - _ => Ok(ExitCode::SUCCESS), + } } }, } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[tokio::test] + async fn test_delete_with_value_error() { + let mut os = Os::new().await.unwrap(); + + let settings_args = SettingsArgs { + cmd: None, + key: Some("chat.defaultAgent".to_string()), + value: Some("test_value".to_string()), + delete: true, + format: OutputFormat::Plain, + }; + + let result = settings_args.execute(&mut os).await; + + assert!(result.is_err()); + let error_msg = result.unwrap_err().to_string(); + assert!(error_msg.contains("the argument")); + assert!(error_msg.contains("--delete")); + assert!(error_msg.contains("Usage:")); + } +} \ No newline at end of file From 3ce66a227ec984683720bd3bd0f4ed336ed290ff Mon Sep 17 00:00:00 2001 From: Niraj Chowdhary Date: Mon, 29 Sep 2025 18:46:38 +0000 Subject: [PATCH 2/4] fix: make q settings delete option user friendly --- crates/chat-cli/src/cli/settings.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/chat-cli/src/cli/settings.rs b/crates/chat-cli/src/cli/settings.rs index 357b15fed1..2fdc5e1802 100644 --- a/crates/chat-cli/src/cli/settings.rs +++ b/crates/chat-cli/src/cli/settings.rs @@ -6,6 +6,7 @@ use clap::{ Args, Subcommand, }; +use crossterm::style::Stylize; use eyre::{ Result, WrapErr, @@ -13,7 +14,6 @@ use eyre::{ }; use globset::Glob; use serde_json::json; -use crossterm::style::Stylize; use super::OutputFormat; use crate::database::settings::Setting; @@ -93,12 +93,12 @@ impl SettingsArgs { let key = Setting::try_from(key.as_str())?; match (&self.value, self.delete) { - (Some(_), true) => { - Err(eyre::eyre!("the argument {} cannot be used with {}\n Usage: q settings {} {key}", + (Some(_), true) => Err(eyre::eyre!( + "the argument {} cannot be used with {}\n Usage: q settings {} {key}", "'--delete'".yellow(), "'[VALUE]'".yellow(), - "--delete".yellow())) - }, + "--delete".yellow() + )), (None, false) => match os.database.settings.get(key) { Some(value) => { match self.format { @@ -153,7 +153,7 @@ impl SettingsArgs { } Ok(ExitCode::SUCCESS) - } + }, } }, } @@ -167,7 +167,7 @@ mod tests { #[tokio::test] async fn test_delete_with_value_error() { let mut os = Os::new().await.unwrap(); - + let settings_args = SettingsArgs { cmd: None, key: Some("chat.defaultAgent".to_string()), @@ -177,11 +177,11 @@ mod tests { }; let result = settings_args.execute(&mut os).await; - + assert!(result.is_err()); let error_msg = result.unwrap_err().to_string(); assert!(error_msg.contains("the argument")); assert!(error_msg.contains("--delete")); assert!(error_msg.contains("Usage:")); } -} \ No newline at end of file +} From ad40fb9e9d117c48b8a361dac2590ed27af6a7fe Mon Sep 17 00:00:00 2001 From: Niraj Chowdhary Date: Mon, 6 Oct 2025 16:15:15 +0000 Subject: [PATCH 3/4] Add error message for key missing when delete provided for backward compatbility --- crates/chat-cli/src/cli/settings.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crates/chat-cli/src/cli/settings.rs b/crates/chat-cli/src/cli/settings.rs index 2fdc5e1802..b5ebad8f6f 100644 --- a/crates/chat-cli/src/cli/settings.rs +++ b/crates/chat-cli/src/cli/settings.rs @@ -88,6 +88,9 @@ impl SettingsArgs { }, None => { let Some(key) = &self.key else { + if self.delete { + return Err(eyre::eyre!("the argument {} requires a {}\n Usage: q settings {} {}", "'--delete'".yellow(), "".green(), "--delete".yellow(), "".green())); + } return Ok(ExitCode::SUCCESS); }; From ab0781a73ed02e504ea8270dae15544230d8cf38 Mon Sep 17 00:00:00 2001 From: Niraj Chowdhary Date: Mon, 6 Oct 2025 17:48:12 +0000 Subject: [PATCH 4/4] Run formatting script to maintain code standards --- crates/chat-cli/src/cli/settings.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/crates/chat-cli/src/cli/settings.rs b/crates/chat-cli/src/cli/settings.rs index b5ebad8f6f..2360668f3d 100644 --- a/crates/chat-cli/src/cli/settings.rs +++ b/crates/chat-cli/src/cli/settings.rs @@ -89,7 +89,13 @@ impl SettingsArgs { None => { let Some(key) = &self.key else { if self.delete { - return Err(eyre::eyre!("the argument {} requires a {}\n Usage: q settings {} {}", "'--delete'".yellow(), "".green(), "--delete".yellow(), "".green())); + return Err(eyre::eyre!( + "the argument {} requires a {}\n Usage: q settings {} {}", + "'--delete'".yellow(), + "".green(), + "--delete".yellow(), + "".green() + )); } return Ok(ExitCode::SUCCESS); };