proto_types/duration/
duration_data.rs

1use super::data::{Days, Hours, Minutes, Months, Seconds, Weeks, Years};
2use crate::Duration;
3
4const SECONDS_PER_MINUTE: u64 = 60;
5const SECONDS_PER_HOUR: u64 = 3600;
6const SECONDS_PER_DAY: u64 = 86400;
7const SECONDS_PER_WEEK: u64 = 604800;
8const SECONDS_PER_MONTH_AVG: u64 = 2_629_746;
9const SECONDS_PER_YEAR_AVG: u64 = 31_556_952;
10
11/// The data for a given Duration
12#[derive(Debug, Default, Clone)]
13pub struct DurationData {
14  pub years: Years,
15  pub months: Months,
16  pub weeks: Weeks,
17  pub days: Days,
18  pub hours: Hours,
19  pub minutes: Minutes,
20  pub seconds: Seconds,
21  pub is_negative: bool,
22}
23
24impl Duration {
25  /// Whether the duration is negative or not.
26  pub fn is_negative(&self) -> bool {
27    self.normalized().seconds < 0
28  }
29
30  /// Creates a DurationData instance.
31  pub fn get_data(&self) -> DurationData {
32    let mut total_seconds = self.seconds.unsigned_abs();
33    let years = Years {
34      value: total_seconds / SECONDS_PER_YEAR_AVG,
35    };
36    total_seconds %= SECONDS_PER_YEAR_AVG;
37
38    let months = Months {
39      value: total_seconds / SECONDS_PER_MONTH_AVG,
40    };
41    total_seconds %= SECONDS_PER_MONTH_AVG;
42
43    let weeks = Weeks {
44      value: total_seconds / SECONDS_PER_WEEK,
45    };
46    total_seconds %= SECONDS_PER_WEEK;
47
48    let days = Days {
49      value: total_seconds / SECONDS_PER_DAY,
50    };
51    total_seconds %= SECONDS_PER_DAY;
52
53    let hours = Hours {
54      value: total_seconds / SECONDS_PER_HOUR,
55    };
56    total_seconds %= SECONDS_PER_HOUR;
57
58    let minutes = Minutes {
59      value: total_seconds / SECONDS_PER_MINUTE,
60    };
61    let seconds = Seconds {
62      value: total_seconds % SECONDS_PER_MINUTE,
63    };
64
65    DurationData {
66      years,
67      months,
68      weeks,
69      days,
70      hours,
71      minutes,
72      seconds,
73      is_negative: self.is_negative(),
74    }
75  }
76}