From 58f15de8731bc849a899303f3ba71f94d19420eb Mon Sep 17 00:00:00 2001 From: Aditya kumar singh <143548997+Adityakk9031@users.noreply.github.com> Date: Thu, 23 Jul 2026 23:22:33 +0530 Subject: [PATCH 1/3] fix(scanner): replace panic-prone iterator .unwrap() with safe Option popping during rule loading --- src/scanner/modes.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/scanner/modes.rs b/src/scanner/modes.rs index b0f8a2b..fe43dde 100644 --- a/src/scanner/modes.rs +++ b/src/scanner/modes.rs @@ -184,8 +184,12 @@ fn load_explicit_scan_rules(cli: &Cli, language: &str) -> Result { } } + if all_rules.is_empty() { + return Err(anyhow::anyhow!("No rules loaded for language {}", language)); + } + if all_rules.len() == 1 { - Ok(all_rules.into_iter().next().unwrap()) + all_rules.pop().ok_or_else(|| anyhow::anyhow!("No rules loaded for language {}", language)) } else { Rules::merge_rules(all_rules) } @@ -317,7 +321,9 @@ fn load_rules_for_detected_language(cli: &Cli, language: &str) -> Result Date: Sat, 25 Jul 2026 10:09:39 +0530 Subject: [PATCH 2/3] refactor(scanner): simplify rule loading by delegating directly to Rules::merge_rules --- src/scanner/modes.rs | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/scanner/modes.rs b/src/scanner/modes.rs index fe43dde..2be47ae 100644 --- a/src/scanner/modes.rs +++ b/src/scanner/modes.rs @@ -184,15 +184,7 @@ fn load_explicit_scan_rules(cli: &Cli, language: &str) -> Result { } } - if all_rules.is_empty() { - return Err(anyhow::anyhow!("No rules loaded for language {}", language)); - } - - if all_rules.len() == 1 { - all_rules.pop().ok_or_else(|| anyhow::anyhow!("No rules loaded for language {}", language)) - } else { - Rules::merge_rules(all_rules) - } + Rules::merge_rules(all_rules) } /// Print the banner shown at the start of an explicit scan. @@ -320,13 +312,7 @@ fn load_rules_for_detected_language(cli: &Cli, language: &str) -> Result Date: Sat, 1 Aug 2026 00:24:46 +0530 Subject: [PATCH 3/3] test(scanner): add regression test for load_rules_for_detected_language when no rules are found --- src/scanner/modes.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/scanner/modes.rs b/src/scanner/modes.rs index 2be47ae..2c841f2 100644 --- a/src/scanner/modes.rs +++ b/src/scanner/modes.rs @@ -741,4 +741,15 @@ mod tests { let res = load_explicit_scan_rules(&cli, "python"); assert!(res.is_err()); } + + #[test] + fn load_rules_for_detected_language_returns_none_when_no_rules_found() { + let temp_dir = tempfile::tempdir().expect("failed to create temp dir"); + let mut cli = base_cli(); + cli.use_file_rules = true; + cli.rules_dir = Some(temp_dir.path().to_str().unwrap().to_string()); + + let res = load_rules_for_detected_language(&cli, "python").expect("should return Ok"); + assert!(res.is_none()); + } }