use bitcache::{Id, IdEncoding};
use clientele::{
StandardOptions, SysexitsError,
crates::clap::{Parser, Subcommand},
};
use std::path::PathBuf;
#[derive(Debug, Parser)]
#[command(name = "Bitcache", long_about)]
#[command(arg_required_else_help = true)]
struct Options {
#[clap(flatten)]
flags: StandardOptions,
#[command(subcommand)]
command: Option<Command>,
}
#[derive(Debug, Subcommand)]
enum Command {
Init {},
#[clap(aliases = ["id", "hash"])]
Identify {
#[arg(short, long, value_name = "FORMAT", default_value = "hex")]
format: IdEncoding,
#[arg(value_name = "FILES")]
paths: Vec<PathBuf>,
},
}
pub fn main() -> Result<(), SysexitsError> {
clientele::dotenv().ok();
let args = clientele::args_os()?;
let options = Options::parse_from(args);
if options.flags.version {
println!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
return Ok(());
}
if options.flags.license {
print!("{}", include_str!("../../../UNLICENSE"));
return Ok(());
}
if options.flags.debug {}
match options.command.unwrap() {
Command::Init {} => Ok(()),
Command::Identify { format, paths } => {
for path in paths {
let mut hasher = bitcache_core::Hasher::new();
let input_file = std::fs::File::open(&path)?;
hasher.update_reader(input_file)?;
let id: Id = hasher.finalize().into();
match format {
IdEncoding::Hex => println!("{}", id.to_hex()),
#[cfg(feature = "base58")]
IdEncoding::Base58 => println!("{}", id.to_base58()),
}
}
Ok(())
},
}
}