use super::state::{HudSnapshot, HudState};
use std::sync::{Arc, Mutex};
use std::time::Instant;
#[derive(Clone)]
pub struct SafeHud {
inner: Arc<Mutex<HudState>>,
}
impl SafeHud {
#[must_use]
pub fn new(title: impl Into<String>) -> Self {
Self {
inner: Arc::new(Mutex::new(HudState::new(title))),
}
}
pub fn modify<F>(&self, f: F)
where
F: FnOnce(&mut HudState),
{
if let Ok(mut guard) = self.inner.lock() {
f(&mut guard);
}
}
#[must_use]
pub fn snapshot(&self) -> HudSnapshot {
if let Ok(guard) = self.inner.lock() {
guard.snapshot()
} else {
HudSnapshot::default()
}
}
#[must_use]
pub fn completion_info(&self) -> (bool, String, Instant) {
if let Ok(guard) = self.inner.lock() {
let (s, t, i) = guard.completion_info();
(s, t.to_string(), i)
} else {
(false, String::new(), Instant::now())
}
}
}