pub mod error; pub mod days; mod input; use std::env; use day1::Day1; use day2::Day2; use day3::Day3; use day4::Day4; use day5::Day5; use day6::Day6; use day7::Day7; use day14::Day14; use crate::error::AdventError; use crate::days::*; struct DummyDay { } impl DummyDay { fn new() -> Self { Self{} } } impl AdventDay for DummyDay { fn puzzle1(&mut self) -> Result { Ok("0".to_string()) } fn puzzle2(&mut self) -> Result { Ok("0".to_string()) } } fn main() -> Result<(), AdventError> { let mut advent_days: Vec> = vec!( Box::new(Day1::new()), Box::new(Day2::new()), Box::new(Day3::new()), Box::new(Day4::new()), Box::new(Day5::new()), Box::new(Day6::new()), Box::new(Day7::new()), Box::new(DummyDay::new()), Box::new(DummyDay::new()), Box::new(DummyDay::new()), Box::new(DummyDay::new()), Box::new(DummyDay::new()), Box::new(DummyDay::new()), Box::new(Day14::new()), ); if env::args().len() == 1 { Ok(advent_days.into_iter().map(|mut day| { let one_result = day.puzzle1()?; let two_result = day.puzzle2()?; Ok((one_result, two_result)) }).enumerate().map(|(index, r): (usize, Result<(String, String), AdventError>)| { match r { Ok((res1, res2)) => println!("{}: ({}, {})", index + 1, res1, res2), Err(e) => println!("Error: {}", e.0) }; }).fold((), |acc, _| { acc })) } else { let day_index = env::args().nth(1).ok_or(AdventError("Failed to parse day".into()))?.parse::()? - 1; let day = &mut advent_days[day_index]; if env::args().len() == 3 { match env::args().nth(2).unwrap().parse::()? { 1 => Ok(println!("1: {}", &day.puzzle1()?)), 2 => Ok(println!("2: {}", &day.puzzle2()?)), _ => return Err(AdventError("part must be either 1 or 2".into())) } } else { Ok(println!("{}: ({}, {})", day_index + 1, day.puzzle1()?, day.puzzle2()?)) } } }