coliru

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

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

Update tags_match function parameter types

Diffstat:
Msrc/tags.rs | 112++++++++++++++++++++++++++++++++++++++++----------------------------------------
1 file changed, 56 insertions(+), 56 deletions(-)

diff --git a/src/tags.rs b/src/tags.rs @@ -1,31 +1,30 @@ -/// Checks if a set of tags matches a set of rules +/// Checks if a list of tags matches a list of tag rules /// /// Rules and tags are both specified as strings. Each rule contains one or more -/// desired tags separated by `|`. A list of tags matches a set of rules if each -/// rule contains at least one tag that appears in the list of tags. The results -/// of rules prefixed with `^` will be negated. An empty list of rules will -/// match any list of tags. +/// desired tags separated by `|`. A list of tags matches a list of rules if +/// each rule contains at least one tag that appears in the list of tags. The +/// results of rules prefixed with `^` will be negated. Any list of tags will +/// match an empty list of tag rules. An empty list of tags will only match an +/// empty list of tag rules. /// /// ``` -/// 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()); +/// let rules = ["linux|macos", "system", "^work"]; +/// let tags_1 = ["macos", "system", "user"]; +/// let tags_2 = ["linux", "system", "work"]; /// assert_eq!(tags_match(&rules, &tags_1), true); /// assert_eq!(tags_match(&rules, &tags_2), false); /// ``` -pub fn tags_match(rules: &[String], tags: &[String]) -> bool { +pub fn tags_match<S: AsRef<str>>(rules: &[S], tags: &[S]) -> bool { for rule in rules.iter() { - let is_negated = rule.chars().nth(0) == Some('^'); - let _rule: &str; + let mut _rule = rule.as_ref(); + let is_negated = _rule.chars().nth(0) == Some('^'); if is_negated { - _rule = &rule[1..]; // Strip leading '^' - } else { - _rule = &rule; + _rule = &_rule[1..]; // Strip leading '^' } let tag_found = _rule.split("|").any(|subrule| { tags.iter().any(|tag| { - tag == subrule + tag.as_ref() == subrule }) }); @@ -43,16 +42,17 @@ 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(&[], &tags_1), true); - assert_eq!(tags_match(&tags_1, &[]), false); + let tags_1 = []; + let tags_2 = ["linux", "user"]; + assert_eq!(tags_match(&tags_1, &tags_1), true); + assert_eq!(tags_match(&tags_1, &tags_2), true); + assert_eq!(tags_match(&tags_2, &tags_1), false); } #[test] fn tags_match_one_match() { - let tags_1 = ["linux"].map(|x| x.to_string()); - let tags_2 = ["linux", "windows"].map(|x| x.to_string()); + let tags_1 = ["linux"]; + let tags_2 = ["linux", "windows"]; assert_eq!(tags_match(&tags_1.clone(), &tags_1.clone()), true); assert_eq!(tags_match(&tags_1.clone(), &tags_2.clone()), true); @@ -62,8 +62,8 @@ mod tests { #[test] fn tags_match_two_matches() { - let tags_1 = ["linux", "user"].map(|x| x.to_string()); - let tags_2 = ["linux", "user", "windows"].map(|x| x.to_string()); + let tags_1 = ["linux", "user"]; + let tags_2 = ["linux", "user", "windows"]; assert_eq!(tags_match(&tags_1.clone(), &tags_1.clone()), true); assert_eq!(tags_match(&tags_1.clone(), &tags_2.clone()), true); @@ -73,11 +73,11 @@ mod tests { #[test] fn tags_match_negated() { - 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()); + let rules = ["^linux"]; + let tags_1 = ["linux"]; + let tags_2 = ["windows"]; + let tags_3 = ["macos"]; + let tags_4 = ["linux", "macos"]; assert_eq!(tags_match(&rules.clone(), &tags_1.clone()), false); assert_eq!(tags_match(&rules.clone(), &tags_2.clone()), true); @@ -87,12 +87,12 @@ mod tests { #[test] fn tags_match_negated_two_rules() { - 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()); + 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"]; assert_eq!(tags_match(&rules_1.clone(), &tags_1.clone()), false); assert_eq!(tags_match(&rules_1.clone(), &tags_2.clone()), false); @@ -106,11 +106,11 @@ mod tests { #[test] fn tags_match_union() { - 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()); + let rules = ["linux|macos"]; + let tags_1 = ["linux"]; + let tags_2 = ["macos"]; + let tags_3 = ["linux", "macos"]; + let tags_4 = ["windows"]; assert_eq!(tags_match(&rules.clone(), &tags_1.clone()), true); assert_eq!(tags_match(&rules.clone(), &tags_2.clone()), true); @@ -120,12 +120,12 @@ mod tests { #[test] fn tags_match_union_two_rules() { - 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()); + 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"]; assert_eq!(tags_match(&rules_1.clone(), &tags_1.clone()), true); assert_eq!(tags_match(&rules_1.clone(), &tags_2.clone()), true); @@ -139,11 +139,11 @@ mod tests { #[test] fn tags_match_union_negated() { - 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()); + let rules = ["^linux|macos"]; + let tags_1 = ["linux"]; + let tags_2 = ["macos"]; + let tags_3 = ["linux", "macos"]; + let tags_4 = ["windows"]; assert_eq!(tags_match(&rules.clone(), &tags_1.clone()), false); assert_eq!(tags_match(&rules.clone(), &tags_2.clone()), false); @@ -153,12 +153,12 @@ mod tests { #[test] fn tags_match_union_negated_two_rules() { - 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()); + 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"]; assert_eq!(tags_match(&rules_1.clone(), &tags_1.clone()), false); assert_eq!(tags_match(&rules_1.clone(), &tags_2.clone()), false);