pub mod commands;
use std::hash::BuildHasher;
use bitbelay_providers::AvailableProviders;
use clap::Parser;
use clap::Subcommand;
use crate::commands::avalanche;
use crate::commands::chi_squared;
use crate::commands::correlation;
use crate::commands::performance;
#[derive(Debug, Parser)]
#[clap(author, version, about, long_about = None)]
pub struct Args {
#[clap(subcommand)]
command: Commands,
#[clap(short, long, global = true, default_value_t)]
provider: AvailableProviders,
#[clap(short, long, global = true)]
trace: bool,
#[clap(short, long, global = true)]
verbose: bool,
}
#[derive(Debug, Subcommand)]
pub enum Commands {
Avalanche(commands::avalanche::Args),
ChiSquared(commands::chi_squared::Args),
Correlation(commands::correlation::Args),
Performance(commands::performance::Args),
}
fn main<H: BuildHasher>(build_hasher: H) -> anyhow::Result<()> {
let global_args = Args::parse();
let log_level = if global_args.trace {
tracing::Level::TRACE
} else if global_args.verbose {
tracing::Level::INFO
} else {
tracing::Level::ERROR
};
tracing_subscriber::fmt().with_max_level(log_level).init();
tracing::info!("Hasher: {}.", std::any::type_name::<H>());
tracing::info!("Provider: {}.", global_args.provider);
match global_args.command {
Commands::Avalanche(args) => {
avalanche::main(args, build_hasher, global_args.provider.into())
}
Commands::ChiSquared(args) => {
chi_squared::main(args, build_hasher, global_args.provider.into())
}
Commands::Correlation(args) => {
correlation::main::<H, 64>(args, build_hasher, global_args.provider.into())
}
Commands::Performance(args) => {
if global_args.trace || global_args.verbose {
tracing::warn!("");
tracing::warn!("***********");
tracing::warn!("* WARNING *");
tracing::warn!("***********");
tracing::warn!("");
tracing::warn!("The `--verbose` and `--trace` options should not ");
tracing::warn!("generally be used with this command, as those options");
tracing::warn!("can affect timing! Please don't report any results");
tracing::warn!("with those settings enabled.");
tracing::warn!("");
};
performance::main(args, build_hasher, global_args.provider.into())
}
}
}
pub fn wrapper<H: BuildHasher>(build_hasher: H) -> anyhow::Result<()> {
main(build_hasher)
}