type_safe_id/
arbitrary.rs1use 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; 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; 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}