| //! Implementation of [`Distribution`] for various structs. |
| |
| use rand::distributions::{Distribution, Standard}; |
| use rand::Rng; |
| |
| use crate::convert::*; |
| use crate::{Date, Duration, Month, OffsetDateTime, PrimitiveDateTime, Time, UtcOffset, Weekday}; |
| |
| impl Distribution<Time> for Standard { |
| fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Time { |
| Time::__from_hms_nanos_unchecked( |
| rng.gen_range(0..Hour.per(Day)), |
| rng.gen_range(0..Minute.per(Hour)), |
| rng.gen_range(0..Second.per(Minute)), |
| rng.gen_range(0..Nanosecond.per(Second)), |
| ) |
| } |
| } |
| |
| impl Distribution<Date> for Standard { |
| fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Date { |
| Date::from_julian_day_unchecked( |
| rng.gen_range(Date::MIN.to_julian_day()..=Date::MAX.to_julian_day()), |
| ) |
| } |
| } |
| |
| impl Distribution<UtcOffset> for Standard { |
| fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> UtcOffset { |
| let seconds = rng.gen_range(-(Second.per(Day) as i32 - 1)..=(Second.per(Day) as i32 - 1)); |
| UtcOffset::__from_hms_unchecked( |
| (seconds / Second.per(Hour) as i32) as _, |
| ((seconds % Second.per(Hour) as i32) / Minute.per(Hour) as i32) as _, |
| (seconds % Second.per(Minute) as i32) as _, |
| ) |
| } |
| } |
| |
| impl Distribution<PrimitiveDateTime> for Standard { |
| fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> PrimitiveDateTime { |
| PrimitiveDateTime::new(Self.sample(rng), Self.sample(rng)) |
| } |
| } |
| |
| impl Distribution<OffsetDateTime> for Standard { |
| fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> OffsetDateTime { |
| let date_time: PrimitiveDateTime = Self.sample(rng); |
| date_time.assume_offset(Self.sample(rng)) |
| } |
| } |
| |
| impl Distribution<Duration> for Standard { |
| fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Duration { |
| Duration::nanoseconds_i128( |
| rng.gen_range(Duration::MIN.whole_nanoseconds()..=Duration::MAX.whole_nanoseconds()), |
| ) |
| } |
| } |
| |
| impl Distribution<Weekday> for Standard { |
| fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Weekday { |
| use Weekday::*; |
| |
| match rng.gen_range(0u8..7) { |
| 0 => Monday, |
| 1 => Tuesday, |
| 2 => Wednesday, |
| 3 => Thursday, |
| 4 => Friday, |
| 5 => Saturday, |
| val => { |
| debug_assert!(val == 6); |
| Sunday |
| } |
| } |
| } |
| } |
| |
| impl Distribution<Month> for Standard { |
| fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Month { |
| use Month::*; |
| match rng.gen_range(1u8..=12) { |
| 1 => January, |
| 2 => February, |
| 3 => March, |
| 4 => April, |
| 5 => May, |
| 6 => June, |
| 7 => July, |
| 8 => August, |
| 9 => September, |
| 10 => October, |
| 11 => November, |
| val => { |
| debug_assert!(val == 12); |
| December |
| } |
| } |
| } |
| } |