1use rand::distributions::{Distribution, Standard};
4use rand::Rng;
5
6use crate::{
7 Date, Duration, Month, OffsetDateTime, PrimitiveDateTime, Time, UtcDateTime, UtcOffset, Weekday,
8};
9
10impl Distribution<Time> for Standard {
11 #[inline]
12 fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Time {
13 Time::from_hms_nanos_ranged(rng.r#gen(), rng.r#gen(), rng.r#gen(), rng.r#gen())
14 }
15}
16
17impl Distribution<Date> for Standard {
18 #[inline]
19 fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Date {
20 unsafe {
22 Date::from_julian_day_unchecked(
23 rng.gen_range(Date::MIN.to_julian_day()..=Date::MAX.to_julian_day()),
24 )
25 }
26 }
27}
28
29impl Distribution<UtcOffset> for Standard {
30 #[inline]
31 fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> UtcOffset {
32 UtcOffset::from_hms_ranged(rng.r#gen(), rng.r#gen(), rng.r#gen())
33 }
34}
35
36impl Distribution<PrimitiveDateTime> for Standard {
37 #[inline]
38 fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> PrimitiveDateTime {
39 PrimitiveDateTime::new(Self.sample(rng), Self.sample(rng))
40 }
41}
42
43impl Distribution<UtcDateTime> for Standard {
44 #[inline]
45 fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> UtcDateTime {
46 UtcDateTime::new(Self.sample(rng), Self.sample(rng))
47 }
48}
49
50impl Distribution<OffsetDateTime> for Standard {
51 #[inline]
52 fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> OffsetDateTime {
53 let date_time: PrimitiveDateTime = Self.sample(rng);
54 date_time.assume_offset(Self.sample(rng))
55 }
56}
57
58impl Distribution<Duration> for Standard {
59 #[inline]
60 fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Duration {
61 Duration::new_ranged(rng.r#gen(), rng.r#gen())
62 }
63}
64
65impl Distribution<Weekday> for Standard {
66 #[inline]
67 fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Weekday {
68 use Weekday::*;
69
70 match rng.gen_range(0u8..7) {
71 0 => Monday,
72 1 => Tuesday,
73 2 => Wednesday,
74 3 => Thursday,
75 4 => Friday,
76 5 => Saturday,
77 val => {
78 debug_assert!(val == 6);
79 Sunday
80 }
81 }
82 }
83}
84
85impl Distribution<Month> for Standard {
86 #[inline]
87 fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Month {
88 use Month::*;
89 match rng.gen_range(1u8..=12) {
90 1 => January,
91 2 => February,
92 3 => March,
93 4 => April,
94 5 => May,
95 6 => June,
96 7 => July,
97 8 => August,
98 9 => September,
99 10 => October,
100 11 => November,
101 val => {
102 debug_assert!(val == 12);
103 December
104 }
105 }
106 }
107}