pragma_common/
interval.rs1use std::time::Duration;
2
3#[derive(Default, Debug, Clone, Copy, Eq, PartialEq, Hash)]
5#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize,))]
7pub enum Interval {
8 #[cfg_attr(feature = "serde", serde(rename = "100ms"))]
9 OneHundredMillisecond,
10 #[cfg_attr(feature = "serde", serde(rename = "1s"))]
11 OneSecond,
12 #[cfg_attr(feature = "serde", serde(rename = "5s"))]
13 FiveSeconds,
14 #[cfg_attr(feature = "serde", serde(rename = "10s"))]
15 TenSeconds,
16 #[cfg_attr(feature = "serde", serde(rename = "1min"))]
17 OneMinute,
18 #[cfg_attr(feature = "serde", serde(rename = "5min"))]
19 FiveMinutes,
20 #[cfg_attr(feature = "serde", serde(rename = "15min"))]
21 FifteenMinutes,
22 #[cfg_attr(feature = "serde", serde(rename = "1h"))]
23 OneHour,
24 #[cfg_attr(feature = "serde", serde(rename = "2h"))]
25 #[default]
26 TwoHours,
27 #[cfg_attr(feature = "serde", serde(rename = "1d"))]
28 OneDay,
29 #[cfg_attr(feature = "serde", serde(rename = "1w"))]
30 OneWeek,
31}
32
33impl Interval {
34 pub fn as_str(&self) -> &'static str {
35 match self {
36 Self::OneHundredMillisecond => "100ms",
37 Self::OneSecond => "1s",
38 Self::FiveSeconds => "5s",
39 Self::TenSeconds => "10s",
40 Self::OneMinute => "1min",
41 Self::FiveMinutes => "5min",
42 Self::FifteenMinutes => "15min",
43 Self::OneHour => "1h",
44 Self::TwoHours => "2h",
45 Self::OneDay => "1d",
46 Self::OneWeek => "1w",
47 }
48 }
49
50 pub const fn to_minutes(&self) -> i64 {
51 match self {
52 Self::OneHundredMillisecond
53 | Self::OneSecond
54 | Self::FiveSeconds
55 | Self::TenSeconds => 0,
56 Self::OneMinute => 1,
57 Self::FiveMinutes => 5,
58 Self::FifteenMinutes => 15,
59 Self::OneHour => 60,
60 Self::TwoHours => 120,
61 Self::OneDay => 1400,
62 Self::OneWeek => 10080,
63 }
64 }
65
66 pub const fn to_seconds(&self) -> i64 {
67 if matches!(self, Self::OneHundredMillisecond) {
68 return 0;
69 }
70 if matches!(self, Self::OneSecond) {
71 return 1;
72 }
73 if matches!(self, Self::FiveSeconds) {
74 return 5;
75 }
76 if matches!(self, Self::TenSeconds) {
77 return 10;
78 }
79 self.to_minutes() * 60
80 }
81
82 pub const fn to_millis(&self) -> u64 {
83 if matches!(self, Self::OneHundredMillisecond) {
84 return 100;
85 }
86
87 (self.to_seconds() * 1000) as u64
88 }
89}
90
91impl From<Interval> for Duration {
92 fn from(interval: Interval) -> Self {
93 Self::from_millis(interval.to_millis())
94 }
95}