kractor 4.0.0

Extract reads from a FASTQ file based on taxonomic classification via Kraken2.
use chrono::Local;
use clap::Parser;
use color_eyre::eyre::bail;
use color_eyre::Result;
use env_logger::fmt::Color;
use env_logger::Builder;
use log::LevelFilter;
use std::io::Write;

pub mod extract;
pub mod parsers;
pub use crate::cli::Cli;
pub mod cli;
pub mod kractor;

use kractor::Kractor;

fn init_logging(verbose: bool) {
    let level_filter = if verbose {
        LevelFilter::Debug
    } else {
        LevelFilter::Info
    };

    Builder::new()
        .format(|buf, record| {
            let mut style = buf.style();
            style.set_color(match record.level() {
                log::Level::Trace => Color::Magenta,
                log::Level::Debug => Color::Blue,
                log::Level::Info => Color::Green,
                log::Level::Warn => Color::Yellow,
                log::Level::Error => Color::Red,
            });

            writeln!(
                buf,
                "{} [{}] - {}",
                Local::now().format("[%H:%M:%S]"),
                style.value(record.level()),
                record.args()
            )
        })
        .filter(None, level_filter)
        .init();
}

fn main() -> Result<()> {
    let args = Cli::parse();
    init_logging(args.verbose);

    color_eyre::install()?;

    if args.input.len() != args.output.len() {
        bail!("Number of input and output files must match");
    }

    let mut app = Kractor::new(args);
    app.run()?;

    Ok(())
}