floem-css 0.2.0

Hot reloading css-like styles for Floem
Documentation
use std::path::Path;

use crossbeam_channel::Sender;
use notify::{Error, Event, EventKind, RecommendedWatcher, RecursiveMode, Watcher};

use crate::error::ThemeError;

#[allow(dead_code)]
pub struct FileObserver {
    watcher: RecommendedWatcher,
}

impl FileObserver {
    pub fn new(path: &Path, sender: Sender<()>, recursive: bool) -> Result<Self, ThemeError> {
        let mut watcher = notify::recommended_watcher(move |res| handle_event(res, &sender))?;
        let mode = if path.is_dir() && recursive {
            RecursiveMode::Recursive
        } else {
            RecursiveMode::NonRecursive
        };
        watcher.watch(path, mode)?;
        Ok(Self { watcher })
    }
}

fn handle_event(res: Result<Event, Error>, sender: &Sender<()>) {
    match res {
        Ok(Event {
            kind: EventKind::Create(_) | EventKind::Modify(_),
            ..
        }) => {
            if let Err(e) = sender.send(()) {
                log::error!("Observer send error: {e:?}");
            }
        }
        Ok(_) => (),
        Err(e) => {
            log::error!("{e}");
        }
    };
}