2021-12-01 17:07:17 +01:00
|
|
|
use std::fs::read_to_string;
|
|
|
|
use chrono::Datelike;
|
2021-12-01 20:53:49 +01:00
|
|
|
use clap::{App, Arg};
|
|
|
|
use crate::day01::Day01;
|
2021-12-02 08:50:56 +01:00
|
|
|
use crate::day02::Day02;
|
2021-12-01 17:07:17 +01:00
|
|
|
use crate::day::Day;
|
|
|
|
|
|
|
|
mod day;
|
2021-12-01 20:53:49 +01:00
|
|
|
mod day01;
|
2021-12-02 08:50:56 +01:00
|
|
|
mod day02;
|
2021-12-01 17:07:17 +01:00
|
|
|
|
|
|
|
fn load_input(day: &str) -> String {
|
|
|
|
read_to_string(format!("./input/day{}", day)).expect("Could not load input")
|
|
|
|
}
|
|
|
|
|
|
|
|
fn run_day(days: &Vec<Box<dyn Day>>, 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();
|
|
|
|
|
2021-12-02 08:50:56 +01:00
|
|
|
let days: Vec<Box<dyn Day>> = vec![Box::new(Day01::init(load_input("01"))), Box::new(Day02::init(load_input("02")))];
|
2021-12-01 17:07:17 +01:00
|
|
|
|
2021-12-01 20:53:49 +01:00
|
|
|
let _verbosity = matches.occurrences_of("v");
|
2021-12-01 17:07:17 +01:00
|
|
|
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::<i32>().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)
|
|
|
|
}
|
|
|
|
}
|