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