coliru

A minimal, flexible, dotfile installer
git clone https://git.ashermorgan.net/coliru/
Log | Files | Refs | README

commit 7b92123f283d2fd54d44caedd060caebd97b1d9b
parent f91aeb08f05a0ef43941864432878f8888893953
Author: Asher Morgan <59518073+ashermorgan@users.noreply.github.com>
Date:   Tue, 18 Jun 2024 11:23:44 -0700

Implement basic execute_manifest function

Diffstat:
Asrc/core.rs | 21+++++++++++++++++++++
Msrc/main.rs | 6+++++-
Msrc/manifest.rs | 10+++++-----
Msrc/tags.rs | 89++++++++++++++++++++++++++++++++++++++++---------------------------------------
4 files changed, 76 insertions(+), 50 deletions(-)

diff --git a/src/core.rs b/src/core.rs @@ -0,0 +1,21 @@ +use super::manifest; +use super::tags; + +/// Execute the steps in a coliru manifest according to a set of tag rules +pub fn execute_manifest(manifest: manifest::Manifest, rules: Vec<String>) { + for (i, step) in manifest.steps.iter().enumerate() { + if tags::tags_match(&rules, &step.tags) { + println!("Step {}:", i+1); + execute_copies(&step.copy); + } else { + println!("Step {}: skipped", i+1); + } + } +} + +/// Execute the copy commands specified in a coliru manifest step +fn execute_copies(copies: &[manifest::CopyOptions]) { + for copy in copies { + println!(" Copy {} to {}", copy.src.display(), copy.dst.display()); + } +} diff --git a/src/main.rs b/src/main.rs @@ -1,4 +1,5 @@ mod cli; +mod core; mod manifest; mod tags; @@ -6,5 +7,8 @@ use clap::Parser; fn main() { let args = cli::CLI::parse(); - println!("{:?}", args); + match manifest::parse_manifest_file(&std::path::Path::new(&args.manifest)) { + Ok(manifest) => core::execute_manifest(manifest, args.tag_rules), + Err(why) => eprintln!("Error: {}", why), + }; } diff --git a/src/manifest.rs b/src/manifest.rs @@ -5,19 +5,19 @@ use std::path::{Path, PathBuf}; #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct CopyOptions { - src: PathBuf, - dst: PathBuf, + pub src: PathBuf, + pub dst: PathBuf, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Step { - copy: Vec<CopyOptions>, - tags: Vec<String>, + pub copy: Vec<CopyOptions>, + pub tags: Vec<String>, } #[derive(Debug, PartialEq, Serialize, Deserialize)] pub struct Manifest { - steps: Vec<Step>, + pub steps: Vec<Step>, } /// Parse a coliru YAML manifest file diff --git a/src/tags.rs b/src/tags.rs @@ -7,13 +7,13 @@ /// match any list of tags. /// /// ``` -/// let rules = ["linux|macos", "system", "^work"]; -/// let tags_1 = ["macos", "system", "user"]; -/// let tags_2 = ["linux", "system", "work"]; +/// let rules = ["linux|macos", "system", "^work"].map(|x| x.to_string()); +/// let tags_1 = ["macos", "system", "user"].map(|x| x.to_string()); +/// let tags_2 = ["linux", "system", "work"].map(|x| x.to_string()); /// assert_eq!(tags_match(&rules, &tags_1), true); /// assert_eq!(tags_match(&rules, &tags_2), false); /// ``` -pub fn tags_match(rules: &[&str], tags: &[&str]) -> bool { +pub fn tags_match(rules: &[String], tags: &[String]) -> bool { for rule in rules.iter() { let is_negated = rule.chars().nth(0) == Some('^'); let _rule: &str; @@ -24,7 +24,7 @@ pub fn tags_match(rules: &[&str], tags: &[&str]) -> bool { } let tag_found = _rule.split("|").any(|subrule| { - tags.iter().any(|&tag| { + tags.iter().any(|tag| { tag == subrule }) }); @@ -43,15 +43,16 @@ mod tests { #[test] fn tags_match_empty_parameters() { + let tags_1 = ["linux", "user"].map(|x| x.to_string()); assert_eq!(tags_match(&[], &[]), true); - assert_eq!(tags_match(&[], &["linux", "user"]), true); - assert_eq!(tags_match(&["linux", "user"], &[]), false); + assert_eq!(tags_match(&[], &tags_1), true); + assert_eq!(tags_match(&tags_1, &[]), false); } #[test] fn tags_match_one_match() { - let tags_1 = ["linux"]; - let tags_2 = ["linux", "windows"]; + let tags_1 = ["linux"].map(|x| x.to_string()); + let tags_2 = ["linux", "windows"].map(|x| x.to_string()); assert_eq!(tags_match(&tags_1.clone(), &tags_1.clone()), true); assert_eq!(tags_match(&tags_1.clone(), &tags_2.clone()), true); @@ -61,8 +62,8 @@ mod tests { #[test] fn tags_match_two_matches() { - let tags_1 = ["linux", "user"]; - let tags_2 = ["linux", "user", "windows"]; + let tags_1 = ["linux", "user"].map(|x| x.to_string()); + let tags_2 = ["linux", "user", "windows"].map(|x| x.to_string()); assert_eq!(tags_match(&tags_1.clone(), &tags_1.clone()), true); assert_eq!(tags_match(&tags_1.clone(), &tags_2.clone()), true); @@ -72,11 +73,11 @@ mod tests { #[test] fn tags_match_negated() { - let rules = ["^linux"]; - let tags_1 = ["linux"]; - let tags_2 = ["windows"]; - let tags_3 = ["macos"]; - let tags_4 = ["linux", "macos"]; + let rules = ["^linux"].map(|x| x.to_string()); + let tags_1 = ["linux"].map(|x| x.to_string()); + let tags_2 = ["windows"].map(|x| x.to_string()); + let tags_3 = ["macos"].map(|x| x.to_string()); + let tags_4 = ["linux", "macos"].map(|x| x.to_string()); assert_eq!(tags_match(&rules.clone(), &tags_1.clone()), false); assert_eq!(tags_match(&rules.clone(), &tags_2.clone()), true); @@ -86,12 +87,12 @@ mod tests { #[test] fn tags_match_negated_two_rules() { - let rules_1 = ["^linux", "^user"]; - let rules_2 = ["^linux", "user"]; - let tags_1 = ["linux", "system"]; - let tags_2 = ["windows", "user"]; - let tags_3 = ["macos", "system"]; - let tags_4 = ["linux", "macos", "user"]; + let rules_1 = ["^linux", "^user"].map(|x| x.to_string()); + let rules_2 = ["^linux", "user"].map(|x| x.to_string()); + let tags_1 = ["linux", "system"].map(|x| x.to_string()); + let tags_2 = ["windows", "user"].map(|x| x.to_string()); + let tags_3 = ["macos", "system"].map(|x| x.to_string()); + let tags_4 = ["linux", "macos", "user"].map(|x| x.to_string()); assert_eq!(tags_match(&rules_1.clone(), &tags_1.clone()), false); assert_eq!(tags_match(&rules_1.clone(), &tags_2.clone()), false); @@ -105,11 +106,11 @@ mod tests { #[test] fn tags_match_union() { - let rules = ["linux|macos"]; - let tags_1 = ["linux"]; - let tags_2 = ["macos"]; - let tags_3 = ["linux", "macos"]; - let tags_4 = ["windows"]; + let rules = ["linux|macos"].map(|x| x.to_string()); + let tags_1 = ["linux"].map(|x| x.to_string()); + let tags_2 = ["macos"].map(|x| x.to_string()); + let tags_3 = ["linux", "macos"].map(|x| x.to_string()); + let tags_4 = ["windows"].map(|x| x.to_string()); assert_eq!(tags_match(&rules.clone(), &tags_1.clone()), true); assert_eq!(tags_match(&rules.clone(), &tags_2.clone()), true); @@ -119,12 +120,12 @@ mod tests { #[test] fn tags_match_union_two_rules() { - let rules_1 = ["linux|macos", "user|system"]; - let rules_2 = ["linux|macos", "user"]; - let tags_1 = ["user", "linux"]; - let tags_2 = ["system", "macos"]; - let tags_3 = ["user", "linux", "macos"]; - let tags_4 = ["system", "windows"]; + let rules_1 = ["linux|macos", "user|system"].map(|x| x.to_string()); + let rules_2 = ["linux|macos", "user"].map(|x| x.to_string()); + let tags_1 = ["user", "linux"].map(|x| x.to_string()); + let tags_2 = ["system", "macos"].map(|x| x.to_string()); + let tags_3 = ["user", "linux", "macos"].map(|x| x.to_string()); + let tags_4 = ["system", "windows"].map(|x| x.to_string()); assert_eq!(tags_match(&rules_1.clone(), &tags_1.clone()), true); assert_eq!(tags_match(&rules_1.clone(), &tags_2.clone()), true); @@ -138,11 +139,11 @@ mod tests { #[test] fn tags_match_union_negated() { - let rules = ["^linux|macos"]; - let tags_1 = ["linux"]; - let tags_2 = ["macos"]; - let tags_3 = ["linux", "macos"]; - let tags_4 = ["windows"]; + let rules = ["^linux|macos"].map(|x| x.to_string()); + let tags_1 = ["linux"].map(|x| x.to_string()); + let tags_2 = ["macos"].map(|x| x.to_string()); + let tags_3 = ["linux", "macos"].map(|x| x.to_string()); + let tags_4 = ["windows"].map(|x| x.to_string()); assert_eq!(tags_match(&rules.clone(), &tags_1.clone()), false); assert_eq!(tags_match(&rules.clone(), &tags_2.clone()), false); @@ -152,12 +153,12 @@ mod tests { #[test] fn tags_match_union_negated_two_rules() { - let rules_1 = ["^linux|macos", "^user"]; - let rules_2 = ["^linux|macos", "user|system"]; - let rules_3 = ["^linux|macos", "user"]; - let tags_1 = ["linux", "macos", "system"]; - let tags_2 = ["windows", "user"]; - let tags_3 = ["windows", "system"]; + let rules_1 = ["^linux|macos", "^user"].map(|x| x.to_string()); + let rules_2 = ["^linux|macos", "user|system"].map(|x| x.to_string()); + let rules_3 = ["^linux|macos", "user"].map(|x| x.to_string()); + let tags_1 = ["linux", "macos", "system"].map(|x| x.to_string()); + let tags_2 = ["windows", "user"].map(|x| x.to_string()); + let tags_3 = ["windows", "system"].map(|x| x.to_string()); assert_eq!(tags_match(&rules_1.clone(), &tags_1.clone()), false); assert_eq!(tags_match(&rules_1.clone(), &tags_2.clone()), false);