humanize_duration/
impls.rs1use 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}