hash-gen 1.1.0

A command-line tool for generating cryptographic hashes (MD5, SHA1, SHA-256, SHA-512)
#![warn(clippy::all)]
#![warn(clippy::pedantic)]
#![warn(clippy::nursery)]
#![warn(clippy::cargo)]

mod config;
mod hasher;

use clap::Parser;

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

    match args.algorithm {
        config::Algorithm::Md5 { path, buffer } => {
            process_hash(hasher::Md5Hash::new(), path, buffer, "MD5");
        }
        config::Algorithm::Sha1 { path, buffer } => {
            process_hash(hasher::Sha1Hash::new(), path, buffer, "SHA1");
        }
        config::Algorithm::Sha256 { path, buffer } => {
            process_hash(hasher::Sha256Hash::new(), path, buffer, "SHA256");
        }
        config::Algorithm::Sha512 { path, buffer } => {
            process_hash(hasher::Sha512Hash::new(), path, buffer, "SHA512");
        }
    }
}

fn process_hash<H: hasher::Hash>(
    mut hasher: H,
    path: Option<std::path::PathBuf>,
    buffer: Option<String>,
    algorithm_name: &str,
) {
    if let Some(path) = path {
        match hasher.generate_from_file(path.as_path()) {
            Ok(hash) => println!(
                "{} hash ({}) = {}",
                algorithm_name,
                path.to_str().unwrap_or_default(),
                hash
            ),
            Err(e) => eprintln!("Failed to generate {algorithm_name} hash! Error: {e}"),
        }
    } else if let Some(buffer) = buffer {
        println!(
            "{} hash = {}",
            algorithm_name,
            hasher.generate_from_buf(buffer.as_bytes())
        );
    } else {
        eprintln!("No input provided for {algorithm_name} hash generation!");
    }
}