use crate::context::ResourceContext;
use async_trait::async_trait;
use super::types::*;
#[async_trait]
pub trait FactionHook: Send + Sync {
async fn on_operation_launched(
&self,
_faction: &Faction,
_operation: &Operation,
_resources: &mut ResourceContext,
) {
}
async fn calculate_operation_cost(
&self,
_faction: &Faction,
_operation: &Operation,
_resources: &ResourceContext,
) -> Result<i64, String> {
Ok(0)
}
async fn on_operation_completed(
&self,
_faction: &Faction,
_operation: &Operation,
_outcome: &Outcome,
_resources: &mut ResourceContext,
) {
}
async fn on_operation_failed(
&self,
_faction: &Faction,
_operation: &Operation,
_resources: &mut ResourceContext,
) {
}
}
#[derive(Default, Debug, Clone, Copy)]
pub struct DefaultFactionHook;
#[async_trait]
impl FactionHook for DefaultFactionHook {
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_default_hook() {
let hook = DefaultFactionHook;
let mut resources = ResourceContext::new();
let faction = Faction::new("crimson", "Crimson Syndicate");
let operation = Operation::new("op-001", FactionId::new("crimson"), "Test Operation");
hook.on_operation_launched(&faction, &operation, &mut resources)
.await;
let cost = hook
.calculate_operation_cost(&faction, &operation, &resources)
.await;
assert!(cost.is_ok());
assert_eq!(cost.unwrap(), 0);
let outcome = Outcome::new("op-001", true);
hook.on_operation_completed(&faction, &operation, &outcome, &mut resources)
.await;
hook.on_operation_failed(&faction, &operation, &mut resources)
.await;
}
}