1- use crate :: solutions:: solution;
1+ use crate :: commands:: input:: download_input;
2+ use crate :: commands:: solve:: solve;
23use crate :: utils:: year:: Year ;
34use clap:: { Parser , Subcommand } ;
4- use std:: fmt:: { Display , Formatter } ;
5- use std:: time:: { Duration , Instant } ;
6- use aoc_client:: { AocClient } ;
75use dotenv:: dotenv;
86use utils:: day_number:: DayNumber ;
9- use utils:: file_system:: { read_input, read_output} ;
107use utils:: year:: Year :: Year2023 ;
11- use crate :: utils:: file_system:: write_input;
128
9+ mod commands;
1310mod solutions;
1411mod utils;
1512
1613#[ derive( Parser , Debug ) ]
1714#[ clap( author, version, about, long_about = None ) ]
18- struct Args {
15+ struct Cli {
1916 #[ command( subcommand) ]
2017 command : Option < Command > ,
2118 #[ clap( short, long) ]
@@ -46,7 +43,7 @@ fn parse_day(s: &str) -> Result<u8, String> {
4643fn main ( ) {
4744 dotenv ( ) . ok ( ) ;
4845
49- let cli = Args :: parse ( ) ;
46+ let cli = Cli :: parse ( ) ;
5047 let command = cli. command . unwrap_or ( Command :: Solve ) ;
5148 let day = cli. day . unwrap_or ( 1 ) ;
5249 let day_number: DayNumber = DayNumber :: try_from ( day. to_string ( ) ) . unwrap ( ) ;
@@ -60,102 +57,3 @@ fn main() {
6057 Command :: Input => download_input ( day_number, year) ,
6158 }
6259}
63-
64- fn solve ( day_number : & DayNumber , year : Year ) {
65- let solution = solution ( & day_number, year. clone ( ) ) ;
66-
67- let input = match read_input ( day_number. to_string ( ) . as_str ( ) , year. clone ( ) ) {
68- Ok ( val) => val,
69- Err ( _) => panic ! ( "Failed to read input. Download it first." ) , // todo better handle errors
70- } ;
71-
72- let output = read_output ( day_number. to_string ( ) . as_str ( ) , year) ;
73-
74- let expected: Vec < String > = output
75- . unwrap_or ( String :: from ( "" ) )
76- . lines ( )
77- . map ( |s| s. to_string ( ) )
78- . collect ( ) ;
79-
80- let expected_part_one = expected. first ( ) ;
81- let expected_part_two = expected. get ( 1 ) ;
82-
83- println ! (
84- "{}" ,
85- run( "one" , & || solution. part_one( & input) , expected_part_one)
86- ) ;
87- println ! (
88- "{}" ,
89- run( "two" , & || solution. part_two( & input) , expected_part_two)
90- ) ;
91- }
92-
93- fn download_input ( day_number : DayNumber , year : Year ) {
94- let input = read_input ( day_number. to_string ( ) . as_str ( ) , year. clone ( ) ) ;
95-
96- match input {
97- Ok ( _) => println ! ( "Input already exists." ) ,
98- Err ( _) => {
99- println ! ( "Downloading..." ) ;
100- let session = std:: env:: var ( "SESSION_COOKIE_ENV_VAR" ) . unwrap ( ) ;
101-
102- let client = AocClient :: builder ( )
103- . session_cookie ( session) . unwrap ( )
104- . year ( year. clone ( ) as i32 ) . unwrap ( )
105- . day ( u32:: from ( day_number) ) . unwrap ( )
106- . build ( ) . unwrap ( ) ;
107-
108- let input = client. get_input ( ) . unwrap ( ) ;
109-
110- write_input ( & day_number. to_string ( ) , year. clone ( ) , & input) . unwrap ( ) ;
111-
112- println ! ( "Input downloaded" ) ;
113- }
114- }
115- }
116-
117- fn run < ' a > (
118- part : & str ,
119- solve_fn : & ' a dyn Fn ( ) -> String ,
120- expected : Option < & ' a String > ,
121- ) -> SolutionResult < ' a > {
122- let start = Instant :: now ( ) ;
123- let current: String = solve_fn ( ) ;
124- let elapsed = start. elapsed ( ) ;
125-
126- SolutionResult {
127- part : part. to_string ( ) ,
128- expected,
129- current,
130- elapsed,
131- }
132- }
133-
134- struct SolutionResult < ' a > {
135- part : String ,
136- expected : Option < & ' a String > ,
137- current : String ,
138- elapsed : Duration ,
139- }
140-
141- impl Display for SolutionResult < ' _ > {
142- fn fmt ( & self , f : & mut Formatter < ' _ > ) -> std:: fmt:: Result {
143- let result = match self . expected {
144- None => "❔" ,
145- Some ( value) => {
146- if value == & self . current {
147- "✅"
148- } else {
149- "❌"
150- }
151- }
152- } ;
153- let elapsed_in_ms = self . elapsed . as_nanos ( ) as f64 / 1000.0 / 1000.0 ;
154-
155- write ! (
156- f,
157- "Part {}: {} ({:.3}ms) {}" ,
158- self . part, self . current, elapsed_in_ms, result
159- )
160- }
161- }
0 commit comments