use clap::Parser;
use rustedbytes_pi::compute_pi;
#[derive(Parser)]
#[command(
name = env!("CARGO_PKG_NAME"),
about = env!("CARGO_PKG_DESCRIPTION"),
long_about = env!("CARGO_PKG_DESCRIPTION"),
version = env!("CARGO_PKG_VERSION"),
author = env!("CARGO_PKG_AUTHORS")
)]
struct Cli {
#[arg(short, long, default_value_t = 1_000_000)]
digits: usize,
#[arg(short, long, default_value_t = false)]
time: bool,
#[arg(short, long, default_value_t = false)]
verify: bool,
#[arg(long, default_value_t = false)]
no_dump: bool,
}
fn get_pi_digits() -> String {
include_str!("../tests/pi_digits.txt").to_string()
}
fn compare_pi(pi: &str) -> bool {
let mut result = true;
let reference_pi = get_pi_digits();
for (i, (computed_char, reference_char)) in pi.chars().zip(reference_pi.chars()).enumerate() {
if computed_char != reference_char {
result = false;
println!(
"Mismatch at index {}: computed='{}', reference='{}'",
i, computed_char, reference_char
);
}
}
result
}
fn main() {
let args = Cli::parse();
howlast::howlast!(compute_time, pi => { compute_pi(args.digits) });
if !args.no_dump {
println!("{}", pi);
}
if args.time {
println!("Compute Time: {:?}", compute_time);
}
if args.verify {
if pi.len() > get_pi_digits().len() {
println!(
"Warning: Only the first {} digits will be verified.",
get_pi_digits().len()-2
);
}
compare_pi(&pi);
}
}