Skip to main content

date_differencer/add_diff/
time_support.rs

1use time::{Date, Month, OffsetDateTime, PrimitiveDateTime, Time, UtcDateTime};
2
3use super::{AddDateTimeDiff, AddedDateTimeParts, DateTimeDiff, add_date_time_parts};
4
5#[inline]
6fn date_time_from_parts(parts: AddedDateTimeParts) -> Option<(Date, Time)> {
7    let date =
8        Date::from_calendar_date(parts.year, Month::try_from(parts.month).ok()?, parts.day).ok()?;
9
10    let time =
11        Time::from_hms_nano(parts.hour, parts.minute, parts.second, parts.nanosecond).ok()?;
12
13    Some((date, time))
14}
15
16impl AddDateTimeDiff for PrimitiveDateTime {
17    type Output = Option<PrimitiveDateTime>;
18
19    #[inline]
20    fn add_date_time_diff(self, date_time_diff: &impl DateTimeDiff) -> Self::Output {
21        let (date, time) = date_time_from_parts(add_date_time_parts(&self, date_time_diff)?)?;
22
23        Some(PrimitiveDateTime::new(date, time))
24    }
25}
26
27impl AddDateTimeDiff for OffsetDateTime {
28    type Output = Option<OffsetDateTime>;
29
30    #[inline]
31    fn add_date_time_diff(self, date_time_diff: &impl DateTimeDiff) -> Self::Output {
32        let (date, time) = date_time_from_parts(add_date_time_parts(&self, date_time_diff)?)?;
33
34        Some(OffsetDateTime::new_in_offset(date, time, self.offset()))
35    }
36}
37
38impl AddDateTimeDiff for UtcDateTime {
39    type Output = Option<UtcDateTime>;
40
41    #[inline]
42    fn add_date_time_diff(self, date_time_diff: &impl DateTimeDiff) -> Self::Output {
43        let (date, time) = date_time_from_parts(add_date_time_parts(&self, date_time_diff)?)?;
44
45        Some(UtcDateTime::new(date, time))
46    }
47}