Skip to main content

defuse_time/
arbitrary.rs

1use arbitrary::{Arbitrary, Result, Unstructured};
2use arbitrary_with::ArbitraryAs;
3
4use crate::{Overflow, Timestamp};
5
6impl<'a> Arbitrary<'a> for Timestamp {
7    #[inline]
8    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
9        let nanos = u.int_in_range(Self::MIN.as_nanos()..=Self::MAX.as_nanos())?;
10        Ok(Self::from_nanos(nanos).ok_or(Overflow).unwrap())
11    }
12}
13
14pub struct RangeNanos<const FROM: i128, const TO: i128 = { Timestamp::MAX.as_nanos() }>;
15
16impl<'a, const FROM: i128, const TO: i128> ArbitraryAs<'a, Timestamp> for RangeNanos<FROM, TO> {
17    #[inline]
18    fn arbitrary_as(u: &mut Unstructured<'a>) -> Result<Timestamp> {
19        let nanos = u.int_in_range(FROM..=TO)?;
20        Ok(Timestamp::from_nanos(nanos).ok_or(Overflow).unwrap())
21    }
22}