From af23a49b936a0af3e1b008855cba5594a5a428c0 Mon Sep 17 00:00:00 2001 From: Greyforge Admin Date: Tue, 19 May 2026 23:26:34 -0400 Subject: [PATCH] Resolve dotted config get keys --- src/cortex-cli/src/cli/handlers.rs | 15 +++++++++++++- src/cortex-cli/tests/config_get.rs | 33 ++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/cortex-cli/tests/config_get.rs diff --git a/src/cortex-cli/src/cli/handlers.rs b/src/cortex-cli/src/cli/handlers.rs index e92fa8632..06e1ce09f 100644 --- a/src/cortex-cli/src/cli/handlers.rs +++ b/src/cortex-cli/src/cli/handlers.rs @@ -836,7 +836,7 @@ pub async fn show_config(config_cli: ConfigCommand) -> Result<()> { if config_path.exists() { let content = std::fs::read_to_string(&config_path)?; let config: toml::Value = toml::from_str(&content)?; - if let Some(value) = config.get(&args.key) { + if let Some(value) = get_config_value(&config, &args.key) { println!("{}", value); } else { bail!("Key '{}' not found in configuration", args.key); @@ -901,6 +901,19 @@ pub async fn show_config(config_cli: ConfigCommand) -> Result<()> { Ok(()) } +fn get_config_value<'a>(config: &'a toml::Value, key: &str) -> Option<&'a toml::Value> { + config.get(key).or_else(|| { + let mut current = config; + for part in key.split('.') { + if part.is_empty() { + return None; + } + current = current.get(part)?; + } + Some(current) + }) +} + /// List features. pub async fn list_features() -> Result<()> { println!("Feature flags:"); diff --git a/src/cortex-cli/tests/config_get.rs b/src/cortex-cli/tests/config_get.rs new file mode 100644 index 000000000..458183322 --- /dev/null +++ b/src/cortex-cli/tests/config_get.rs @@ -0,0 +1,33 @@ +use std::fs; +use std::process::Command; + +use tempfile::tempdir; + +#[test] +fn config_get_resolves_dotted_keys() { + let home_dir = tempdir().unwrap(); + let cortex_home = home_dir.path().join(".cortex"); + fs::create_dir_all(&cortex_home).unwrap(); + fs::write( + cortex_home.join("config.toml"), + r#"[model] +default = "gpt-4o" +"#, + ) + .unwrap(); + + let output = Command::new(env!("CARGO_BIN_EXE_Cortex")) + .args(["config", "get", "model.default"]) + .env("HOME", home_dir.path()) + .env_remove("CORTEX_HOME") + .output() + .unwrap(); + + let stdout = String::from_utf8_lossy(&output.stdout); + let stderr = String::from_utf8_lossy(&output.stderr); + assert!( + output.status.success(), + "config get failed\nstdout:\n{stdout}\nstderr:\n{stderr}" + ); + assert!(stdout.contains("gpt-4o"), "stdout was {stdout:?}"); +}