use anyhow::{anyhow,bail,ensure};
use log::{info,error,warn,trace,debug};
use serde::{Serialize,Deserialize};
use crate::macros::{
ok_debug,
send_or_die,
};
use disk::prelude::*;
use disk::{Plain, plain_file};
use crate::constants::FESTIVAL;
use crossbeam_channel::Sender;
use super::msg::WatchToKernel;
macro_rules! impl_signal {
($type:ident, $file_name:literal) => {
plain_file!($type, Dir::Data, FESTIVAL, "signal", $file_name);
#[derive(Copy,Clone,Debug,PartialEq,Eq,Serialize,Deserialize)]
struct $type;
}
}
impl_signal!(Stop, "stop");
impl_signal!(Play, "play");
impl_signal!(Next, "next");
impl_signal!(Last, "last");
impl_signal!(Shuffle, "shuffle");
impl_signal!(Repeat, "repeat");
#[derive(Copy,Clone,Debug,PartialEq,Eq,Serialize,Deserialize)]
pub(crate) struct Watch;
impl Watch {
#[inline(always)]
pub(crate) fn init(to_kernel: Sender<WatchToKernel>) {
Self::clean();
Self::main(to_kernel)
}
#[inline(always)]
fn clean() {
if let Err(e) = Stop::create_dir() { error!("Watch | Could not create signal folder"); }
if let Err(e) = Stop::remove() { info!("Watch | Stop: {}", e); }
if let Err(e) = Play::remove() { info!("Watch | Play: {}", e); }
if let Err(e) = Next::remove() { info!("Watch | Next: {}", e); }
if let Err(e) = Last::remove() { info!("Watch | Last: {}", e); }
if let Err(e) = Shuffle::remove() { info!("Watch | Shuffle: {}", e); }
if let Err(e) = Repeat::remove() { info!("Watch | Repeat: {}", e); }
}
#[inline(always)]
fn main(to_kernel: Sender<WatchToKernel>) {
ok_debug!("Watch");
loop {
if let Ok(true) = Stop::exists() {
send_or_die!(to_kernel, WatchToKernel::Stop)
} else if let Ok(true) = Play::exists() {
send_or_die!(to_kernel, WatchToKernel::Play)
}
if let Ok(true) = Next::exists() {
send_or_die!(to_kernel, WatchToKernel::Next)
} else if let Ok(true) = Last::exists() {
send_or_die!(to_kernel, WatchToKernel::Last)
}
if let Ok(true) = Shuffle::exists() {
send_or_die!(to_kernel, WatchToKernel::Shuffle)
}
if let Ok(true) = Repeat::exists() {
send_or_die!(to_kernel, WatchToKernel::Repeat)
}
Self::clean();
}
}
}