Skip to content

Commit 902fc7e

Browse files
committed
feat: input-sync command
1 parent 1f140f6 commit 902fc7e

File tree

5 files changed

+78
-13
lines changed

5 files changed

+78
-13
lines changed

src/main.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use advent_of_code::template::commands::{all, download, read, scaffold, solve, time};
1+
use advent_of_code::template::commands::{all, download, input_sync, read, scaffold, solve, time};
22
use args::{parse, AppArguments};
33

44
#[cfg(feature = "today")]
@@ -36,6 +36,9 @@ mod args {
3636
day: Option<Day>,
3737
store: bool,
3838
},
39+
InputSync {
40+
replace: bool,
41+
},
3942
#[cfg(feature = "today")]
4043
Today,
4144
}
@@ -74,6 +77,9 @@ mod args {
7477
submit: args.opt_value_from_str("--submit")?,
7578
dhat: args.contains("--dhat"),
7679
},
80+
Some("input-sync") => AppArguments::InputSync {
81+
replace: args.contains("--replace"),
82+
},
7783
#[cfg(feature = "today")]
7884
Some("today") => AppArguments::Today,
7985
Some(x) => {
@@ -122,6 +128,7 @@ fn main() {
122128
dhat,
123129
submit,
124130
} => solve::handle(day, release, dhat, submit),
131+
AppArguments::InputSync { replace } => input_sync::handle(replace),
125132
#[cfg(feature = "today")]
126133
AppArguments::Today => {
127134
match Day::today() {

src/template/aoc_cli.rs

+44-11
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,41 @@ pub enum AocCommandError {
1313
BadExitStatus(Output),
1414
}
1515

16+
pub enum DownloadMode {
17+
InputOnly,
18+
PuzzleOnly,
19+
InputAndPuzzle,
20+
}
21+
22+
impl DownloadMode {
23+
fn modify_args(&self, input_path: &str, puzzle_path: &str) -> Vec<String> {
24+
let mut args = vec!["--overwrite".into()];
25+
match self {
26+
DownloadMode::InputOnly => {
27+
args.extend(["--input-only", "--input-file", input_path].iter().map(|s| s.to_string()));
28+
}
29+
DownloadMode::PuzzleOnly => {
30+
args.extend(["--puzzle-only", "--puzzle-file", puzzle_path].iter().map(|s| s.to_string()));
31+
}
32+
DownloadMode::InputAndPuzzle => {
33+
args.extend([
34+
"--input-file", input_path,
35+
"--puzzle-file", puzzle_path
36+
].iter().map(|s| s.to_string()));
37+
}
38+
}
39+
args
40+
}
41+
42+
fn downloads_input(&self) -> bool {
43+
matches!(self, DownloadMode::InputOnly | DownloadMode::InputAndPuzzle)
44+
}
45+
46+
fn downloads_puzzle(&self) -> bool {
47+
matches!(self, DownloadMode::PuzzleOnly | DownloadMode::InputAndPuzzle)
48+
}
49+
}
50+
1651
impl Display for AocCommandError {
1752
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1853
match self {
@@ -49,26 +84,24 @@ pub fn read(day: Day) -> Result<Output, AocCommandError> {
4984
call_aoc_cli(&args)
5085
}
5186

52-
pub fn download(day: Day) -> Result<Output, AocCommandError> {
87+
pub fn download(day: Day, download_variants: DownloadMode) -> Result<Output, AocCommandError> {
5388
let input_path = get_input_path(day);
5489
let puzzle_path = get_puzzle_path(day);
5590

56-
let args = build_args(
91+
let args = &build_args(
5792
"download",
58-
&[
59-
"--overwrite".into(),
60-
"--input-file".into(),
61-
input_path.to_string(),
62-
"--puzzle-file".into(),
63-
puzzle_path.to_string(),
64-
],
93+
&download_variants.modify_args(&input_path, &puzzle_path)[..],
6594
day,
6695
);
6796

6897
let output = call_aoc_cli(&args)?;
6998
println!("---");
70-
println!("🎄 Successfully wrote input to \"{}\".", &input_path);
71-
println!("🎄 Successfully wrote puzzle to \"{}\".", &puzzle_path);
99+
if download_variants.downloads_input() {
100+
println!("🎄 Successfully wrote input to \"{}\".", &input_path);
101+
}
102+
if download_variants.downloads_puzzle() {
103+
println!("🎄 Successfully wrote puzzle to \"{}\".", &puzzle_path);
104+
}
72105
Ok(output)
73106
}
74107

src/template/commands/download.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
use crate::template::{aoc_cli, Day};
22
use std::process;
3+
use crate::template::aoc_cli::DownloadMode;
34

45
pub fn handle(day: Day) {
56
if aoc_cli::check().is_err() {
67
eprintln!("command \"aoc\" not found or not callable. Try running \"cargo install aoc-cli\" to install it.");
78
process::exit(1);
89
}
910

10-
if let Err(e) = aoc_cli::download(day) {
11+
if let Err(e) = aoc_cli::download(day, DownloadMode::InputAndPuzzle) {
1112
eprintln!("failed to call aoc-cli: {e}");
1213
process::exit(1);
1314
};

src/template/commands/input_sync.rs

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use std::fs::{exists};
2+
use crate::template::{all_days};
3+
use crate::template::aoc_cli::{download, DownloadMode};
4+
5+
pub fn handle(replace_existing: bool) {
6+
for day in all_days() {
7+
let input_path = format!("data/inputs/{day}.txt");
8+
let existence = exists(input_path);
9+
if existence.is_err() {
10+
eprintln!("Unable to check whether input already exists?");
11+
eprintln!("Hint: Check for listing permissions");
12+
eprintln!("Skipping day: {}", day);
13+
continue;
14+
}
15+
if !replace_existing && existence.unwrap() { return; }
16+
let result = download(day, DownloadMode::InputOnly);
17+
if result.is_err() {
18+
eprintln!("Unable to download input for day: {}", day);
19+
eprintln!("Halting further downloads!");
20+
return;
21+
}
22+
}
23+
}

src/template/commands/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ pub mod read;
44
pub mod scaffold;
55
pub mod solve;
66
pub mod time;
7+
pub mod input_sync;

0 commit comments

Comments
 (0)