| 37 | } |
| 38 | |
| 39 | fn arbitrary_value( |
| 40 | u: &mut arbitrary::Unstructured<'_>, |
| 41 | mut depth: u32, |
| 42 | ) -> arbitrary::Result<Value> { |
| 43 | if u.is_empty() { |
| 44 | if depth > 0 { |
| 45 | return Err(arbitrary::Error::NotEnoughData); |
| 46 | } |
| 47 | depth += 1; |
| 48 | } |
| 49 | |
| 50 | Ok( |
| 51 | match (u64::from(<u32 as arbitrary::Arbitrary>::arbitrary(u)?) * 11u64) >> 32 { |
| 52 | 0u64 => { |
| 53 | let length = <u8 as arbitrary::Arbitrary>::arbitrary(u)?; |
| 54 | let mut list = Vec::with_capacity(length as usize); |
| 55 | for _ in 0..length { |
| 56 | list.push(arbitrary_value(u, depth)?); |
| 57 | } |
| 58 | Value::List(Arc::new(list)) |
| 59 | } |
| 60 | 1u64 => { |
| 61 | let length = <u8 as arbitrary::Arbitrary>::arbitrary(u)?; |
| 62 | let mut map = HashMap::with_capacity(length as usize); |
| 63 | for _ in 0..length { |
| 64 | map.insert(arbitrary_key(u)?, arbitrary_value(u, depth)?); |
| 65 | } |
| 66 | Value::Map(Map { map: Arc::new(map) }) |
| 67 | } |
| 68 | 2u64 => Value::Int(arbitrary::Arbitrary::arbitrary(u)?), |
| 69 | 3u64 => Value::UInt(arbitrary::Arbitrary::arbitrary(u)?), |
| 70 | 4u64 => Value::Float(arbitrary::Arbitrary::arbitrary(u)?), |
| 71 | 5u64 => Value::String(arbitrary::Arbitrary::arbitrary(u)?), |
| 72 | 6u64 => Value::Bytes(arbitrary::Arbitrary::arbitrary(u)?), |
| 73 | 7u64 => Value::Bool(arbitrary::Arbitrary::arbitrary(u)?), |
| 74 | 8u64 => Value::Duration(chrono::Duration::nanoseconds( |
| 75 | arbitrary::Arbitrary::arbitrary(u)?, |
| 76 | )), |
| 77 | 9u64 => Value::Timestamp( |
| 78 | chrono::Utc |
| 79 | .timestamp_nanos(arbitrary::Arbitrary::arbitrary(u)?) |
| 80 | .into(), |
| 81 | ), |
| 82 | 10u64 => Value::Null, |
| 83 | _ => unreachable!(), |
| 84 | }, |
| 85 | ) |
| 86 | } |
| 87 | |
| 88 | fn arbitrary_key(u: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Key> { |
| 89 | Ok( |