use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Source {
Http,
Ws,
Mcp,
Derived,
Mock,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Stat<T> {
pub value: T,
pub as_of: DateTime<Utc>,
pub n: Option<u64>,
pub source: Source,
}
impl<T> Stat<T> {
pub fn new(value: T, source: Source) -> Self {
Self {
value,
as_of: Utc::now(),
n: None,
source,
}
}
#[must_use]
pub fn with_n(mut self, n: u64) -> Self {
self.n = Some(n);
self
}
#[must_use]
pub fn with_as_of(mut self, as_of: DateTime<Utc>) -> Self {
self.as_of = as_of;
self
}
#[must_use]
pub fn age(&self, now: DateTime<Utc>) -> chrono::Duration {
now.signed_duration_since(self.as_of)
}
#[must_use]
pub fn is_stale(&self, now: DateTime<Utc>, threshold: chrono::Duration) -> bool {
self.age(now) > threshold
}
}