use crate::context::ResourceContext;
use async_trait::async_trait;
use super::types::*;
#[async_trait]
pub trait PolicyHook: Send + Sync {
async fn on_policy_activated(
&self,
_policy: &Policy,
_previous_policy: Option<&Policy>,
_resources: &mut ResourceContext,
) {
}
async fn on_policy_deactivated(&self, _policy: &Policy, _resources: &mut ResourceContext) {
}
async fn calculate_effect(
&self,
_policy: &Policy,
_effect_name: &str,
base_value: f32,
_resources: &ResourceContext,
) -> f32 {
base_value
}
async fn validate_activation(
&self,
_policy: &Policy,
_resources: &ResourceContext,
) -> Result<(), String> {
Ok(())
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct DefaultPolicyHook;
#[async_trait]
impl PolicyHook for DefaultPolicyHook {
}
#[cfg(test)]
mod tests {
use super::*;
use crate::context::ResourceContext;
#[tokio::test]
async fn test_default_hook_does_nothing() {
let hook = DefaultPolicyHook;
let policy = Policy::new("test", "Test", "Test");
let mut resources = ResourceContext::new();
hook.on_policy_activated(&policy, None, &mut resources)
.await;
hook.on_policy_deactivated(&policy, &mut resources).await;
let value = hook
.calculate_effect(&policy, "test", 1.0, &resources)
.await;
assert_eq!(value, 1.0);
let result = hook.validate_activation(&policy, &resources).await;
assert!(result.is_ok());
}
}