pub(crate) fn matches_pattern(pattern: &str, target: &str) -> bool {
if !pattern.contains('%') {
return pattern == target;
}
let parts: Vec<&str> = pattern.split('%').collect();
if parts.len() != 2 {
return pattern == target;
}
let prefix = parts[0];
let suffix = parts[1];
if target.len() <= prefix.len() + suffix.len() {
return false;
}
target.starts_with(prefix) && target.ends_with(suffix)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_matches_pattern_exact() {
assert!(matches_pattern("foo.o", "foo.o"));
assert!(!matches_pattern("foo.o", "bar.o"));
}
#[test]
fn test_matches_pattern_wildcard_only() {
assert!(matches_pattern("%", "a"));
assert!(matches_pattern("%", "anything"));
assert!(!matches_pattern("%", "")); }
#[test]
fn test_matches_pattern_suffix() {
assert!(matches_pattern("%.o", "foo.o"));
assert!(matches_pattern("%.o", "bar.o"));
assert!(!matches_pattern("%.o", "foo.c"));
assert!(!matches_pattern("%.o", ".o")); }
#[test]
fn test_matches_pattern_prefix() {
assert!(matches_pattern("test_%", "test_foo"));
assert!(matches_pattern("test_%", "test_bar"));
assert!(!matches_pattern("test_%", "other_foo"));
assert!(!matches_pattern("test_%", "test_")); }
#[test]
fn test_matches_pattern_middle() {
assert!(matches_pattern("foo%bar", "fooBARbar"));
assert!(matches_pattern("foo%bar", "foo123bar"));
assert!(!matches_pattern("foo%bar", "foobar")); }
#[test]
fn test_matches_pattern_empty_stem() {
assert!(!matches_pattern("%.o", ".o"));
assert!(!matches_pattern("foo%", "foo"));
assert!(!matches_pattern("%bar", "bar"));
}
#[test]
fn test_matches_pattern_multiple_wildcards_not_supported() {
assert!(matches_pattern("%.%.o", "%.%.o"));
assert!(!matches_pattern("%.%.o", "foo.bar.o"));
}
}