date_differencer/add_diff/
time_support.rs1use 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}