use crate::context::ResourceContext;
use crate::plugin::action::ActionConsumed;
use async_trait::async_trait;
#[async_trait]
pub trait ActionHook: Send + Sync {
async fn on_action_consumed(&self, consumed: &ActionConsumed, resources: &mut ResourceContext);
async fn on_actions_depleted(&self, _resources: &mut ResourceContext) -> bool {
true }
async fn on_actions_reset(&self, _new_count: u32, _resources: &mut ResourceContext) {
}
}
#[derive(Default, Debug, Clone, Copy)]
pub struct DefaultActionHook;
#[async_trait]
impl ActionHook for DefaultActionHook {
async fn on_action_consumed(&self, _: &ActionConsumed, _: &mut ResourceContext) {
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_default_hook() {
let hook = DefaultActionHook;
let mut resources = ResourceContext::new();
let consumed = ActionConsumed {
context: "test".into(),
remaining: 2,
depleted: false,
};
hook.on_action_consumed(&consumed, &mut resources).await;
assert!(hook.on_actions_depleted(&mut resources).await);
hook.on_actions_reset(3, &mut resources).await;
}
}