feat!: decouple download and scaffold from main package into workspace
Added workspace structure to Cargo.toml. This way we don't need to build all dependencies for helper binaries. Also changed .cargo/config accordingly.
This commit is contained in:
		@@ -1,6 +1,4 @@
 | 
			
		||||
[alias]
 | 
			
		||||
scaffold = "run --bin scaffold --quiet --release --"
 | 
			
		||||
download = "run --bin download --quiet --release --"
 | 
			
		||||
download_all = "run --bin download_all --quiet --release --"
 | 
			
		||||
 | 
			
		||||
solve = "run --bin"
 | 
			
		||||
scaffold = "run -p scaffold --release --"
 | 
			
		||||
download = "run -p download --release --"
 | 
			
		||||
solve = "run --bin --release"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										32
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@@ -45,17 +45,11 @@ checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "aoc"
 | 
			
		||||
version = "29.0.0"
 | 
			
		||||
version = "30.0.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "dotenvy",
 | 
			
		||||
 "elves",
 | 
			
		||||
 "hashbrown 0.14.2",
 | 
			
		||||
 "hex-literal",
 | 
			
		||||
 "itertools 0.12.0",
 | 
			
		||||
 "lazy_static",
 | 
			
		||||
 "pico-args",
 | 
			
		||||
 "regex",
 | 
			
		||||
 "reqwest",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
@@ -137,6 +131,15 @@ version = "0.15.6"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "03d8c417d7a8cb362e0c37e5d815f5eb7c37f79ff93707329d5a194e42e54ca0"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "download"
 | 
			
		||||
version = "30.0.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "dotenvy",
 | 
			
		||||
 "pico-args",
 | 
			
		||||
 "reqwest",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "either"
 | 
			
		||||
version = "1.8.0"
 | 
			
		||||
