use std::path::Path;
use notify::{Event, EventKind};
use crate::discovery;
use super::Watched;
pub(super) fn is_relevant(event: &Event, watched: &Watched) -> bool {
matches!(
event.kind,
EventKind::Create(_) | EventKind::Modify(_) | EventKind::Remove(_)
) && event.paths.iter().any(|changed| is_ours(changed, watched))
}
fn is_ours(changed: &Path, watched: &Watched) -> bool {
let explicit = watched.files.iter().any(|configured| {
changed == configured || changed.ends_with(configured) || configured.ends_with(changed)
});
if explicit {
return true;
}
if watched
.search_name
.as_deref()
.is_some_and(|name| discovery::is_candidate(changed, name))
{
return true;
}
is_mount_marker(changed, watched)
}
fn is_mount_marker(changed: &Path, watched: &Watched) -> bool {
let is_marker = changed
.file_name()
.and_then(|name| name.to_str())
.is_some_and(|name| name.starts_with(".."));
if !is_marker {
return false;
}
let Some(directory) = changed.parent() else {
return false;
};
let mut parents = watched.files.iter().filter_map(|file| file.parent());
if parents.any(|parent| directory.ends_with(parent) || parent.ends_with(directory)) {
return true;
}
watched
.search_directories
.iter()
.any(|parent| directory.ends_with(parent) || parent.ends_with(directory))
}