diff --git a/Cargo.lock b/Cargo.lock index 4821047..66a8cdf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -189,6 +189,7 @@ dependencies = [ "cazan-common", "cprint", "crossterm", + "glob", "image 0.25.1", "open", "plotters", @@ -654,6 +655,12 @@ dependencies = [ "weezl", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "half" version = "2.4.1" diff --git a/Cargo.toml b/Cargo.toml index 963f36f..92c39e2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,4 +19,5 @@ serde = { version = "1.0.203", features = ["derive"] } semver = { version = "1.0.23", features = ["serde"] } sha2 = "0.10.8" plotters = "0.3.6" -open = "5.2.0" \ No newline at end of file +open = "5.2.0" +glob = "0.3.1" \ No newline at end of file diff --git a/src/cli/init.rs b/src/cli/init.rs index 7404c7a..c7162ea 100644 --- a/src/cli/init.rs +++ b/src/cli/init.rs @@ -27,6 +27,7 @@ impl SubCommandTrait for Init { authors: Vec::new(), use_autoplay_for_multimedia: None, rdp_epsilon: None, + assets: Some(vec![]), plugins: Some(vec![]), }; diff --git a/src/cli/prebuild.rs b/src/cli/prebuild.rs index 4b72156..992e830 100644 --- a/src/cli/prebuild.rs +++ b/src/cli/prebuild.rs @@ -18,6 +18,7 @@ use cazan_common::{image::ImageEdgesParser, triangulation::triangulate}; use argh::FromArgs; use cprint::{ceprintln, cformat, cprintln}; +use glob::glob; use image::GenericImageView; use plotters::prelude::*; use serde_json::{json, Value}; @@ -31,8 +32,12 @@ const DEFAULT_EPSILON: f64 = 3.0; description = "pre-build the assets of your project" )] pub struct PreBuild { - #[argh(option, short = 'a', description = "asset directories")] - pub asset_dirs: Vec, + #[argh( + option, + short = 'a', + description = "the assets of your project (ex: assets/sprite-*.png" + )] + pub assets: Vec, #[argh( option, @@ -55,20 +60,6 @@ pub struct PreBuild { pub open: bool, } -fn read_dir_recursive(dir: &std::path::Path) -> Vec { - let mut files = Vec::new(); - for entry in fs::read_dir(dir).unwrap() { - let entry = entry.unwrap(); - let path = entry.path(); - if path.is_dir() { - files.extend(read_dir_recursive(&path)); - } else { - files.push(path); - } - } - files -} - impl SubCommandTrait for PreBuild { fn run(&self) -> ExitCode { if self.open && !self.preview { @@ -92,18 +83,23 @@ impl SubCommandTrait for PreBuild { cprintln!("Warning lock file is not up-to-date with cazan.json. To update it use `cazan lock`" => Yellow); } - let files = self - .asset_dirs - .iter() - .flat_map(|dir| read_dir_recursive(dir.as_ref())) - .collect::>(); + let assets = if self.assets.is_empty() { + config.assets.unwrap_or_default() + } else { + self.assets.iter().map(|s| s.as_str()).collect() + }; - let files: Vec = files + let files: Vec = assets .iter() + .flat_map(|pattern| glob(pattern).expect("Failed to read pattern")) + .map(|entry| entry.unwrap_or_else(|_| PathBuf::new())) .filter(|file| file.extension().map_or(false, |ext| ext == "png")) - .cloned() .collect(); + if files.is_empty() { + return ExitCode::SUCCESS; + } + let mut map = serde_json::Map::::new(); let terminal: Arc> = Arc::new(Mutex::new(SubTerminal::new(files.len() as u16))); diff --git a/src/config.rs b/src/config.rs index b189e87..be64064 100644 --- a/src/config.rs +++ b/src/config.rs @@ -15,6 +15,7 @@ pub struct Config<'a> { pub use_autoplay_for_multimedia: Option, #[serde(skip_serializing_if = "Option::is_none")] pub rdp_epsilon: Option, + pub assets: Option>, pub plugins: Option>>, }