pub mod input; pub mod error; pub mod days; use days::*; use std::env; use crate::error::AdventError; fn main() -> Result<(), AdventError> { let days = vec![ (day1::one as fn() -> Result, day1::two as fn() -> Result), (day2::one as fn() -> Result, day2::two as fn() -> Result), (day3::one as fn() -> Result, day3::two as fn() -> Result), (day4::one as fn() -> Result, day4::two as fn() -> Result), ]; if env::args().len() != 3 { Ok(days.into_iter().map(|(one, two)| { let one_result = one()?; let two_result = two()?; Ok((one_result, two_result)) }).map(|r: Result<(u32, u32), AdventError>| { match r { Ok((res1, res2)) => println!("1: {} 2: {}", res1, res2), Err(e) => println!("Error: {}", e.0) }; }).fold((), |acc, _| { acc })) } else { let (one, two) = days[env::args().nth(1).ok_or(AdventError("Failed to parse day".into()))?.parse::()? - 1]; match env::args().nth(2).unwrap().parse::()? { 1 => Ok(println!("1: {}", one()?)), 2 => Ok(println!("2: {}", two()?)), _ => return Err(AdventError("part must be either 1 or 2".into())) } } }