humanize_duration/
impls.rs

1use std::fmt::{Display, Formatter};
2
3#[allow(unused_imports)]
4use std::ops::Add;
5
6use crate::types::{DefaultFormatter, DurationParts};
7use crate::{Day, Duration, FormattedDuration, Hour, Micro, Millis, Minute, Month, Nano, Second, Truncate, Unit, Year};
8
9impl Default for Truncate {
10	fn default() -> Self {
11		Truncate::Millis
12	}
13}
14
15impl Display for FormattedDuration {
16	fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
17		let parts: DurationParts = self.duration.into();
18		self.formatter.format(f, parts, self.truncate_option)
19	}
20}
21
22impl From<time::Duration> for Duration {
23	fn from(value: time::Duration) -> Self {
24		Duration {
25			secs: value.as_seconds_f64() as i64,
26			nanos: value.subsec_nanoseconds(),
27		}
28	}
29}
30
31impl From<core::time::Duration> for Duration {
32	fn from(value: core::time::Duration) -> Self {
33		Duration {
34			secs: value.as_secs() as i64,
35			nanos: value.subsec_nanos() as i32,
36		}
37	}
38}
39
40#[cfg(feature = "chrono")]
41impl From<chrono::Duration> for Duration {
42	fn from(value: chrono::Duration) -> Self {
43		let secs = value.num_seconds();
44		let d = value
45			.checked_sub(&chrono::Duration::seconds(secs))
46			.unwrap_or(chrono::Duration::zero());
47		let nanos = d.num_nanoseconds().unwrap_or(0) as i32;
48
49		Duration { secs, nanos }
50	}
51}
52
53impl From<Duration> for time::Duration {
54	fn from(value: Duration) -> Self {
55		time::Duration::new(value.secs, value.nanos)
56	}
57}
58
59impl From<Duration> for core::time::Duration {
60	fn from(value: Duration) -> Self {
61		core::time::Duration::new(value.secs.abs() as u64, value.nanos.abs() as u32)
62	}
63}
64
65#[cfg(feature = "chrono")]
66impl From<Duration> for chrono::Duration {
67	fn from(value: Duration) -> Self {
68		chrono::Duration::seconds(value.secs).add(chrono::Duration::nanoseconds(value.nanos as i64))
69	}
70}
71
72impl DurationParts {
73	pub(crate) fn is_empty(&self) -> bool {
74		self.original_seconds == 0 && self.original_nanos == 0
75	}
76}
77
78impl crate::Formatter for DefaultFormatter {
79	fn get(&self, truncate: Truncate) -> Box<dyn Unit> {
80		match truncate {
81			Truncate::Nano => Box::new(Nano),
82			Truncate::Micro => Box::new(Micro),
83			Truncate::Millis => Box::new(Millis),
84			Truncate::Second => Box::new(Second),
85			Truncate::Minute => Box::new(Minute),
86			Truncate::Hour => Box::new(Hour),
87			Truncate::Day => Box::new(Day),
88			Truncate::Month => Box::new(Month),
89			Truncate::Year => Box::new(Year),
90		}
91	}
92
93	fn format(&self, f: &mut std::fmt::Formatter<'_>, parts: DurationParts, truncate: Truncate) -> core::fmt::Result {
94		self.format_default(f, parts, truncate)
95	}
96}