use std::path::PathBuf;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum RecursiveMode {
Recursive,
NonRecursive,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum EntryKind {
File,
Folder,
Unknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum RenameSide {
To,
From,
Both,
Unknown,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum ChangeKind {
Created(EntryKind),
Removed(EntryKind),
ContentModified,
MetadataModified,
NameModified(RenameSide),
Accessed,
Other,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ChangeEvent {
kind: ChangeKind,
paths: Vec<PathBuf>,
}
impl ChangeEvent {
pub fn new(kind: ChangeKind, paths: Vec<PathBuf>) -> Self {
Self { kind, paths }
}
pub fn kind(&self) -> ChangeKind {
self.kind
}
pub fn paths(&self) -> &[PathBuf] {
&self.paths
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RescanRequired {
watch_lost: bool,
paths: Vec<PathBuf>,
}
impl RescanRequired {
pub fn new(watch_lost: bool, paths: Vec<PathBuf>) -> Self {
Self { watch_lost, paths }
}
pub fn watch_lost(&self) -> bool {
self.watch_lost
}
pub fn paths(&self) -> &[PathBuf] {
&self.paths
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum WatchNotification {
Change(ChangeEvent),
RescanRequired(RescanRequired),
}
#[cfg(feature = "fs-watch")]
pub use crate::FsWatchWatcher as Watcher;
#[cfg(all(test, feature = "fs-watch"))]
mod tests {
use super::*;
#[test]
fn change_event_exposes_its_kind_and_paths() {
let event = ChangeEvent::new(
ChangeKind::ContentModified,
vec![PathBuf::from("a"), PathBuf::from("b")],
);
assert_eq!(event.kind(), ChangeKind::ContentModified);
assert_eq!(event.paths(), &[PathBuf::from("a"), PathBuf::from("b")]);
}
#[test]
fn rescan_required_distinguishes_a_lost_watch_from_a_skipped_window() {
let lost = RescanRequired::new(true, vec![PathBuf::from("dir")]);
assert!(lost.watch_lost());
assert_eq!(lost.paths(), &[PathBuf::from("dir")]);
let skipped = RescanRequired::new(false, Vec::new());
assert!(!skipped.watch_lost());
assert!(skipped.paths().is_empty());
}
}