use std::{fmt, sync::Arc};
use watchexec_events::{Event, Priority};
use crate::{changeable::Changeable, error::RuntimeError};
pub trait Filterer: std::fmt::Debug + Send + Sync {
fn check_event(&self, event: &Event, priority: Priority) -> Result<bool, RuntimeError>;
}
impl Filterer for () {
fn check_event(&self, _event: &Event, _priority: Priority) -> Result<bool, RuntimeError> {
Ok(true)
}
}
impl<T: Filterer> Filterer for Arc<T> {
fn check_event(&self, event: &Event, priority: Priority) -> Result<bool, RuntimeError> {
Self::as_ref(self).check_event(event, priority)
}
}
pub struct ChangeableFilterer(Changeable<Arc<dyn Filterer>>);
impl ChangeableFilterer {
pub fn replace(&self, new: impl Filterer + 'static) {
self.0.replace(Arc::new(new));
}
}
impl Filterer for ChangeableFilterer {
fn check_event(&self, event: &Event, priority: Priority) -> Result<bool, RuntimeError> {
Arc::as_ref(&self.0.get()).check_event(event, priority)
}
}
impl Clone for ChangeableFilterer {
fn clone(&self) -> Self {
Self(Changeable::clone(&self.0))
}
}
impl Default for ChangeableFilterer {
fn default() -> Self {
Self(Changeable::new(Arc::new(())))
}
}
impl fmt::Debug for ChangeableFilterer {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("ChangeableFilterer")
.field("filterer", &format!("{:?}", self.0.get()))
.finish_non_exhaustive()
}
}