proto_types/duration/
duration_data.rs1use super::data::{Days, Hours, Minutes, Months, Seconds, Weeks, Years};
2use crate::{Duration, constants::*};
3
4#[derive(Debug, Default, Clone)]
6pub struct DurationData {
7 pub years: Years,
8 pub months: Months,
9 pub weeks: Weeks,
10 pub days: Days,
11 pub hours: Hours,
12 pub minutes: Minutes,
13 pub seconds: Seconds,
14 pub is_negative: bool,
15}
16
17impl Duration {
18 #[must_use]
20 pub const fn get_data(&self) -> DurationData {
21 let mut total_seconds = self.seconds.unsigned_abs();
22 let years = Years {
23 value: total_seconds / SECONDS_PER_YEAR_AVG,
24 };
25 total_seconds %= SECONDS_PER_YEAR_AVG;
26
27 let months = Months {
28 value: total_seconds / SECONDS_PER_MONTH_AVG,
29 };
30 total_seconds %= SECONDS_PER_MONTH_AVG;
31
32 let weeks = Weeks {
33 value: total_seconds / SECONDS_PER_WEEK,
34 };
35 total_seconds %= SECONDS_PER_WEEK;
36
37 let days = Days {
38 value: total_seconds / SECONDS_PER_DAY,
39 };
40 total_seconds %= SECONDS_PER_DAY;
41
42 let hours = Hours {
43 value: total_seconds / SECONDS_PER_HOUR,
44 };
45 total_seconds %= SECONDS_PER_HOUR;
46
47 let minutes = Minutes {
48 value: total_seconds / SECONDS_PER_MINUTE,
49 };
50 let seconds = Seconds {
51 value: total_seconds % SECONDS_PER_MINUTE,
52 };
53
54 DurationData {
55 years,
56 months,
57 weeks,
58 days,
59 hours,
60 minutes,
61 seconds,
62 is_negative: self.is_negative(),
63 }
64 }
65}