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>);