ahsah 2.1.0

Incremental hashing contexts for MD5 and SHA-2 with reader helpers and optional SIMD decode paths
Documentation
use ahsah::{update_reader, Args, Digest, HashingAlgo, Md5, Sha224, Sha256, Sha384, Sha512};
use clap::Parser;
use std::{
    fs::File,
    io::{stdin, BufReader, Read},
    path::Path,
    time::Instant,
};

fn main() {
    let args = Args::parse();
    let now = Instant::now();

    let mut handle: Box<dyn Read> = match args.file {
        Some(path) => {
            let path = Path::new(&path);
            Box::new(BufReader::new(File::open(path).unwrap()))
        }
        None => Box::new(stdin().lock()),
    };

    let hash = match args.algo {
        HashingAlgo::Md5 => digest_reader::<Md5>(&mut handle),
        HashingAlgo::Sha224 => digest_reader::<Sha224>(&mut handle),
        HashingAlgo::Sha256 => digest_reader::<Sha256>(&mut handle),
        HashingAlgo::Sha384 => digest_reader::<Sha384>(&mut handle),
        HashingAlgo::Sha512 => digest_reader::<Sha512>(&mut handle),
    };

    let elapsed = now.elapsed();
    if args.time {
        println!(
            "{:?} took ({} ns | {} ms | {} s)",
            &args.algo,
            elapsed.as_nanos(),
            (elapsed.as_nanos() as f64 / 10e5),
            (elapsed.as_nanos() as f64 / 10e8),
        );
    }
    println!("{}", hash);
}

fn digest_reader<D: Digest + Default>(handle: &mut dyn Read) -> String {
    let mut digest = D::default();
    update_reader(&mut digest, handle).expect("Unable to hash reader input");
    digest.finalize_hex()
}