use crate::engine_types::ChangeVerb;
#[derive(Clone, Debug)]
pub(crate) struct ChangeEvent {
pub(crate) id: u64,
pub(crate) verb: ChangeVerb,
pub(crate) path: String,
pub(crate) etag: String,
}
pub(crate) fn pattern(raw: &str) -> String {
let p = raw.trim();
if p == "*" || p == "/*" || p == "/" || p.is_empty() {
"*".to_owned()
} else if p.starts_with('/') {
p.to_owned()
} else {
format!("/{p}")
}
}
pub(crate) fn matches(pattern: &str, path: &str) -> bool {
if pattern == "*" {
return true;
}
if let Some(prefix) = pattern.strip_suffix('*') {
path.starts_with(prefix)
} else {
path == pattern
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn patterns_are_prefix_or_exact() {
assert_eq!(pattern("*"), "*");
assert_eq!(pattern("/"), "*");
assert_eq!(pattern("home/task/*"), "/home/task/*");
assert_eq!(pattern("home/销售/*"), "/home/销售/*");
assert!(matches("*", "/home/task/a"));
assert!(matches("/home/task/*", "/home/task/a"));
assert!(!matches("/home/task/*", "/home/other/a"));
assert!(matches("/home/销售/*", "/home/销售/报告"));
assert!(matches("/home/task/a", "/home/task/a"));
assert!(!matches("/home/task/a", "/home/task/ab"));
}
}