main.rs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. extern crate getopts;
  2. use getopts::Options;
  3. use std::env;
  4. use std::error::Error;
  5. use std::fs::File;
  6. use std::io::prelude::*;
  7. use std::path::Path;
  8. use std::process::exit;
  9. mod day1;
  10. mod day2;
  11. fn main() {
  12. let args: Vec<String> = env::args().collect();
  13. parse_opt( &args );
  14. }
  15. fn parse_opt( args: &Vec<String> ) {
  16. let mut options = Options::new();
  17. options.optopt( "d", "day", "specify the day number", "<day_number>" );
  18. options.optopt( "i", "input", "specify an input file", "<file_name>" );
  19. options.optflag( "h", "help", "print this help menu" );
  20. let matches = match options.parse( &args[1..] ) {
  21. Ok ( m ) => { m },
  22. Err( f ) => {
  23. println!( "{}", f.to_string() );
  24. exit( 1 );
  25. },
  26. };
  27. if matches.opt_present( "h" ) {
  28. print_usage( &args[0], options );
  29. exit( 0 );
  30. }
  31. let input_file = matches.opt_str( "i" );
  32. let input = match input_file {
  33. Some( x ) => { read_input( &x ) },
  34. None => {
  35. println!( "No input file specified!" );
  36. exit( 1 );
  37. },
  38. };
  39. let day = matches.opt_str( "d" );
  40. match day {
  41. Some( x ) => {
  42. match x.as_ref() {
  43. "1" => day1::main( &input ),
  44. "2" => day2::main( &input ),
  45. _ => {
  46. println!( "Unknown day number {}", x );
  47. exit( 1 );
  48. },
  49. }
  50. },
  51. None => {
  52. println!( "No day specified!" );
  53. exit( 1 );
  54. },
  55. }
  56. }
  57. fn print_usage( prog_name: &str, options: Options ) {
  58. let brief = format!( "Usage: {} -d <day_number> -i <input_file> [-h]", prog_name );
  59. print!( "{}", options.usage( &brief ) );
  60. }
  61. fn read_input( input: &str ) -> String {
  62. let path = Path::new( input );
  63. let mut file = match File::open( &path ) {
  64. Ok ( f ) => { f },
  65. Err( f ) => {
  66. println!( "Error opening file {}: {}", path.display(), f.description() );
  67. exit( 1 );
  68. },
  69. };
  70. let mut data = String::new();
  71. match file.read_to_string( &mut data ) {
  72. Ok ( _ ) => { }
  73. Err( f ) => {
  74. println!( "Error reading from file {}: {}", path.display(), f.description() );
  75. },
  76. }
  77. data
  78. }