use std::fs::read_to_string; use chrono::Datelike; use clap::{App, Arg}; use crate::day01::Day01; use crate::day02::Day02; use crate::day03::Day03; use crate::day04::Day04; use crate::day05::Day05; use crate::day06::Day06; use crate::day07::Day07; use crate::day::Day; mod day; mod day01; mod day02; mod day03; mod day04; mod day05; mod day06; mod day07; fn load_input(day: &str) -> String { read_to_string(format!("./input/day{}", day)).expect("Could not load input") } fn run_day(days: &[Box], day: usize) { if let Some(d) = days.get(day - 1) { let day_code = d; 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"))), Box::new(Day03::init(load_input("03"))), Box::new(Day04::init(load_input("04"))), Box::new(Day05::init(load_input("05"))), Box::new(Day06::init(load_input("06"))), Box::new(Day07::init(load_input("07")))]; let _verbosity = matches.occurrences_of("v"); if matches.is_present("all") { let l = days.len(); println!("running {} days!", l); for v in 1..=l { 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); } } else { let v = chrono::Local::now(); if v.month() != 12 { println!("This was really only meant to be used in december..."); } run_day(&days, v.day() as usize); } }