From ff8200cbdc1066181a195c9d7019fed904e1754b Mon Sep 17 00:00:00 2001 From: Bortlesboat Date: Mon, 11 May 2026 00:12:30 -0400 Subject: [PATCH] fix: validate logs level filter --- src/cortex-cli/src/logs_cmd.rs | 12 +++++++++++- src/cortex-cli/tests/logs_level.rs | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/cortex-cli/tests/logs_level.rs diff --git a/src/cortex-cli/src/logs_cmd.rs b/src/cortex-cli/src/logs_cmd.rs index f525efc3c..e2f498247 100644 --- a/src/cortex-cli/src/logs_cmd.rs +++ b/src/cortex-cli/src/logs_cmd.rs @@ -23,7 +23,7 @@ pub struct LogsCli { pub follow: bool, /// Filter by log level (error, warn, info, debug, trace) - #[arg(long, short = 'l')] + #[arg(long, short = 'l', value_parser = parse_log_level)] pub level: Option, /// Show logs from a specific session @@ -81,6 +81,16 @@ fn format_size(bytes: u64) -> String { } } +fn parse_log_level(level: &str) -> std::result::Result { + let normalized = level.to_ascii_lowercase(); + match normalized.as_str() { + "error" | "warn" | "info" | "debug" | "trace" => Ok(normalized), + _ => Err(format!( + "invalid log level '{level}'; expected one of: error, warn, info, debug, trace" + )), + } +} + impl LogsCli { /// Run the logs command. pub async fn run(self) -> Result<()> { diff --git a/src/cortex-cli/tests/logs_level.rs b/src/cortex-cli/tests/logs_level.rs new file mode 100644 index 000000000..2c2fcc387 --- /dev/null +++ b/src/cortex-cli/tests/logs_level.rs @@ -0,0 +1,21 @@ +use clap::Parser; +use cortex_cli::logs_cmd::LogsCli; + +#[test] +fn accepts_valid_log_level_filter() { + let cli = LogsCli::try_parse_from(["logs", "--level", "debug"]) + .expect("valid log level should be accepted"); + + assert_eq!(cli.level.as_deref(), Some("debug")); +} + +#[test] +fn rejects_invalid_log_level_filter() { + let err = LogsCli::try_parse_from(["logs", "--level", "rr"]) + .expect_err("invalid log level should be rejected"); + + assert!( + err.to_string().contains("invalid log level"), + "error should explain that the log level is invalid" + ); +}