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(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}