syn_args/macro_args/def/
object.rs

1use super::*;
2
3#[derive(Debug, Clone)]
4pub struct Object<T>(pub HashMap<std::string::String, T>);
5
6impl<T: PartialEq> PartialEq for Object<T> {
7    fn eq(&self, other: &Self) -> bool {
8        self.0.keys().eq(other.0.keys()) && self.0.values().eq(other.0.values())
9    }
10}
11
12impl<T> Deref for Object<T> {
13    type Target = HashMap<std::string::String, T>;
14
15    fn deref(&self) -> &Self::Target {
16        &self.0
17    }
18}
19
20impl<T> DerefMut for Object<T> {
21    fn deref_mut(&mut self) -> &mut Self::Target {
22        &mut self.0
23    }
24}
25
26impl<'a, T> TryFrom<Transform<'a>> for def::Object<T>
27where
28    T: TryFrom<&'a Value, Error = Error>,
29{
30    type Error = Error;
31
32    fn try_from(value: Transform<'a>) -> Result<Self, Self::Error> {
33        if let Value::Object(obj) = value.value {
34            if let Some(v) = obj.get(value.key) {
35                if let Value::Object(obj) = v {
36                    let mut res = HashMap::new();
37                    for (k, v) in obj.0.iter() {
38                        res.insert(k.clone(), T::try_from(v)?);
39                    }
40                    return Ok(def::Object(res));
41                }
42            }
43        }
44
45        Err(Error::new(proc_macro2::Span::call_site(), "Expected TryFrom<Transform<'_>> for def::Object<T>"))
46    }
47}
48
49impl TryFrom<&Value> for def::Object<Value> {
50    type Error = Error;
51
52    fn try_from(value: &Value) -> Result<Self, Self::Error> {
53        match value {
54            Value::Object(obj) => {
55                let mut res = HashMap::new();
56                for (k, v) in obj.0.iter() {
57                    res.insert(k.clone(), v.clone());
58                }
59                Ok(def::Object(res))
60            }
61            _ => Err(Error::new(proc_macro2::Span::call_site(), "Expected Object")),
62        }
63    }
64}