1use std::{fmt, sync::Arc};
4
5use watchexec_events::{Event, Priority};
6
7use crate::{changeable::Changeable, error::RuntimeError};
8
9pub trait Filterer: std::fmt::Debug + Send + Sync {
11 fn check_event(&self, event: &Event, priority: Priority) -> Result<bool, RuntimeError>;
22}
23
24impl Filterer for () {
25 fn check_event(&self, _event: &Event, _priority: Priority) -> Result<bool, RuntimeError> {
26 Ok(true)
27 }
28}
29
30impl<T: Filterer> Filterer for Arc<T> {
31 fn check_event(&self, event: &Event, priority: Priority) -> Result<bool, RuntimeError> {
32 Self::as_ref(self).check_event(event, priority)
33 }
34}
35
36pub struct ChangeableFilterer(Changeable<Arc<dyn Filterer>>);
40impl ChangeableFilterer {
41 pub fn replace(&self, new: impl Filterer + 'static) {
45 self.0.replace(Arc::new(new));
46 }
47}
48
49impl Filterer for ChangeableFilterer {
50 fn check_event(&self, event: &Event, priority: Priority) -> Result<bool, RuntimeError> {
51 Arc::as_ref(&self.0.get()).check_event(event, priority)
52 }
53}
54
55impl Clone for ChangeableFilterer {
57 fn clone(&self) -> Self {
58 Self(Changeable::clone(&self.0))
59 }
60}
61
62impl Default for ChangeableFilterer {
63 fn default() -> Self {
64 Self(Changeable::new(Arc::new(())))
65 }
66}
67
68impl fmt::Debug for ChangeableFilterer {
69 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
70 f.debug_struct("ChangeableFilterer")
71 .field("filterer", &format!("{:?}", self.0.get()))
72 .finish_non_exhaustive()
73 }
74}