mirror of
https://github.com/rojo-rbx/rojo.git
synced 2026-04-20 20:55:50 +00:00
68 lines
2.4 KiB
Rust
68 lines
2.4 KiB
Rust
use std::sync::mpsc::{channel, Sender};
|
|
use std::time::Duration;
|
|
use std::thread;
|
|
|
|
use notify::{DebouncedEvent, RecommendedWatcher, RecursiveMode, Watcher, watcher};
|
|
|
|
use partition::Partition;
|
|
use vfs_session::FileChange;
|
|
use file_route::FileRoute;
|
|
|
|
const WATCH_TIMEOUT_MS: u64 = 100;
|
|
|
|
pub struct PartitionWatcher {
|
|
pub watcher: RecommendedWatcher,
|
|
}
|
|
|
|
impl PartitionWatcher {
|
|
pub fn start_new(partition: Partition, tx: Sender<FileChange>) -> PartitionWatcher {
|
|
let (watch_tx, watch_rx) = channel();
|
|
|
|
let mut watcher = watcher(watch_tx, Duration::from_millis(WATCH_TIMEOUT_MS)).unwrap();
|
|
|
|
watcher.watch(&partition.path, RecursiveMode::Recursive).unwrap();
|
|
|
|
thread::spawn(move || {
|
|
loop {
|
|
match watch_rx.recv() {
|
|
Ok(event) => {
|
|
let file_change = match event {
|
|
DebouncedEvent::Create(path) => {
|
|
let route = FileRoute::from_path(&path, &partition).unwrap();
|
|
FileChange::Created(route)
|
|
},
|
|
DebouncedEvent::Write(path) => {
|
|
let route = FileRoute::from_path(&path, &partition).unwrap();
|
|
FileChange::Updated(route)
|
|
},
|
|
DebouncedEvent::Remove(path) => {
|
|
let route = FileRoute::from_path(&path, &partition).unwrap();
|
|
FileChange::Deleted(route)
|
|
},
|
|
DebouncedEvent::Rename(from_path, to_path) => {
|
|
let from_route = FileRoute::from_path(&from_path, &partition).unwrap();
|
|
let to_route = FileRoute::from_path(&to_path, &partition).unwrap();
|
|
FileChange::Moved(from_route, to_route)
|
|
},
|
|
_ => continue,
|
|
};
|
|
|
|
match tx.send(file_change) {
|
|
Ok(_) => {},
|
|
Err(_) => break,
|
|
}
|
|
},
|
|
Err(_) => break,
|
|
};
|
|
}
|
|
});
|
|
|
|
PartitionWatcher {
|
|
watcher,
|
|
}
|
|
}
|
|
|
|
pub fn stop(self) {
|
|
}
|
|
}
|