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; use anyhow::Result; use crate::day08::Day08; use crate::day09::Day09; use crate::day10::Day10; use crate::day11::Day11; use crate::day12::Day12; use crate::day13::Day13; use crate::day14::Day14; use crate::day15::Day15; use crate::day16::Day16; use crate::day17::Day17; mod day; mod day01; mod day02; mod day03; mod day04; mod day05; mod day06; mod day07; mod day08; mod day09; mod day10; mod day11; mod day12; mod day13; mod day14; mod day15; mod day16; mod day17; fn load_input(day: &str) -> Result { read_to_string(format!("./input/day{}", day)).map_err(|x| x.into()) } fn run_day(days: &[Box], day: usize) -> Result<()> { 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); } Ok(()) } fn main() -> anyhow::Result<()> { 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")?)?), Box::new(Day08::init(load_input("08")?)?), Box::new(Day09::init(load_input("09")?)?), Box::new(Day10::init(load_input("10")?)?), Box::new(Day11::init(load_input("11")?)?), Box::new(Day12::init(load_input("12")?)?), Box::new(Day13::init(load_input("13")?)?), Box::new(Day14::init(load_input("14")?)?), Box::new(Day15::init(load_input("15")?)?), Box::new(Day16::init(load_input("16")?)?), Box::new(Day17::init(load_input("17")?)?),]; 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(str::parse); 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)?; } Ok(()) }