type_safe_id/
arbitrary.rs

1use arbitrary::{Arbitrary, Result, Unstructured};
2use arrayvec::ArrayString;
3
4use crate::{DynamicType, StaticType, TypeSafeId};
5
6#[cfg_attr(docsrs, doc(cfg(feature = "arbitrary")))]
7impl<'a, T: StaticType> Arbitrary<'a> for TypeSafeId<T> {
8    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
9        let millis = u.arbitrary::<u64>()? & 0xFFFF_FFFF_FFFF; // 48 bits
10        let data: [u8; 10] = u.arbitrary()?;
11
12        Ok(Self::from_type_and_uuid(
13            T::default(),
14            uuid::Builder::from_unix_timestamp_millis(millis, &data).into_uuid(),
15        ))
16    }
17}
18
19#[cfg_attr(docsrs, doc(cfg(feature = "arbitrary")))]
20impl<'a> Arbitrary<'a> for DynamicType {
21    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
22        let size = u.arbitrary_len::<u8>()?;
23        let mut str = ArrayString::<63>::new();
24        while !str.is_full() && str.len() < size {
25            match u.peek_bytes(1) {
26                Some([b @ b'a'..=b'z']) => {
27                    str.push(*b as char);
28                    u.bytes(1)?;
29                }
30                _ => break,
31            }
32        }
33        Ok(DynamicType(str))
34    }
35}
36
37#[cfg_attr(docsrs, doc(cfg(feature = "arbitrary")))]
38impl<'a> Arbitrary<'a> for TypeSafeId<DynamicType> {
39    fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
40        let tag: DynamicType = u.arbitrary()?;
41        let millis = u.arbitrary::<u64>()? & 0xFFFF_FFFF_FFFF; // 48 bits
42        let data: [u8; 10] = u.arbitrary()?;
43
44        Ok(Self::from_type_and_uuid(
45            tag,
46            uuid::Builder::from_unix_timestamp_millis(millis, &data).into_uuid(),
47        ))
48    }
49}