use async_trait::async_trait;
use super::types::{Alignment, FactionId, Member, MemberId};
use crate::context::ResourceContext;
#[async_trait]
pub trait CultureHook: Send + Sync {
async fn on_alignment_checked(
&self,
_faction_id: &FactionId,
_member_id: &MemberId,
_alignment: &Alignment,
_resources: &mut ResourceContext,
) {
}
async fn on_stress_accumulated(
&self,
_faction_id: &FactionId,
_member_id: &MemberId,
_new_stress: f32,
_resources: &mut ResourceContext,
) {
}
async fn on_fervor_increased(
&self,
_faction_id: &FactionId,
_member_id: &MemberId,
_new_fervor: f32,
_resources: &mut ResourceContext,
) {
}
async fn on_member_breakdown(
&self,
_faction_id: &FactionId,
_member: &Member,
_resources: &mut ResourceContext,
) -> bool {
true
}
async fn on_member_fanaticized(
&self,
_faction_id: &FactionId,
_member: &Member,
_resources: &mut ResourceContext,
) {
}
async fn can_add_culture_tag(
&self,
_faction_id: &FactionId,
_tag: &super::types::CultureTag,
_resources: &mut ResourceContext,
) -> bool {
true
}
async fn on_culture_tag_added(
&self,
_faction_id: &FactionId,
_tag: &super::types::CultureTag,
_resources: &mut ResourceContext,
) {
}
async fn on_culture_tag_removed(
&self,
_faction_id: &FactionId,
_tag: &super::types::CultureTag,
_resources: &mut ResourceContext,
) {
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct DefaultCultureHook;
#[async_trait]
impl CultureHook for DefaultCultureHook {}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_default_hook_no_op() {
let hook = DefaultCultureHook;
let mut resources = ResourceContext::new();
let faction_id = "faction_a".to_string();
let member_id = "m1".to_string();
let alignment = Alignment::Neutral;
hook.on_alignment_checked(&faction_id, &member_id, &alignment, &mut resources)
.await;
hook.on_stress_accumulated(&faction_id, &member_id, 0.7, &mut resources)
.await;
hook.on_fervor_increased(&faction_id, &member_id, 0.8, &mut resources)
.await;
}
#[tokio::test]
async fn test_default_breakdown_removes_member() {
let hook = DefaultCultureHook;
let mut resources = ResourceContext::new();
let faction_id = "faction_a".to_string();
let member = Member::new("m1", "Test").with_stress(0.95);
let should_remove = hook
.on_member_breakdown(&faction_id, &member, &mut resources)
.await;
assert!(should_remove);
}
#[tokio::test]
async fn test_can_add_culture_tag_default() {
let hook = DefaultCultureHook;
let mut resources = ResourceContext::new();
let faction_id = "faction_a".to_string();
let tag = super::super::types::CultureTag::RiskTaking;
let can_add = hook
.can_add_culture_tag(&faction_id, &tag, &mut resources)
.await;
assert!(can_add);
}
}