use std::fs::read_to_string; use chrono::Datelike; use clap::{App, Arg}; use crate::day01::Day01; use crate::day02::Day02; use crate::day::Day; mod day; mod day01; mod day02; fn load_input(day: &str) -> String { read_to_string(format!("./input/day{}", day)).expect("Could not load input") } fn run_day(days: &Vec>, day: usize) { if let Some(d) = days.get(day - 1) { let day_code = d.clone(); println!("Running day {}!", day); println!("\tPart 1: {}", d.part1()); println!("\tPart 2: {}", day_code.part2()); } else { eprintln!("Day {} is not available!", day); } } fn main() { let matches = App::new("AOC Time!") .version("1.0") .author("J00LZ") .about("How to overengineer AOC in a single program...") .arg(Arg::with_name("v") .short("v") .multiple(true) .help("Sets the level of verbosity")) .arg(Arg::with_name("all") .short("a") .long("all") .help("run all available days")) .arg(Arg::with_name("DAY") .takes_value(true) .multiple(true)) .get_matches(); let days: Vec> = vec![Box::new(Day01::init(load_input("01"))), Box::new(Day02::init(load_input("02")))]; let _verbosity = matches.occurrences_of("v"); if matches.is_present("all") { let l = days.len(); println!("running {} days!", l); for v in 1..l + 1 { run_day(&days, v); } } else if let Some(d) = matches.values_of("DAY") { let d = d.map(|x| x.parse::().expect("Did not provide an int!")); for v in d { run_day(&days, v as usize); } } else { let v = chrono::Local::now().day(); run_day(&days, v as usize) } }