Skip to main content

hegel/extras/jiff/
default.rs

1use jiff::civil::{Date, DateTime, ISOWeekDate, Time};
2use jiff::tz::{AmbiguousOffset, Offset, TimeZone};
3use jiff::{SignedDuration, Span, Timestamp, Zoned};
4
5use crate::generators::{self as gs, BoxedGenerator, DefaultGenerator, Generator, Mapped, one_of};
6
7use super::{
8    DateGenerator, DateTimeGenerator, OffsetGenerator, SignedDurationGenerator, SpanGenerator,
9    TimeGenerator, TimestampGenerator, ZonedGenerator, dates, datetimes, offsets, signed_durations,
10    spans, times, timestamps, zoneds,
11};
12
13impl DefaultGenerator for Date {
14    type Generator = DateGenerator;
15    fn default_generator() -> Self::Generator {
16        dates()
17    }
18}
19
20impl DefaultGenerator for Time {
21    type Generator = TimeGenerator;
22    fn default_generator() -> Self::Generator {
23        times()
24    }
25}
26
27impl DefaultGenerator for DateTime {
28    type Generator = DateTimeGenerator;
29    fn default_generator() -> Self::Generator {
30        datetimes()
31    }
32}
33
34impl DefaultGenerator for ISOWeekDate {
35    type Generator = Mapped<Date, ISOWeekDate, fn(Date) -> ISOWeekDate, DateGenerator>;
36    fn default_generator() -> Self::Generator {
37        dates().map(|d| d.iso_week_date())
38    }
39}
40
41impl DefaultGenerator for Timestamp {
42    type Generator = TimestampGenerator;
43    fn default_generator() -> Self::Generator {
44        timestamps()
45    }
46}
47
48impl DefaultGenerator for Span {
49    type Generator = SpanGenerator;
50    fn default_generator() -> Self::Generator {
51        spans()
52    }
53}
54
55impl DefaultGenerator for SignedDuration {
56    type Generator = SignedDurationGenerator;
57    fn default_generator() -> Self::Generator {
58        signed_durations()
59    }
60}
61
62impl DefaultGenerator for Offset {
63    type Generator = OffsetGenerator;
64    fn default_generator() -> Self::Generator {
65        offsets()
66    }
67}
68
69impl DefaultGenerator for TimeZone {
70    type Generator = BoxedGenerator<'static, TimeZone>;
71    fn default_generator() -> Self::Generator {
72        one_of([
73            gs::just::<TimeZone>(TimeZone::UTC).boxed(),
74            gs::just::<TimeZone>(TimeZone::unknown()).boxed(),
75            offsets().map(TimeZone::fixed).boxed(),
76        ])
77        .boxed()
78    }
79}
80
81impl DefaultGenerator for Zoned {
82    type Generator = ZonedGenerator;
83    fn default_generator() -> Self::Generator {
84        zoneds()
85    }
86}
87
88impl DefaultGenerator for AmbiguousOffset {
89    type Generator = BoxedGenerator<'static, AmbiguousOffset>;
90    fn default_generator() -> Self::Generator {
91        use crate::tuples;
92        one_of([
93            offsets()
94                .map(|offset| AmbiguousOffset::Unambiguous { offset })
95                .boxed(),
96            tuples!(offsets(), offsets())
97                .map(|(before, after)| AmbiguousOffset::Gap { before, after })
98                .boxed(),
99            tuples!(offsets(), offsets())
100                .map(|(before, after)| AmbiguousOffset::Fold { before, after })
101                .boxed(),
102        ])
103        .boxed()
104    }
105}