keyhog 0.5.73

GPU-accelerated secret scanner for code, Git history, cloud, containers, browser assets, and live credential verification
use super::value_enum_expected;
use clap::ValueEnum;
use std::collections::HashSet;

fn assert_expected_lists_every_canonical_value_once<T: ValueEnum>() {
    let diagnostic = value_enum_expected::<T>();
    let listed: Vec<_> = match diagnostic.strip_prefix("expected one of ") {
        Some(values) => values.split(", ").collect(),
        None => panic!("config enum diagnostic prefix is missing"),
    };
    let canonical: Vec<_> = T::value_variants()
        .iter()
        .map(|variant| match variant.to_possible_value() {
            Some(possible) => possible.get_name().to_owned(),
            None => panic!("config enum variant must have a clap spelling"),
        })
        .collect();
    let unique: HashSet<_> = listed.iter().copied().collect();

    assert_eq!(listed, canonical);
    assert_eq!(
        unique.len(),
        listed.len(),
        "accepted-value diagnostic contains duplicates: {diagnostic}"
    );
}

#[test]
fn config_enum_diagnostics_cover_every_canonical_value_uniquely() {
    assert_expected_lists_every_canonical_value_once::<crate::args::SeverityFilter>();
    assert_expected_lists_every_canonical_value_once::<crate::args::OutputFormat>();
    assert_expected_lists_every_canonical_value_once::<crate::args::CliDedupScope>();
}