use std::{
sync::{Arc, Mutex},
time::Duration,
};
use crate::common::hybrid_logical_clock::{DEFAULT_MAX_CLOCK_DRIFT, HLCError, HybridLogicalClock};
pub struct ApplicationHybridLogicalClock {
hlc: Mutex<HybridLogicalClock>,
max_clock_drift: Duration,
}
impl ApplicationHybridLogicalClock {
#[must_use]
pub fn new(max_clock_drift: Duration) -> Self {
Self {
hlc: Mutex::new(HybridLogicalClock::new()),
max_clock_drift,
}
}
pub fn read(&self) -> HybridLogicalClock {
self.hlc.lock().unwrap().clone()
}
pub(crate) fn update(&self, other_hlc: &HybridLogicalClock) -> Result<(), HLCError> {
self.hlc
.lock()
.unwrap()
.update(other_hlc, self.max_clock_drift)
}
pub(crate) fn update_now(&self) -> Result<String, HLCError> {
let mut hlc = self.hlc.lock().unwrap();
hlc.update_now(self.max_clock_drift)?;
Ok(hlc.to_string())
}
}
#[derive(Builder, Clone)]
pub struct ApplicationContext {
#[builder(default = "Arc::new(ApplicationHybridLogicalClock::new(DEFAULT_MAX_CLOCK_DRIFT))")]
pub application_hlc: Arc<ApplicationHybridLogicalClock>,
}