calends/interval/
marker.rs

1use chrono::NaiveDate;
2
3use crate::IntervalLike;
4
5pub trait Start: IntervalLike {
6    fn start(&self) -> NaiveDate {
7        self.start_opt().unwrap()
8    }
9}
10
11pub trait End: IntervalLike {
12    fn end(&self) -> NaiveDate {
13        self.end_opt().unwrap()
14    }
15}
16
17#[cfg(test)]
18mod tests {
19    use crate::{interval::marker, Interval, RelativeDuration, UnboundedStartInterval};
20
21    use super::*;
22
23    #[test]
24    fn test_all_intervals() {
25        let i1 = UnboundedStartInterval::new(NaiveDate::from_ymd(2022, 1, 1));
26        let i2 = Interval::from_start(NaiveDate::from_ymd(2022, 1, 1), RelativeDuration::days(2));
27
28        fn interval<I: IntervalLike + marker::End>(interval: I) -> (Option<NaiveDate>, NaiveDate) {
29            (interval.start_opt(), interval.end())
30        }
31
32        let i1 = interval(i1);
33        assert_eq!(i1.0, None);
34        assert_eq!(i1.1, NaiveDate::from_ymd(2022, 1, 1));
35
36        let i2 = interval(i2);
37        assert_eq!(i2.0, Some(NaiveDate::from_ymd(2022, 1, 1)));
38        assert_eq!(i2.1, NaiveDate::from_ymd(2022, 1, 2));
39    }
40}