keyhog-verifier 0.5.4

keyhog-verifier — parallel async credential verification framework
Documentation
use keyhog_core::{DetectorSpec, MatchLocation, PatternSpec, RawMatch, Severity};
use keyhog_verifier::{dedup_matches, DedupScope, VerificationEngine, VerifyConfig};

#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), keyhog_verifier::VerifyError> {
    let detector = DetectorSpec {
        id: "demo-token".into(),
        name: "Demo Token".into(),
        service: "demo".into(),
        severity: Severity::High,
        patterns: vec![PatternSpec {
            regex: "demo_[A-Z0-9]{8}".into(),
            description: None,
            group: None,
        }],
        companions: Vec::new(),
        verify: None,
        keywords: vec!["demo_".into()],
    };

    let engine = VerificationEngine::new(&[detector], VerifyConfig::default())?;
    let groups = dedup_matches(
        vec![RawMatch {
            detector_id: "demo-token".into(),
            detector_name: "Demo Token".into(),
            service: "demo".into(),
            severity: Severity::High,
            credential: "demo_ABC12345".into(),
            credential_hash: "hash".into(),
            companions: std::collections::HashMap::new(),
            location: MatchLocation {
                source: "example".into(),
                file_path: Some("example.env".into()),
                line: Some(1),
                offset: 0,
                commit: None,
                author: None,
                date: None,
            },
            entropy: None,
            confidence: Some(0.95),
        }],
        &DedupScope::Credential,
    );

    let findings = engine.verify_all(groups).await;
    println!("findings={}", findings.len());
    println!("verification={:?}", findings[0].verification);
    Ok(())
}