use std::{
ops::{Mul, MulAssign},
time::Duration,
};
#[derive(Debug, Clone, Copy)]
pub struct Interval(Duration);
impl Default for Interval {
fn default() -> Self {
Self(Default::default())
}
}
pub const MIN: Interval = Interval(Duration::from_secs(60));
pub const HOUR: Interval = Interval(Duration::from_secs(60 * 60));
pub const DAY: Interval = Interval(Duration::from_secs(60 * 60 * 24));
impl From<Interval> for String {
fn from(value: Interval) -> Self {
let min = value.0.as_secs() / 60;
if min < 61 {
return format!("{}Min", min);
}
let hours = min / 60;
if hours < 25 {
return format!("{}H", hours);
}
let days = hours / 24;
return format!("{}D", days);
}
}
impl Mul<Duration> for Interval {
type Output = Self;
fn mul(self, rhs: Duration) -> Self {
Interval(Duration::from_secs_f64(
rhs.as_secs_f64() * self.0.as_secs_f64(),
))
}
}
impl MulAssign<Duration> for Interval {
fn mul_assign(&mut self, rhs: Duration) {
self.0 = Duration::from_secs_f64(rhs.as_secs_f64() * self.0.as_secs_f64());
}
}
impl Mul<u32> for Interval {
type Output = Self;
fn mul(self, rhs: u32) -> Self {
Interval(self.0 * rhs)
}
}
impl MulAssign<u32> for Interval {
fn mul_assign(&mut self, rhs: u32) {
self.0 = self.0 * rhs;
}
}