diff options
Diffstat (limited to '2018/src/main.rs')
-rw-r--r-- | 2018/src/main.rs | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/2018/src/main.rs b/2018/src/main.rs new file mode 100644 index 0000000..7e683ca --- /dev/null +++ b/2018/src/main.rs @@ -0,0 +1,78 @@ +extern crate argparse; + +use std::io; +use std::io::{BufRead, BufReader, Error, ErrorKind}; +use std::fs::File; +use std::process::exit; +use argparse::{ArgumentParser, StoreTrue, Store}; + +mod day1; + +fn day_switch<T: BufRead>(day: i32, reader: T) -> io::Result<()> { + match day { + 1 => day1::main(reader), + _ => Err(Error::new(ErrorKind::Other, "Invalid day")) + } +} + +struct Options { + use_stdin: bool, +} + +fn run_day(day: i32, opts: &Options) -> io::Result<()> { + if opts.use_stdin { + let stdin = io::stdin(); + day_switch(day, BufReader::new(stdin)) + } else { + match File::open(format!("../input/{}.txt", day)) { + Ok(f) => day_switch(day, BufReader::new(f)), + Err(_) => Err(Error::new(ErrorKind::Other, format!("No input file for day {}", day))) + } + } +} + +fn error_handler<F>(func: F) -> io::Result<()> + where F: Fn() -> io::Result<()> { + + match func() { + Ok(()) => Ok(()), + Err(err) => { + if err.kind() == ErrorKind::Other { + println!("Error: {}", err); + exit(1) + } else { + Err(err) + } + } + } +} + +fn main() -> io::Result<()> { + let mut day_string = String::new(); + let mut options = Options { + use_stdin: false + }; + + { + let mut parser = ArgumentParser::new(); + parser.set_description("AOC 2018 solutions by Tom Smeding"); + parser.refer(&mut options.use_stdin) + .add_option(&["-s", "--stdin"], StoreTrue, + "Read from stdin"); + parser.refer(&mut day_string) + .add_argument("day", Store, "Day to execute"); + parser.parse_args_or_exit(); + } + + error_handler(|| + match day_string.parse::<i32>() { + Ok(day) => run_day(day, &options), + Err(_) => { + for day in 1..1 { + run_day(day, &options)?; + } + Ok(()) + } + } + ) +} |