time/
rand.rs

1//! Implementation of [`Distribution`] for various structs.
2
3use 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        // Safety: The Julian day number is in range.
21        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}