use crate::context::ResourceContext;
use async_trait::async_trait;
use super::types::*;
#[async_trait]
pub trait ReputationHook: Send + Sync {
async fn on_reputation_changed(
&self,
_subject_id: &SubjectId,
_old_score: f32,
_new_score: f32,
_delta: f32,
_category: Option<&str>,
_resources: &mut ResourceContext,
) {
}
async fn on_threshold_crossed(
&self,
_subject_id: &SubjectId,
_old_threshold: Option<&ReputationThreshold>,
_new_threshold: &ReputationThreshold,
_resources: &mut ResourceContext,
) {
}
async fn validate_change(
&self,
_subject_id: &SubjectId,
_delta: f32,
_category: Option<&str>,
_resources: &ResourceContext,
) -> Result<(), String> {
Ok(())
}
async fn calculate_delta(
&self,
_subject_id: &SubjectId,
base_delta: f32,
_category: Option<&str>,
_resources: &ResourceContext,
) -> f32 {
base_delta
}
}
#[derive(Default, Debug, Clone, Copy)]
pub struct DefaultReputationHook;
#[async_trait]
impl ReputationHook for DefaultReputationHook {
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_default_hook() {
let hook = DefaultReputationHook;
let mut resources = ResourceContext::new();
let id = SubjectId::new("player", "kingdom");
hook.on_reputation_changed(&id, 0.0, 10.0, 10.0, None, &mut resources)
.await;
let threshold = ReputationThreshold::new("Friendly", 0.0, 50.0);
hook.on_threshold_crossed(&id, None, &threshold, &mut resources)
.await;
let result = hook.validate_change(&id, 10.0, None, &resources).await;
assert!(result.is_ok());
let delta = hook.calculate_delta(&id, 10.0, None, &resources).await;
assert_eq!(delta, 10.0);
}
}