glean_core/metrics/
time_unit.rs1use std::time::Duration;
6
7use malloc_size_of_derive::MallocSizeOf;
8use serde::{Deserialize, Serialize};
9
10use crate::error::{Error, ErrorKind};
11
12#[derive(Copy, Clone, Debug, Deserialize, Serialize, PartialEq, Eq, MallocSizeOf)]
15#[serde(rename_all = "lowercase")]
16#[repr(i32)] pub enum TimeUnit {
18 Nanosecond,
20 Microsecond,
22 Millisecond,
24 Second,
26 Minute,
28 Hour,
30 Day,
32}
33
34impl TimeUnit {
35 pub fn format_pattern(self) -> &'static str {
37 use TimeUnit::*;
38 match self {
39 Nanosecond => "%Y-%m-%dT%H:%M:%S%.f%:z",
40 Microsecond => "%Y-%m-%dT%H:%M:%S%.6f%:z",
41 Millisecond => "%Y-%m-%dT%H:%M:%S%.3f%:z",
42 Second => "%Y-%m-%dT%H:%M:%S%:z",
43 Minute => "%Y-%m-%dT%H:%M%:z",
44 Hour => "%Y-%m-%dT%H%:z",
45 Day => "%Y-%m-%d%:z",
46 }
47 }
48
49 pub fn duration_convert(self, duration: Duration) -> u64 {
59 use TimeUnit::*;
60 match self {
61 Nanosecond => duration.as_nanos() as u64,
62 Microsecond => duration.as_micros() as u64,
63 Millisecond => duration.as_millis() as u64,
64 Second => duration.as_secs(),
65 Minute => duration.as_secs() / 60,
66 Hour => duration.as_secs() / 60 / 60,
67 Day => duration.as_secs() / 60 / 60 / 24,
68 }
69 }
70
71 pub fn as_nanos(self, duration: u64) -> u64 {
81 use TimeUnit::*;
82 let duration = match self {
83 Nanosecond => Duration::from_nanos(duration),
84 Microsecond => Duration::from_micros(duration),
85 Millisecond => Duration::from_millis(duration),
86 Second => Duration::from_secs(duration),
87 Minute => Duration::from_secs(duration * 60),
88 Hour => Duration::from_secs(duration * 60 * 60),
89 Day => Duration::from_secs(duration * 60 * 60 * 24),
90 };
91
92 duration.as_nanos() as u64
93 }
94}
95
96impl TryFrom<i32> for TimeUnit {
103 type Error = Error;
104
105 fn try_from(value: i32) -> Result<TimeUnit, Self::Error> {
106 match value {
107 0 => Ok(TimeUnit::Nanosecond),
108 1 => Ok(TimeUnit::Microsecond),
109 2 => Ok(TimeUnit::Millisecond),
110 3 => Ok(TimeUnit::Second),
111 4 => Ok(TimeUnit::Minute),
112 5 => Ok(TimeUnit::Hour),
113 6 => Ok(TimeUnit::Day),
114 e => Err(ErrorKind::TimeUnit(e).into()),
115 }
116 }
117}