extern crate redicat_lib;
pub mod commands;
use anyhow::Result;
use chrono::Local;
use env_logger::Env;
use log::*;
use redicat_lib::utils;
use std::io::Write;
use structopt::StructOpt;
#[derive(StructOpt)]
#[structopt(rename_all = "kebab-case", author, about)]
struct Args {
#[structopt(subcommand)]
subcommand: Subcommand,
}
#[derive(StructOpt)]
enum Subcommand {
Bulk(commands::BulkArgs),
Bam2mtx(commands::Bam2MtxArgs),
Call(commands::CallArgs),
}
impl Subcommand {
fn run(self) -> Result<()> {
match self {
Subcommand::Bulk(args) => commands::run_bulk(args)?,
Subcommand::Bam2mtx(args) => commands::run_bam2mtx(args)?,
Subcommand::Call(args) => commands::run_call(args)?,
}
Ok(())
}
}
fn main() -> Result<()> {
env_logger::Builder::from_env(Env::default().default_filter_or("info"))
.format(|buf, record| {
let timestamp = Local::now().format("%Y-%m-%d %H:%M:%S%.3f %:z");
writeln!(buf, "[{} {}] {}", timestamp, record.level(), record.args())
})
.init();
if let Err(err) = Args::from_args().subcommand.run() {
if utils::is_broken_pipe(&err) {
std::process::exit(0);
}
error!("{}", err);
std::process::exit(1);
}
Ok(())
}