use std::path::{Path, PathBuf};
use notify::{Event, EventKind};
use crate::discovery;
use super::Watched;
pub(super) fn relevant_path<'event>(
event: &'event Event,
watched: &Watched,
) -> Option<&'event Path> {
if !matches!(
event.kind,
EventKind::Create(_) | EventKind::Modify(_) | EventKind::Remove(_)
) {
return None;
}
event
.paths
.iter()
.map(PathBuf::as_path)
.find(|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))
}