@@ -3,9 +3,12 @@ use crate::utils::year::Year;
33use clap:: { Parser , Subcommand } ;
44use std:: fmt:: { Display , Formatter } ;
55use std:: time:: { Duration , Instant } ;
6+ use aoc_client:: { AocClient } ;
7+ use dotenv:: dotenv;
68use utils:: day_number:: DayNumber ;
79use utils:: file_system:: { read_input, read_output} ;
810use utils:: year:: Year :: Year2023 ;
11+ use crate :: utils:: file_system:: write_input;
912
1013mod solutions;
1114mod utils;
@@ -24,8 +27,12 @@ struct Args {
2427
2528#[ derive( Subcommand , Debug ) ]
2629enum Command {
30+ /// Run solver for given puzzle
2731 #[ clap( short_flag = 's' ) ]
2832 Solve ,
33+ /// Downloads and saves input for given puzzle
34+ #[ clap( short_flag = 'i' ) ]
35+ Input ,
2936}
3037
3138fn parse_day ( s : & str ) -> Result < u8 , String > {
@@ -37,6 +44,8 @@ fn parse_day(s: &str) -> Result<u8, String> {
3744}
3845
3946fn main ( ) {
47+ dotenv ( ) . ok ( ) ;
48+
4049 let cli = Args :: parse ( ) ;
4150 let command = cli. command . unwrap_or ( Command :: Solve ) ;
4251 let day = cli. day . unwrap_or ( 1 ) ;
@@ -48,20 +57,26 @@ fn main() {
4857
4958 match command {
5059 Command :: Solve => solve ( & day_number, year) ,
60+ Command :: Input => download_input ( day_number, year) ,
5161 }
5262}
5363
5464fn solve ( day_number : & DayNumber , year : Year ) {
5565 let solution = solution ( & day_number, year. clone ( ) ) ;
5666
57- let input = read_input ( day_number. to_string ( ) . as_str ( ) , year. clone ( ) ) ;
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+
5872 let output = read_output ( day_number. to_string ( ) . as_str ( ) , year) ;
5973
6074 let expected: Vec < String > = output
6175 . unwrap_or ( String :: from ( "" ) )
6276 . lines ( )
6377 . map ( |s| s. to_string ( ) )
6478 . collect ( ) ;
79+
6580 let expected_part_one = expected. first ( ) ;
6681 let expected_part_two = expected. get ( 1 ) ;
6782
@@ -75,6 +90,30 @@ fn solve(day_number: &DayNumber, year: Year) {
7590 ) ;
7691}
7792
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+
78117fn run < ' a > (
79118 part : & str ,
80119 solve_fn : & ' a dyn Fn ( ) -> String ,
0 commit comments