use std::env; pub type Result = std::result::Result>; #[macro_export] macro_rules! err { ($($string:expr),+) => (Box::::from(format!($($string),+))) } pub type DayFunc = fn() -> Result; pub fn run(days: &[DayFunc]) -> Result<()> { let mut args = env::args(); args.next(); match args.next() { Some(arg) => { let day: usize = arg.parse().expect("Please provide a day number"); let res = days[day - 1]().or_else(|e| Err(err!("error running day specified: {}", e)))?; println!("{}", res); } None => { for (i, day) in days.iter().enumerate() { let i = i + 1; println!("day{}: ", i); let res = day().or_else(|e| Err(err!("error running day {}: {}", i, e)))?; println!("{}", res); } } } Ok(()) }