use walkdir::WalkDir;
#[derive(Debug)]
pub enum Event {
OnFileChange,
OnFileAdd,
OnFileRemove
}
pub fn listen<T, R>(path: &str, event: Event, arg: T, func: fn(T) -> R) {
internal_listener(path, event, arg, func);
}
#[derive(Debug)]
pub struct Listener {
event: Event,
store_files: bool,
pub files: Vec<String>,
}
impl Default for Listener {
fn default() -> Self {
Listener {
event: Event::OnFileChange,
store_files: false,
files: vec![],
}
}
}
impl Listener {
pub fn new() -> Listener {
Listener::default()
}
pub fn listen<T, R>(&mut self, path: &str, arg: T, func: fn(T) -> R) {
match self.event {
Event::OnFileChange => {
if self.file_change_listener(path) {
func(arg);
}
}
Event::OnFileAdd => {
unimplemented!()
}
Event::OnFileRemove => {
unimplemented!()
}
}
}
fn file_change_listener(&mut self, path: &str) -> bool {
let mut changed: bool = false;
let initial_count = self.count_directory_files(path);
while !changed {
let count = self.count_directory_files(path);
if count == initial_count {
continue;
} else {
changed = true
}
}
changed
}
fn count_directory_files(&mut self, path: &str) -> i64 {
let mut count = 0;
for entry in WalkDir::new(path).max_depth(1) {
match entry {
Ok(entry) => {
let path = entry.path();
if !path.is_dir() {
count = count + 1;
if self.store_files {
match path.to_str() {
Some(file) => {
self.files.push(String::from(file));
}
None => {
println!("listen | Error adding files");
}
}
}
}
}
Err(e) => {
println!("Error: {:?}", e);
}
}
}
count
}
pub fn store_files(&mut self, store_files: bool) {
self.store_files = store_files;
}
}
fn internal_listener<T, R>(path: &str, _event: Event, arg: T, func: fn(T) -> R) {
let mut listener = Listener::new();
listener.listen(path, arg, func);
}