Skip to main content

proto_types/duration/
duration_data.rs

1use super::data::{Days, Hours, Minutes, Months, Seconds, Weeks, Years};
2use crate::{Duration, constants::*};
3
4/// The data for a given Duration
5#[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	/// Creates a DurationData instance.
19	#[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}