1#[cfg(any(feature = "watcher", feature = "cached", feature = "logging"))]
2use crate::core_api::CoreApi;
3
4#[cfg(feature = "cached")]
5use crate::cached_api::CachedApi;
6
7use std::{fmt, hash::Hash};
8
9#[derive(Hash, PartialEq, Eq)]
10pub enum Event {
11 PolicyChange,
12 ClearCache,
13}
14
15pub trait EventKey: Hash + PartialEq + Eq + Send + Sync {}
16impl<T> EventKey for T where T: Hash + PartialEq + Eq + Send + Sync {}
17
18#[derive(Clone)]
19pub enum EventData {
20 AddPolicy(String, String, Vec<String>),
21 AddPolicies(String, String, Vec<Vec<String>>),
22 RemovePolicy(String, String, Vec<String>),
23 RemovePolicies(String, String, Vec<Vec<String>>),
24 RemoveFilteredPolicy(String, String, Vec<Vec<String>>),
25 SavePolicy(Vec<Vec<String>>),
26 ClearPolicy,
27 ClearCache,
28}
29
30impl fmt::Display for EventData {
31 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
32 use EventData::*;
33 match *self {
34 AddPolicy(ref sec, ref ptype, ref p) => write!(
35 f,
36 "Type: AddPolicy, Assertion: {}::{}, Data: {:?}",
37 sec,
38 ptype,
39 p.join(", ")
40 ),
41 AddPolicies(ref sec, ref ptype, ref p) => write!(
42 f,
43 "Type: AddPolicies, Assertion: {}::{}, Added: {}",
44 sec,
45 ptype,
46 p.len()
47 ),
48 RemovePolicy(ref sec, ref ptype, ref p) => write!(
49 f,
50 "Type: RemovePolicy, Assertion: {}::{}, Data: {:?}",
51 sec,
52 ptype,
53 p.join(", ")
54 ),
55 RemovePolicies(ref sec, ref ptype, ref p) => write!(
56 f,
57 "Type: RemovePolicies, Assertion: {}::{}, Removed: {}",
58 sec,
59 ptype,
60 p.len()
61 ),
62 RemoveFilteredPolicy(ref sec, ref ptype, ref p) => write!(
63 f,
64 "Type: RemoveFilteredPolicy, Assertion: {}::{}, Removed: {}",
65 sec,
66 ptype,
67 p.len()
68 ),
69 SavePolicy(ref p) => {
70 write!(f, "Type: SavePolicy, Saved: {}", p.len())
71 }
72 ClearPolicy => write!(f, "Type: ClearPolicy"),
73 ClearCache => write!(f, "Type: ClearCache, Data: ClearCache"),
74 }
75 }
76}
77
78pub trait EventEmitter<K>
79where
80 K: EventKey,
81{
82 fn on(&mut self, e: K, f: fn(&mut Self, EventData))
83 where
84 Self: Sized;
85 fn off(&mut self, e: K);
86 fn emit(&mut self, e: K, d: EventData);
87}
88
89#[cfg(any(feature = "logging", feature = "watcher"))]
90pub(crate) fn notify_logger_and_watcher<T: CoreApi>(e: &mut T, d: EventData) {
91 #[cfg(feature = "logging")]
92 {
93 e.get_logger().print_mgmt_log(&d);
94 }
95
96 #[cfg(feature = "watcher")]
97 {
98 if let Some(w) = e.get_mut_watcher() {
99 w.update(d);
100 }
101 }
102}
103
104#[cfg(feature = "cached")]
105#[allow(unused_variables)]
106pub(crate) fn clear_cache<T: CoreApi + CachedApi<u64, bool>>(
107 ce: &mut T,
108 d: EventData,
109) {
110 #[cfg(feature = "logging")]
111 {
112 ce.get_logger().print_mgmt_log(&d);
113 }
114 ce.get_mut_cache().clear();
115}