time_range_ext/
time_range.rs

1use time::OffsetDateTime;
2
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6pub mod vec_range;
7pub mod time_range_ext;
8
9#[derive(Debug, Eq, PartialEq, Clone, Copy)]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub struct TimeRange {
12    #[cfg_attr(feature = "serde", serde(with = "time::serde::rfc3339"))]
13    pub start: OffsetDateTime,
14    #[cfg_attr(feature = "serde", serde(with = "time::serde::rfc3339"))]
15    pub end: OffsetDateTime,
16}
17
18impl TimeRange {
19    pub fn duration(&self) -> time::Duration {
20        self.end - self.start
21    }
22
23    pub fn from(start: OffsetDateTime, end: OffsetDateTime) -> Self {
24        TimeRange { start, end }
25    }
26
27    pub fn overlaps(&self, other: &TimeRange) -> bool {
28        self.start <= other.end && other.start <= self.end
29    }
30
31    pub fn merge(&self, other: &TimeRange) -> TimeRange {
32        TimeRange {
33            start: self.start.min(other.start),
34            end: self.end.max(other.end),
35        }
36    }
37}