@@ -309,12 +312,6 @@ dependencies = [
 | 
			
		||||
 "libc",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "hex-literal"
 | 
			
		||||
version = "0.4.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "http"
 | 
			
		||||
version = "0.2.8"
 | 
			
		||||
@@ -740,6 +737,15 @@ version = "1.0.12"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "scaffold"
 | 
			
		||||
version = "30.0.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "dotenvy",
 | 
			
		||||
 "pico-args",
 | 
			
		||||
 "reqwest",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "schannel"
 | 
			
		||||
version = "0.1.20"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										33
									
								
								Cargo.toml
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								Cargo.toml
									
									
									
									
									
								
							@@ -1,20 +1,31 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "aoc"
 | 
			
		||||
description.workspace = true
 | 
			
		||||
readme.workspace = true
 | 
			
		||||
version.workspace = true
 | 
			
		||||
edition.workspace = true
 | 
			
		||||
license.workspace = true
 | 
			
		||||
authors.workspace = true
 | 
			
		||||
repository.workspace = true
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
# many cool stuff for iterators
 | 
			
		||||
itertools = "0.12.0"
 | 
			
		||||
# faster hashing algorithms for hashmaps and hashsets
 | 
			
		||||
hashbrown = "0.14.2"
 | 
			
		||||
# my library with some sorters and parses
 | 
			
		||||
elves = "0.2.0"
 | 
			
		||||
 | 
			
		||||
[workspace]
 | 
			
		||||
 | 
			
		||||
members = ["utils/download", "utils/scaffold"]
 | 
			
		||||
 | 
			
		||||
[workspace.package]
 | 
			
		||||
description = "template for advent of code"
 | 
			
		||||
readme = "README.md"
 | 
			
		||||
version = "29.0.0"
 | 
			
		||||
version = "30.0.0"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
license = "MIT"
 | 
			
		||||
authors = ["Matej Janežič <janezic.mj@gmail.com>"]
 | 
			
		||||
repository = "https://github.com/janezicmatej/aoc-template.git"
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
dotenvy = "0.15.6"
 | 
			
		||||
elves = "0.2.0"
 | 
			
		||||
hashbrown = "0.14.2"
 | 
			
		||||
hex-literal = "0.4.1"
 | 
			
		||||
itertools = "0.12.0"
 | 
			
		||||
lazy_static = "1.4.0"
 | 
			
		||||
pico-args = "0.5.0"
 | 
			
		||||
regex = "1.10.2"
 | 
			
		||||
reqwest = { version = "0.11.22", features = ["blocking"] }
 | 
			
		||||
 
 | 
			
		||||
@@ -8,19 +8,18 @@
 | 
			
		||||
- `src/` :
 | 
			
		||||
    - `bin/`:
 | 
			
		||||
        - `<day>.rs`: solution files 
 | 
			
		||||
        - `*.rs`: convenience scripts
 | 
			
		||||
    - `inputs/`: this directory is gitignored, input files go here
 | 
			
		||||
    - `examples/`: example files go here; you can push this as test are run in ci
 | 
			
		||||
    - `utils/`: utils files go here
 | 
			
		||||
    - `lib.rs`: contains framework code
 | 
			
		||||
- `.env.example`: example dotenv file
 | 
			
		||||
- `utils/`: binary packages with convenience scripts structured using cargo workspaces
 | 
			
		||||
 | 
			
		||||
### Cli
 | 
			
		||||
- `cargo scaffold <day>`: prepare solution files for `day`
 | 
			
		||||
- `cargo download <day>`: download input file for `day`
 | 
			
		||||
- `cargo solve <day>`: run solution against input for `day`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### dotenv
 | 
			
		||||
 | 
			
		||||
set `YEAR` to whichever year you are solving for and `TOKEN` to AoC session Cookie
 | 
			
		||||
 
 | 
			
		||||
@@ -47,8 +47,3 @@ pub fn read_file(folder: &str, day: u8) -> String {
 | 
			
		||||
    let f = fs::read_to_string(filepath);
 | 
			
		||||
    f.expect("could not open input file").trim().to_string()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn parse_args() -> Result<u8, pico_args::Error> {
 | 
			
		||||
    let mut args = pico_args::Arguments::from_env();
 | 
			
		||||
    args.free_from_str()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								utils/download/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								utils/download/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "download"
 | 
			
		||||
description.workspace = true
 | 
			
		||||
readme.workspace = true
 | 
			
		||||
version.workspace = true
 | 
			
		||||
edition.workspace = true
 | 
			
		||||
license.workspace = true
 | 
			
		||||
authors.workspace = true
 | 
			
		||||
repository.workspace = true
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
reqwest = { version = "0.11.22", features = ["blocking"] }
 | 
			
		||||
dotenvy = "0.15.6"
 | 
			
		||||
pico-args = "0.5.0"
 | 
			
		||||
@@ -3,8 +3,13 @@ use reqwest::blocking::Client;
 | 
			
		||||
use reqwest::header;
 | 
			
		||||
use std::{env, fs::OpenOptions, io::Write, process};
 | 
			
		||||
 | 
			
		||||
pub fn parse_args() -> Result<u8, pico_args::Error> {
 | 
			
		||||
    let mut args = pico_args::Arguments::from_env();
 | 
			
		||||
    args.free_from_str()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn main() {
 | 
			
		||||
    let day: u8 = match aoc::parse_args() {
 | 
			
		||||
    let day: u8 = match parse_args() {
 | 
			
		||||
        Ok(day) => day,
 | 
			
		||||
        Err(_) => {
 | 
			
		||||
            eprintln!("Need to specify a day (as integer). example: `cargo download 7`");
 | 
			
		||||
							
								
								
									
										14
									
								
								utils/scaffold/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								utils/scaffold/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "scaffold"
 | 
			
		||||
description.workspace = true
 | 
			
		||||
readme.workspace = true
 | 
			
		||||
version.workspace = true
 | 
			
		||||
edition.workspace = true
 | 
			
		||||
license.workspace = true
 | 
			
		||||
authors.workspace = true
 | 
			
		||||
repository.workspace = true
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
reqwest = { version = "0.11.22", features = ["blocking"] }
 | 
			
		||||
dotenvy = "0.15.6"
 | 
			
		||||
pico-args = "0.5.0"
 | 
			
		||||
@@ -35,6 +35,11 @@ mod tests {
 | 
			
		||||
}
 | 
			
		||||
"#;
 | 
			
		||||
 | 
			
		||||
pub fn parse_args() -> Result<u8, pico_args::Error> {
 | 
			
		||||
    let mut args = pico_args::Arguments::from_env();
 | 
			
		||||
    args.free_from_str()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn safe_create_file(path: &str) -> Result<File, std::io::Error> {
 | 
			
		||||
    OpenOptions::new().write(true).create_new(true).open(path)
 | 
			
		||||
}
 | 
			
		||||
@@ -44,7 +49,7 @@ fn create_file(path: &str) -> Result<File, std::io::Error> {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn main() {
 | 
			
		||||
    let day = match aoc::parse_args() {
 | 
			
		||||
    let day = match parse_args() {
 | 
			
		||||
        Ok(day) => day,
 | 
			
		||||
        Err(_) => {
 | 
			
		||||
            eprintln!("Need to specify a day (as integer). example: `cargo scaffold 7`");
 | 
			
		||||
		Reference in New Issue
	
	Block a user