#![warn(
clippy::pedantic,
clippy::perf,
clippy::todo,
clippy::expect_used,
clippy::unwrap_used
)]
use std::path::PathBuf;
use clap::Parser;
use clap_verbosity_flag::Verbosity;
use color_eyre::{eyre::Context, Result};
use fern::colors::{Color, ColoredLevelConfig};
use refman::{
cli::{self, Cli, Commands},
prelude::*,
};
#[tokio::main]
async fn main() -> Result<()> {
let cli = Cli::parse();
let verbosity = cli.verbose;
setup_logger(verbosity)?;
match cli.command {
None => {
eprintln!("{}\n", cli::INFO);
std::process::exit(0);
}
Some(Commands::Init {
registry,
global,
title,
description,
}) => {
let options = RegistryOptions::try_new(title, description, ®istry, global)?;
options.init()?;
Ok(())
}
Some(Commands::Register {
label,
fasta,
genbank,
gfa,
gtf,
gff,
bed,
tar,
registry,
global,
}) => {
let new_dataset =
RefDataset::try_new(label, fasta, genbank, gfa, gff, gtf, bed, tar).await?;
let options = RegistryOptions::try_new(None, None, ®istry, global)?;
let mut project = options.read_registry()?.register(new_dataset).await?;
options.write_registry(&mut project)?;
Ok(())
}
Some(Commands::Remove {
label,
registry,
global,
}) => {
let options = RegistryOptions::try_new(None, None, ®istry, global)?;
let mut project = options.read_registry()?.remove(&label)?;
options.write_registry(&mut project)?;
Ok(())
}
Some(Commands::List {
registry,
global,
label,
}) => {
RegistryOptions::try_new(None, None, ®istry, global)?
.read_registry()?
.prettyprint(label);
Ok(())
}
Some(Commands::Download {
label,
registry,
dest,
global,
all,
}) => {
let options = RegistryOptions::try_new(None, None, ®istry, global)?;
let destination = dest.unwrap_or_else(|| PathBuf::from("."));
let project = options.read_registry()?;
let Some(ref provided_label_str) = label else {
let mut updated_project = project.download_dataset(None, destination).await?;
options.write_registry(&mut updated_project)?;
return Ok(());
};
if all {
let mut updated_project = project
.download_dataset(label.as_deref(), destination)
.await?;
options.write_registry(&mut updated_project)?;
return Ok(());
}
if !project.is_registered(provided_label_str) {
Err(RegistryError::NotRegistered(provided_label_str.to_string()))?;
}
let mut updated_project = project
.download_dataset(label.as_deref(), destination)
.await?;
options.write_registry(&mut updated_project)?;
Ok(())
}
}
}
fn setup_logger(verbosity: Verbosity) -> Result<()> {
let level = verbosity.log_level_filter();
let colors = ColoredLevelConfig::new()
.trace(Color::BrightBlue)
.debug(Color::Blue)
.warn(Color::Yellow)
.error(Color::Red)
.info(Color::Green);
fern::Dispatch::new()
.level(level)
.level_for("hyper", log::LevelFilter::Warn)
.level_for("clap", log::LevelFilter::Warn)
.level_for("clap_builder", log::LevelFilter::Warn)
.format(move |out, message, record| {
out.finish(format_args!(
"[{} {} {}] {}",
jiff::Timestamp::now(),
colors.color(record.level()),
record.target(),
message,
));
})
.chain(std::io::stderr())
.apply()
.with_context(|| "Failed to setup logging.")?;
Ok(())
}