syn_args/macro_args/def/
object.rs1use 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}