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