made_core/ports/
statistics.rs1use async_trait::async_trait;
12
13use crate::entities::Statistics;
14use crate::error::DomainError;
15use crate::value_objects::{AuthorizationEvidence, DurationMs, Specialty};
16
17#[async_trait]
18pub trait StatisticsPort: Send + Sync {
19 async fn record_deliberation(
22 &self,
23 specialty: &Specialty,
24 duration: DurationMs,
25 ) -> Result<(), DomainError>;
26 async fn record_deliberation_authorized(
27 &self,
28 specialty: &Specialty,
29 duration: DurationMs,
30 authorization: Option<AuthorizationEvidence>,
31 ) -> Result<(), DomainError> {
32 reject_unsupported(authorization.as_ref())?;
33 self.record_deliberation(specialty, duration).await
34 }
35
36 async fn record_orchestration(&self, duration: DurationMs) -> Result<(), DomainError>;
39 async fn record_orchestration_authorized(
40 &self,
41 duration: DurationMs,
42 authorization: Option<AuthorizationEvidence>,
43 ) -> Result<(), DomainError> {
44 reject_unsupported(authorization.as_ref())?;
45 self.record_orchestration(duration).await
46 }
47
48 async fn snapshot(&self) -> Result<Statistics, DomainError>;
51}
52
53fn reject_unsupported(authorization: Option<&AuthorizationEvidence>) -> Result<(), DomainError> {
54 if authorization.is_some() {
55 return Err(DomainError::InvariantViolated {
56 reason: "statistics adapter cannot persist authorization evidence",
57 });
58 }
59 Ok(())
60}