use super::config::PolicyConfig;
use super::hook::{DefaultPolicyHook, PolicyHook};
use super::policies::Policies;
use super::state::PolicyState;
use super::system::PolicySystem;
use crate::Plugin;
use std::sync::Arc;
#[derive(Plugin)]
#[plugin(name = "issun:policy")]
pub struct PolicyPlugin {
#[plugin(skip)]
hook: Arc<dyn PolicyHook>,
#[plugin(resource)]
config: PolicyConfig,
#[plugin(resource)]
policies: Policies,
#[plugin(runtime_state)]
#[allow(dead_code)]
state: PolicyState,
#[plugin(system)]
system: PolicySystem,
}
impl PolicyPlugin {
pub fn new() -> Self {
let hook = Arc::new(DefaultPolicyHook);
Self {
hook: hook.clone(),
config: PolicyConfig::default(),
policies: Policies::new(),
state: PolicyState::new(),
system: PolicySystem::new(hook),
}
}
pub fn with_hook<H: PolicyHook + 'static>(mut self, hook: H) -> Self {
let hook = Arc::new(hook);
self.hook = hook.clone();
self.system = PolicySystem::new(hook);
self
}
pub fn with_config(mut self, config: PolicyConfig) -> Self {
self.config = config;
self
}
pub fn with_policies(mut self, policies: Policies) -> Self {
self.policies = policies;
self
}
}
impl Default for PolicyPlugin {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_plugin_creation() {
let _plugin = PolicyPlugin::new();
}
#[test]
fn test_plugin_with_custom_hook() {
struct CustomHook;
#[async_trait::async_trait]
impl PolicyHook for CustomHook {}
let _plugin = PolicyPlugin::new().with_hook(CustomHook);
}
#[test]
fn test_plugin_with_custom_config() {
let config = PolicyConfig {
allow_multiple_active: true,
..Default::default()
};
let _plugin = PolicyPlugin::new().with_config(config);
}
#[test]
fn test_plugin_with_policies() {
use super::super::types::Policy;
let mut policies = Policies::new();
policies.add(Policy::new("test", "Test", "Test policy"));
let _plugin = PolicyPlugin::new().with_policies(policies);
}
}