pragma_common/
interval.rs

1use std::time::Duration;
2
3// Supported Aggregation Intervals
4#[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}