From cf02721622e033303afe0b6330d45ffc5546ddd9 Mon Sep 17 00:00:00 2001 From: Nick Pegg Date: Tue, 29 Apr 2025 17:07:49 -0700 Subject: [PATCH] config loading --- Cargo.lock | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 2 ++ src/config.rs | 66 ++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 4 files changed, 162 insertions(+) create mode 100644 src/config.rs diff --git a/Cargo.lock b/Cargo.lock index 4a92349..575ca42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -110,6 +110,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + [[package]] name = "getrandom" version = "0.2.16" @@ -121,24 +127,62 @@ dependencies = [ "wasi", ] +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + [[package]] name = "libc" version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +[[package]] +name = "libyml" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3302702afa434ffa30847a83305f0a69d6abd74293b6554c18ec85c7ef30c980" +dependencies = [ + "anyhow", + "version_check", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + [[package]] name = "mktemp" version = "0.5.1" @@ -161,6 +205,8 @@ dependencies = [ "anyhow", "clap", "mktemp", + "serde", + "serde_yml", "thiserror", ] @@ -182,6 +228,47 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_yml" +version = "0.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59e2dd588bf1597a252c3b920e0143eb99b0f76e4e082f4c92ce34fbc9e71ddd" +dependencies = [ + "indexmap", + "itoa", + "libyml", + "memchr", + "ryu", + "serde", + "version_check", +] + [[package]] name = "strsim" version = "0.11.1" @@ -240,6 +327,12 @@ dependencies = [ "getrandom", ] +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index bb6f5b5..f035015 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,8 @@ edition = "2024" [dependencies] anyhow = "^1.0" clap = { version = "^4.5", features = ["derive"] } +serde = { version = "^1.0", features = ["derive"] } +serde_yml = "^0.0.12" thiserror = "^2.0" [dev-dependencies] diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..7bf7f9b --- /dev/null +++ b/src/config.rs @@ -0,0 +1,66 @@ +use serde::Deserialize; +use std::fs; +use std::path::PathBuf; + +#[derive(Deserialize, Debug, PartialEq)] +#[serde(default)] +struct Config { + thumbnail_size: (u32, u32), + view_size: (u32, u32), + output_dir: PathBuf, +} + +impl Config { + fn from_album(path: PathBuf) -> anyhow::Result { + let content = fs::read(path.join("photojawn.conf.yml"))?; + let cfg = serde_yml::from_slice(&content)?; + Ok(cfg) + } +} + +impl Default for Config { + fn default() -> Self { + Self { + thumbnail_size: (256, 256), + view_size: (1024, 768), + output_dir: PathBuf::from("site"), + } + } +} + +#[cfg(test)] +mod test { + use super::*; + use crate::skel::make_skeleton; + use mktemp::Temp; + + #[test] + fn test_default() { + let c = Config::default(); + assert_eq!(c.thumbnail_size, (256, 256)); + assert_eq!(c.output_dir, PathBuf::from("site")); + } + + #[test] + fn from_yaml() { + // Empty YAML gives full default values + let default_cfg = Config::default(); + let cfg: Config = serde_yml::from_str("").unwrap(); + assert_eq!(cfg, default_cfg); + + // Default values for any unspecified fields + let cfg: Config = serde_yml::from_str("thumbnail_size: [1, 1]").unwrap(); + assert_ne!(cfg, default_cfg); + assert_eq!(cfg.thumbnail_size, (1, 1)); + assert_eq!(cfg.view_size, default_cfg.view_size); + } + + #[test] + fn from_base_album() { + let tmpdir = Temp::new_dir().unwrap(); + make_skeleton(&tmpdir).unwrap(); + + let cfg = Config::from_album(tmpdir.to_path_buf()).unwrap(); + assert_eq!(cfg, Config::default()); + } +} diff --git a/src/lib.rs b/src/lib.rs index e8c41c1..5894719 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1 +1,2 @@ +pub mod config; pub mod skel;