use clap::Parser;
mod commands;
mod config;
mod get;
mod init;
mod post;
mod run;
const ANSWER_FOLDER: &str = ".answers";
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
days: Vec<u8>,
#[arg(long)]
init: bool,
#[arg(short = 'x', long)]
example: bool,
#[arg(short, long)]
get: bool,
#[arg(short, long)]
post: bool,
#[arg(long)]
year: Option<u32>,
#[arg(long)]
cookie: Option<String>,
#[arg(short, long)]
info: bool,
#[arg(short, long)]
save_answers: bool,
}
fn main() {
let args = Args::parse();
let mut quiet = false;
if args.init {
init::init().ok();
println!("\x1b[1mCreated Advent of Code project. Use \x1b[4maors -g 01\x1b[0;1m to fetch input for day 01");
return;
}
let (year, cookie) = config::config(args.year, args.cookie);
if args.info {
println!("\x1b[1;4myear:\x1b[0m {}", year);
println!("\x1b[1;4msession cookie:\x1b[0m {}", &cookie);
return;
}
if args.example {
println!("\x1b[103;30m USING EXAMPLE INPUT \x1b[0m");
}
let days = match args.days.len() {
0 => {
quiet = true;
let mut d: Vec<u8> = std::fs::read_dir("src/bin/")
.unwrap()
.filter_map(|p| p.ok()?.path().file_stem()?.to_str().map(str::to_string))
.filter_map(|f| f.parse().ok())
.collect();
d.sort();
d
}
_ => args.days,
};
let mut total_time = 0;
for day in days.clone() {
let day_str = format!("{:0>2}", day);
if args.get {
get::get(day, year, &cookie);
continue;
}
if let Some((p1, p2, time)) = run::run_day(&day_str, args.example, quiet) {
total_time += time;
if args.post {
post::post(day, year, args.example, &cookie, &p1, &p2);
}
if args.save_answers {
commands::save_answer(&day_str, 1, &p1);
commands::save_answer(&day_str, 2, &p2);
}
}
}
print!("\x1b[4;1m");
let days_completed = days.len();
if days_completed == 25 {
println!(
"\n🎄 All days completed! 🎄 Total time: {}ms\x1b[0m",
total_time / 1000
);
} else if days_completed > 1 {
println!(
"{} days completed in {}ms\x1b[0m",
days_completed,
total_time / 1000
);
}
}