@@ -13,6 +13,9 @@ use crate::{
1313 Result ,
1414} ;
1515
16+ #[ cfg( feature = "logging" ) ]
17+ use crate :: Logger ;
18+
1619use async_trait:: async_trait;
1720
1821use std:: {
@@ -21,7 +24,7 @@ use std::{
2124 time:: Duration ,
2225} ;
2326
24- type EventCallback = fn ( & mut CachedEnforcer , Option < EventData > ) ;
27+ type EventCallback = fn ( & mut CachedEnforcer , EventData ) ;
2528
2629pub struct CachedEnforcer {
2730 pub ( crate ) enforcer : Enforcer ,
@@ -30,15 +33,15 @@ pub struct CachedEnforcer {
3033}
3134
3235impl EventEmitter < Event > for CachedEnforcer {
33- fn on ( & mut self , e : Event , f : fn ( & mut Self , Option < EventData > ) ) {
36+ fn on ( & mut self , e : Event , f : fn ( & mut Self , EventData ) ) {
3437 self . events . entry ( e) . or_insert_with ( Vec :: new) . push ( f)
3538 }
3639
3740 fn off ( & mut self , e : Event ) {
3841 self . events . remove ( & e) ;
3942 }
4043
41- fn emit ( & mut self , e : Event , d : Option < EventData > ) {
44+ fn emit ( & mut self , e : Event , d : EventData ) {
4245 if let Some ( cbs) = self . events . get ( & e) {
4346 for cb in cbs. clone ( ) . iter ( ) {
4447 cb ( self , d. clone ( ) )
@@ -59,7 +62,7 @@ impl CoreApi for CachedEnforcer {
5962 events : HashMap :: new ( ) ,
6063 } ;
6164
62- cached_enforcer. on ( Event :: PolicyChange , clear_cache) ;
65+ cached_enforcer. on ( Event :: ClearCache , clear_cache) ;
6366
6467 Ok ( cached_enforcer)
6568 }
@@ -128,21 +131,61 @@ impl CoreApi for CachedEnforcer {
128131 self . enforcer . set_adapter ( a) . await
129132 }
130133
134+ #[ cfg( feature = "logging" ) ]
135+ #[ inline]
136+ fn get_logger ( & self ) -> & dyn Logger {
137+ self . enforcer . get_logger ( )
138+ }
139+
140+ #[ cfg( feature = "logging" ) ]
141+ #[ inline]
142+ fn set_logger ( & mut self , l : Box < dyn Logger > ) {
143+ self . enforcer . set_logger ( l) ;
144+ }
145+
131146 #[ inline]
132147 fn set_effector ( & mut self , e : Box < dyn Effector > ) {
133148 self . enforcer . set_effector ( e) ;
134149 }
135150
136151 async fn enforce_mut < S : AsRef < str > + Send + Sync > ( & mut self , rvals : & [ S ] ) -> Result < bool > {
137152 let key: Vec < String > = rvals. iter ( ) . map ( |x| String :: from ( x. as_ref ( ) ) ) . collect ( ) ;
153+ #[ allow( unused_variables) ]
154+ let log_enabled = {
155+ #[ cfg( feature = "logging" ) ]
156+ {
157+ if self . enforcer . get_logger ( ) . is_enabled ( ) {
158+ self . enforcer . enable_log ( false ) ;
159+ true
160+ } else {
161+ false
162+ }
163+ }
138164
139- if let Some ( result) = self . cache . get ( & key) . await {
140- Ok ( * result)
165+ #[ cfg( not( feature = "logging" ) ) ]
166+ {
167+ false
168+ }
169+ } ;
170+
171+ #[ allow( unused_variables) ]
172+ let ( res, is_cached) = if let Some ( result) = self . cache . get ( & key) . await {
173+ ( * result, true )
141174 } else {
142175 let result = self . enforcer . enforce ( rvals) . await ?;
143- self . cache . set ( key, result) . await ;
144- Ok ( result)
176+ self . cache . set ( key. clone ( ) , result) . await ;
177+ ( result, false )
178+ } ;
179+
180+ #[ cfg( feature = "logging" ) ]
181+ {
182+ self . enforcer . enable_log ( log_enabled) ;
183+ self . enforcer
184+ . get_logger ( )
185+ . print_enforce_log ( key, res, is_cached) ;
145186 }
187+
188+ Ok ( res)
146189 }
147190
148191 /// CachedEnforcer should use `enforce_mut` instead so that
@@ -181,6 +224,12 @@ impl CoreApi for CachedEnforcer {
181224 self . enforcer . clear_policy ( ) ;
182225 }
183226
227+ #[ cfg( feature = "logging" ) ]
228+ #[ inline]
229+ fn enable_log ( & mut self , enabled : bool ) {
230+ self . enforcer . enable_log ( enabled) ;
231+ }
232+
184233 #[ inline]
185234 fn enable_enforce ( & mut self , enabled : bool ) {
186235 self . enforcer . enable_enforce ( enabled) ;
0 commit comments