diff --git a/src/cortex-cli/src/logs_cmd.rs b/src/cortex-cli/src/logs_cmd.rs index f525efc3..e2f49824 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 00000000..2c2fcc38 --- /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" + ); +}