syn_args/macro_args/def/
array.rs

1use super::*;
2
3#[derive(Debug, PartialEq, Clone)]
4pub struct Array<Item>(pub Vec<Item>);
5
6impl<T> Array<T> {
7    pub fn merge(mut self, b: Array<T>) -> Self {
8        self.0.extend(b.0);
9        self
10    }
11}
12
13impl<Item> Deref for Array<Item> {
14    type Target = Vec<Item>;
15
16    fn deref(&self) -> &Self::Target {
17        &self.0
18    }
19}
20
21impl<Item> DerefMut for Array<Item> {
22    fn deref_mut(&mut self) -> &mut Self::Target {
23        &mut self.0
24    }
25}
26
27impl<'a, T> TryFrom<Transform<'a>> for def::Array<T>
28where
29    T: TryFrom<&'a Value, Error = Error> + Debug,
30{
31    type Error = Error;
32
33    #[cfg(not(feature = "loose_mode"))]
34    fn try_from(value: Transform<'a>) -> Result<Self, Self::Error> {
35        if let Value::Object(obj) = value.value {
36            if let Some(Value::Array(v)) = obj.get(value.key) {
37                let mut res = vec![];
38                for v in v.0.iter() {
39                    let item = T::try_from(v).unwrap();
40                    res.push(item);
41                }
42                return Ok(Self(res));
43            }
44        } else if let Value::Array(v) = value.value {
45            let index = value.key.parse::<usize>().map_err(|_| Error::new(proc_macro2::Span::call_site(), "Expected usize"))?;
46            if let Some(Value::Array(v)) = v.get(index) {
47                let mut res = vec![];
48                // println!("Array: {:?}", v);
49                for v in v.0.iter() {
50                    let item = T::try_from(v)?;
51                    // println!("Array: end");
52                    res.push(item);
53                }
54                return Ok(Self(res));
55            }
56        }
57        // println!("Failed to parse: {:?}", (value.key, value.value));
58        Err(Error::new(proc_macro2::Span::call_site(), "Expected Transform Into def::Array"))
59    }
60
61    #[cfg(feature = "loose_mode")]
62    fn try_from(value: Transform<'a>) -> Result<Self, Self::Error> {
63        if let Value::Object(obj) = value.value {
64            if let Some(Value::Array(v)) = obj.get(value.key) {
65                let mut res = vec![];
66                for v in v.0.iter() {
67                    let item = T::try_from(v).unwrap();
68                    res.push(item);
69                }
70                return Ok(Self(res));
71            } else {
72                return Ok(Self(vec![]));
73            }
74        } else if let Value::Array(v) = value.value {
75            let index = value.key.parse::<usize>().unwrap();
76            if let Some(Value::Array(v)) = v.get(index) {
77                let mut res = vec![];
78                // println!("Array: {:?}", v);
79                for v in v.0.iter() {
80                    let item = T::try_from(v).unwrap();
81                    // println!("Array: end");
82                    res.push(item);
83                }
84                return Ok(Self(res));
85            }
86        }
87
88        Err(Error::new(proc_macro2::Span::call_site(), "Expected Array"))
89    }
90}
91
92// impl<'a, T> TryInto<def::Array<T>> for Transform<'a>
93// where
94//     T: TryFrom<&'a Value, Error = Error>,
95// {
96//     type Error = Error;
97
98//     #[cfg(feature = "loose_mode")]
99//     fn try_into(self) -> Result<def::Array<T>, Self::Error> {
100//         if let Value::Object(obj) = self.value {
101//             if let Some(Value::Array(arr)) = obj.get(self.key) {
102//                 return Ok(def::Array(arr.iter().map(|v| T::try_from(v)).collect::<Result<Vec<T>, Self::Error>>()?));
103//             } else {
104//                 return Ok(def::Array(Vec::new()));
105//             }
106//         } else if let Value::Array(v) = self.value {
107//             println!("Array: {:?}", v);
108//             let index = self.key.parse::<usize>().unwrap();
109//             if let Some(value) = v.get(index) {
110//                 return Ok(def::Array(vec![T::try_from(value)?]));
111//             }
112//         }
113
114//         Err(Error::new(proc_macro2::Span::call_site(), "Expected Array"))
115//     }
116
117//     #[cfg(not(feature = "loose_mode"))]
118//     fn try_into(self) -> Result<def::Array<T>, Self::Error> {
119//         if let Value::Object(obj) = self.value {
120//             if let Some(Value::Array(arr)) = obj.get(self.key) {
121//                 return Ok(def::Array(arr.iter().map(|v| T::try_from(v)).collect::<Result<Vec<T>, Self::Error>>()?));
122//             }
123//         }
124
125//         Err(Error::new(proc_macro2::Span::call_site(), "Expected Array"))
126//     }
127// }
128
129impl<'a, Item> TryFrom<&'a Value> for def::Array<Item>
130where
131    Item: TryFrom<&'a Value, Error = syn::Error>,
132{
133    type Error = syn::Error;
134
135    fn try_from(value: &'a Value) -> Result<Self, Self::Error> {
136        match value {
137            Value::Array(arr) => {
138                let mut res = vec![];
139                for v in arr.0.iter() {
140                    let item: Item = Item::try_from(v)?;
141                    res.push(item);
142                }
143                Ok(def::Array(res))
144            }
145            _ => Err(Error::new(proc_macro2::Span::call_site(), "Expected Array")),
146        }
147    }
148}