1use std::fmt::Debug;
24use std::ops::{Deref, DerefMut};
25
26use arbitrary::{Arbitrary, Error, Result, Unstructured};
27use serde_json::{Map, Number, Value};
28
29#[derive(Clone)]
30pub struct ArbitraryValue(Value);
31
32impl<'a> Arbitrary<'a> for ArbitraryValue {
33 fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
34 let variant: u8 = u.arbitrary()?;
35
36 let variant = match variant % 6 {
37 0 => Value::Null,
38 1 => Value::Bool(u.arbitrary()?),
39 2 => {
40 let variant: u8 = u.arbitrary()?;
41 let number = match variant % 3 {
42 0 => Number::from_f64(u.arbitrary()?).ok_or(Error::IncorrectFormat)?,
43 1 => u.arbitrary::<u64>()?.into(),
44 2 => u.arbitrary::<i64>()?.into(),
45 _ => unreachable!(),
46 };
47 Value::Number(number)
48 }
49 3 => Value::String(u.arbitrary()?),
50 4 => Value::Array(u.arbitrary::<ArbitraryArray>()?.into()),
51 5 => Value::Object(u.arbitrary::<ArbitraryObject>()?.into()),
52 _ => unreachable!(),
53 };
54
55 Ok(ArbitraryValue(variant))
56 }
57}
58
59#[derive(Clone)]
60pub struct ArbitraryObject(Map<String, Value>);
61
62impl<'a> Arbitrary<'a> for ArbitraryObject {
63 fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
64 let map = u
65 .arbitrary_iter()?
66 .map(|result| result.map(|(key, value): (String, ArbitraryValue)| (key, value.0)))
67 .collect::<Result<Map<String, Value>>>()?;
68
69 Ok(ArbitraryObject(map))
70 }
71}
72
73#[derive(Clone)]
74pub struct ArbitraryArray(Vec<Value>);
75
76impl<'a> Arbitrary<'a> for ArbitraryArray {
77 fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
78 let array = u
79 .arbitrary_iter()?
80 .map(|result| result.map(|json: ArbitraryValue| json.0))
81 .collect::<Result<Vec<Value>>>()?;
82
83 Ok(ArbitraryArray(array))
84 }
85}
86
87macro_rules! impl_derefrom {
88 ($arbitrary:ty, $serde:ty) => {
89 impl Deref for $arbitrary {
90 type Target = $serde;
91
92 fn deref(&self) -> &Self::Target {
93 &self.0
94 }
95 }
96
97 impl DerefMut for $arbitrary {
98 fn deref_mut(&mut self) -> &mut Self::Target {
99 &mut self.0
100 }
101 }
102
103 impl From<$serde> for $arbitrary {
104 fn from(value: $serde) -> Self {
105 Self(value)
106 }
107 }
108
109 impl From<$arbitrary> for $serde {
110 fn from(value: $arbitrary) -> Self {
111 value.0
112 }
113 }
114
115 impl Debug for $arbitrary {
116 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
117 self.0.fmt(f)
118 }
119 }
120 };
121}
122
123impl_derefrom!(ArbitraryValue, Value);
124impl_derefrom!(ArbitraryObject, Map<String, Value>);
125impl_derefrom!(ArbitraryArray, Vec<Value>);