sigma-rust 0.7.0

A library for parsing and evaluating Sigma rules to create custom detection pipelines
Documentation
use sigma_rust::rule_from_yaml;
use std::fs::File;
use std::io::Read;
use std::time::Instant;
use walkdir::WalkDir;

#[test]
fn test_parse_sigma_main_rules() {
    let sigma_dir = "sigma-main-rules";
    let mut num_successful = 0;
    let mut num_failed = 0;
    let mut total = 0;
    let mut errors = vec![];

    let start = Instant::now();
    for entry in WalkDir::new(sigma_dir).into_iter().filter_map(|e| e.ok()) {
        if entry.path().extension().and_then(|s| s.to_str()) == Some("yml") {
            total += 1;
            let mut file = File::open(entry.path()).expect("Unable to open file");
            let mut contents = String::new();
            file.read_to_string(&mut contents)
                .expect("Unable to read file");

            let rule = rule_from_yaml(&contents);
            match rule {
                Ok(_) => {
                    num_successful += 1;
                }
                Err(err) => {
                    num_failed += 1;
                    errors.push(format!(
                        "Failed to parse YAML file {:?}: {:?}",
                        entry.path(),
                        err
                    ));
                }
            };
        }
    }
    let duration = start.elapsed();
    println!("-----------------------------------------------");
    println!("Parsing {} rules took {:?}", total, duration);

    println!("Successfully parsed {} rules", num_successful);
    println!("{} rules failed with errors", num_failed);
    for (i, error) in errors.iter().enumerate() {
        println!("{:02}: {}", i + 1, error);
    }

    assert!(num_successful > 0);
    assert_eq!(num_failed, 0);
}