use crate::{Error, Result, TimerInfo};
use log::warn;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum Progress {
Continue,
Abort,
Reset,
Stop,
}
pub trait Module {
fn pre_timer(&mut self, _timer: TimerInfo) -> Result<Progress> {
Ok(Progress::Continue)
}
fn post_timer(&mut self, _timer: TimerInfo) -> Result<Progress> {
Ok(Progress::Continue)
}
fn warning(&mut self, _error: &Error) -> Result<()> {
Ok(())
}
fn reset(&mut self) -> Result<()> {
Ok(())
}
}
impl Module for () {
fn warning(&mut self, error: &Error) -> Result<()> {
warn!("{} (Debug: {:?})", error, error);
Ok(())
}
}
impl Module for Box<dyn Module> {
fn pre_timer(&mut self, timer: TimerInfo) -> Result<Progress> {
(&mut **self).pre_timer(timer)
}
fn post_timer(&mut self, timer: TimerInfo) -> Result<Progress> {
(&mut **self).post_timer(timer)
}
fn warning(&mut self, error: &Error) -> Result<()> {
(&mut **self).warning(error)
}
fn reset(&mut self) -> Result<()> {
(&mut **self).reset()
}
}
impl<A, B> Module for (A, B)
where
A: Module,
B: Module,
{
fn pre_timer(&mut self, timer: TimerInfo) -> Result<Progress> {
let status = self.0.pre_timer(timer)?;
if status != Progress::Continue {
return Ok(status);
}
self.1.pre_timer(timer)
}
fn post_timer(&mut self, timer: TimerInfo) -> Result<Progress> {
let status = self.0.post_timer(timer)?;
if status != Progress::Continue {
return Ok(status);
}
self.1.post_timer(timer)
}
fn warning(&mut self, error: &Error) -> Result<()> {
self.0.warning(error)?;
self.1.warning(error)
}
fn reset(&mut self) -> Result<()> {
self.0.reset()?;
self.1.reset()
}
}
impl<M: Module> Module for Vec<M> {
fn pre_timer(&mut self, timer: TimerInfo) -> Result<Progress> {
for module in self {
let status = module.pre_timer(timer)?;
if status != Progress::Continue {
return Ok(status);
}
}
Ok(Progress::Continue)
}
fn post_timer(&mut self, timer: TimerInfo) -> Result<Progress> {
for module in self {
let status = module.post_timer(timer)?;
if status != Progress::Continue {
return Ok(status);
}
}
Ok(Progress::Continue)
}
fn warning(&mut self, error: &Error) -> Result<()> {
for module in self {
module.warning(error)?;
}
Ok(())
}
fn reset(&mut self) -> Result<()> {
for module in self {
module.reset()?;
}
Ok(())
}
}
#[cfg(feature = "pulse")]
pub mod pulse;
pub mod stop_at;
pub mod xcb;
#[cfg(feature = "pulse")]
pub use self::pulse::NotWhenAudio;
pub use self::{stop_at::StopAt, xcb::Xcb};