#[doc(hidden)]
pub mod datetime;
#[doc(hidden)]
pub mod datetimeopt;
#[doc(hidden)]
pub mod duration;
use chrono::{prelude::*, TimeDelta};
use serde::{Deserialize, Serialize};
#[derive(Clone, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)]
pub struct Timer {
#[serde(with = "crate::time::datetime::unix")]
started_at: DateTime<Local>,
#[serde(with = "crate::time::duration::seconds")]
duration: TimeDelta,
}
impl Timer {
pub fn new(started_at: DateTime<Local>, duration: TimeDelta) -> Self {
Self {
started_at,
duration,
}
}
pub fn starts_at(&self) -> DateTime<Local> {
self.started_at
}
pub fn ends_at(&self) -> DateTime<Local> {
self.started_at + self.duration
}
pub fn duration(&self) -> TimeDelta {
self.duration
}
pub fn elapsed(&self, now: DateTime<Local>) -> TimeDelta {
(now - self.started_at).clamp(TimeDelta::zero(), self.duration)
}
pub fn remaining(&self, now: DateTime<Local>) -> TimeDelta {
(self.duration - self.elapsed(now)).clamp(TimeDelta::zero(), self.duration)
}
pub fn done(&self, now: DateTime<Local>) -> bool {
now > self.ends_at()
}
}