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