timewall 2.0.2

All-in-one tool for Apple dynamic HEIF wallpapers on GNU/Linux
use anyhow::{anyhow, Result};
use log::debug;
use signal_hook::iterator::Signals;
use std::{
    sync::mpsc::{channel, Receiver, RecvTimeoutError},
    thread,
};

pub fn start_signal_handler(mut signals: Signals) -> Receiver<()> {
    let signals_handle = signals.handle();

    let (termination_tx, termination_rx) = channel::<()>();

    thread::spawn(move || {
        for signal in signals.forever() {
            debug!("Received signal: {signal}");
            termination_tx.send(()).unwrap();
            signals_handle.close();
        }
    });

    termination_rx
}

pub fn interruptible_sleep(
    duration: std::time::Duration,
    interrupt_rx: &Receiver<()>,
) -> Result<bool> {
    match interrupt_rx.recv_timeout(duration) {
        Ok(()) => Ok(true),
        Err(RecvTimeoutError::Timeout) => Ok(false),
        Err(err @ RecvTimeoutError::Disconnected) => Err(anyhow!(err)),
    }
}