syn_args/macro_args/def/
array.rs1use 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 for v in v.0.iter() {
50 let item = T::try_from(v)?;
51 res.push(item);
53 }
54 return Ok(Self(res));
55 }
56 }
57 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 for v in v.0.iter() {
80 let item = T::try_from(v).unwrap();
81 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
92impl<'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}