use crate::context::ResourceContext;
use async_trait::async_trait;
use super::types::Currency;
#[async_trait]
pub trait AccountingHook: Send + Sync {
async fn calculate_income(&self, _period: u32, _resources: &ResourceContext) -> Currency {
Currency::ZERO
}
async fn calculate_expenses(&self, _period: u32, _resources: &ResourceContext) -> Currency {
Currency::ZERO
}
async fn before_settlement(&self, _period: u32, _resources: &mut ResourceContext) {
}
async fn after_settlement(
&self,
_period: u32,
_income: Currency,
_expenses: Currency,
_net: Currency,
_resources: &mut ResourceContext,
) {
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct DefaultAccountingHook;
#[async_trait]
impl AccountingHook for DefaultAccountingHook {
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_default_hook_does_nothing() {
let hook = DefaultAccountingHook;
let resources = ResourceContext::new();
let income = hook.calculate_income(1, &resources).await;
assert_eq!(income.amount(), 0);
let expenses = hook.calculate_expenses(1, &resources).await;
assert_eq!(expenses.amount(), 0);
let mut resources = ResourceContext::new();
hook.before_settlement(1, &mut resources).await;
hook.after_settlement(
1,
Currency::ZERO,
Currency::ZERO,
Currency::ZERO,
&mut resources,
)
.await;
}
}