casbin/
emitter.rs

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}