@@ -6,7 +6,7 @@ use std::error::Error;
66use std:: num:: NonZeroUsize ;
77use std:: path:: PathBuf ;
88use std:: { fs, io} ;
9- use utils:: date:: { Day , Year } ;
9+ use utils:: date:: { Date , Day , Year } ;
1010use utils:: multiversion:: { VERSIONS , Version } ;
1111
1212#[ derive( Debug , Default ) ]
@@ -18,7 +18,7 @@ pub struct Arguments {
1818 pub inputs_dir : Option < PathBuf > ,
1919 mode : Option < MainFn > ,
2020 pub year : Option < Year > ,
21- pub day : Option < Day > ,
21+ pub date : Option < Date > ,
2222 pub extra_args : VecDeque < String > ,
2323}
2424
@@ -87,16 +87,20 @@ impl Arguments {
8787 }
8888
8989 if let Some ( year) = args. pop_front ( ) {
90- result . year = match year. parse ( ) {
91- Ok ( y ) => Some ( y ) ,
92- Err ( err) => return Err ( UsageError :: InvalidArguments ( err. into ( ) ) ) ,
93- } ;
90+ let year = year
91+ . parse :: < Year > ( )
92+ . map_err ( | err| UsageError :: InvalidArguments ( err. into ( ) ) ) ? ;
93+ result . year = Some ( year ) ;
9494
9595 if let Some ( day) = args. pop_front ( ) {
96- result. day = match day. parse ( ) {
97- Ok ( y) => Some ( y) ,
98- Err ( err) => return Err ( UsageError :: InvalidArguments ( err. into ( ) ) ) ,
99- } ;
96+ let day = day
97+ . parse :: < Day > ( )
98+ . map_err ( |err| UsageError :: InvalidArguments ( err. into ( ) ) ) ?;
99+
100+ result. date = Some (
101+ Date :: try_from ( ( year, day) )
102+ . map_err ( |err| UsageError :: InvalidArguments ( err. into ( ) ) ) ?,
103+ ) ;
100104
101105 if !args. is_empty ( ) {
102106 return Err ( UsageError :: TooManyArguments ) ;
@@ -221,12 +225,22 @@ Options:
221225 self . mode . unwrap_or ( mode:: default:: main)
222226 }
223227
224- pub fn matching_puzzles ( & self ) -> Vec < ( Year , Day , PuzzleFn ) > {
225- PUZZLES
226- . iter ( )
227- . copied ( )
228- . filter ( |& ( y, d, ..) | self . year . unwrap_or ( y) == y && self . day . unwrap_or ( d) == d)
229- . collect ( )
228+ pub fn matching_puzzles ( & self ) -> Vec < ( Date , PuzzleFn ) > {
229+ if let Some ( date) = self . date {
230+ PUZZLES
231+ . iter ( )
232+ . copied ( )
233+ . filter ( |& ( d, ..) | d == date)
234+ . collect ( )
235+ } else if let Some ( year) = self . year {
236+ PUZZLES
237+ . iter ( )
238+ . copied ( )
239+ . filter ( |& ( d, ..) | d. year ( ) == year)
240+ . collect ( )
241+ } else {
242+ PUZZLES . to_vec ( )
243+ }
230244 }
231245
232246 pub fn inputs_dir ( & self ) -> PathBuf {
@@ -235,10 +249,10 @@ Options:
235249 . unwrap_or_else ( || PathBuf :: from ( "./inputs" ) )
236250 }
237251
238- pub fn read_input ( & self , year : Year , day : Day ) -> Result < String , ( String , io:: Error ) > {
252+ pub fn read_input ( & self , date : Date ) -> Result < String , ( String , io:: Error ) > {
239253 let mut path = self . inputs_dir ( ) ;
240- path. push ( format ! ( "year{year :#}" ) ) ;
241- path. push ( format ! ( "day{day :#}.txt" ) ) ;
254+ path. push ( format ! ( "year{:#}" , date . year ( ) ) ) ;
255+ path. push ( format ! ( "day{:#}.txt" , date . day ( ) ) ) ;
242256 fs:: read_to_string ( & path) . map_err ( |err| ( path. to_string_lossy ( ) . to_string ( ) , err) )
243257 }
244258}
0 commit comments