1use std::fmt;
2use std::hash::{Hash, Hasher};
3use std::ops::{Deref, DerefMut};
4
5use deser_core::Order;
6
7use crate::tree;
8use crate::value::{Kind, Value};
9
10#[derive(Default)]
32pub struct Seq {
33 pub(crate) items: Vec<Value>,
34 pub(crate) order: Order,
35 pub(crate) repeated: bool,
36 pub(crate) ambiguous_empty: bool,
37}
38
39impl Seq {
40 pub const fn new() -> Seq {
42 Seq {
43 items: Vec::new(),
44 order: Order::Natural,
45 repeated: false,
46 ambiguous_empty: false,
47 }
48 }
49
50 pub fn with_capacity(capacity: usize) -> Seq {
52 Seq {
53 items: Vec::with_capacity(capacity),
54 order: Order::Natural,
55 repeated: false,
56 ambiguous_empty: false,
57 }
58 }
59
60 pub fn order(&self) -> Order {
62 self.order
63 }
64
65 pub fn set_order(&mut self, order: Order) {
67 self.order = order;
68 }
69
70 pub fn is_repeated(&self) -> bool {
76 self.repeated
77 }
78
79 pub fn set_repeated(&mut self, yes: bool) {
81 self.repeated = yes;
82 }
83
84 pub fn is_ambiguous_empty(&self) -> bool {
105 self.ambiguous_empty && self.items.is_empty()
106 }
107
108 pub fn set_ambiguous_empty(&mut self, yes: bool) {
110 self.ambiguous_empty = yes;
111 }
112
113 pub(crate) fn empty_like(&self, capacity: usize) -> Seq {
115 let mut seq = Seq::with_capacity(capacity);
116 seq.set_order(self.order);
117 seq.set_repeated(self.repeated);
118 seq.set_ambiguous_empty(self.ambiguous_empty);
119 seq
120 }
121
122 pub fn into_vec(mut self) -> Vec<Value> {
124 std::mem::take(&mut self.items)
125 }
126}
127
128impl Deref for Seq {
129 type Target = Vec<Value>;
130
131 fn deref(&self) -> &Vec<Value> {
132 &self.items
133 }
134}
135
136impl DerefMut for Seq {
137 fn deref_mut(&mut self) -> &mut Vec<Value> {
138 &mut self.items
139 }
140}
141
142impl Drop for Seq {
143 fn drop(&mut self) {
144 if self.items.iter().any(|item| item.has_children()) {
145 tree::drop_values(std::mem::take(&mut self.items));
146 }
147 }
148}
149
150impl Clone for Seq {
151 fn clone(&self) -> Seq {
152 match tree::clone_seq(self) {
153 Kind::Seq(seq) => seq,
154 _ => unreachable!(),
155 }
156 }
157}
158
159impl PartialEq for Seq {
160 fn eq(&self, other: &Seq) -> bool {
161 tree::eq_seq(self, other)
162 }
163}
164
165impl Eq for Seq {}
166
167impl Hash for Seq {
168 fn hash<H: Hasher>(&self, state: &mut H) {
169 tree::hash_seq(self, state);
170 }
171}
172
173impl fmt::Debug for Seq {
174 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
175 tree::fmt_seq(self, f)
176 }
177}
178
179impl From<Vec<Value>> for Seq {
180 fn from(items: Vec<Value>) -> Seq {
181 Seq {
182 items,
183 order: Order::Natural,
184 repeated: false,
185 ambiguous_empty: false,
186 }
187 }
188}
189
190impl From<Seq> for Vec<Value> {
191 fn from(seq: Seq) -> Vec<Value> {
192 seq.into_vec()
193 }
194}
195
196impl<T: Into<Value>> FromIterator<T> for Seq {
197 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Seq {
198 Seq::from(iter.into_iter().map(Into::into).collect::<Vec<_>>())
199 }
200}
201
202impl<T: Into<Value>> Extend<T> for Seq {
203 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
204 self.items.extend(iter.into_iter().map(Into::into));
205 }
206}
207
208impl IntoIterator for Seq {
209 type Item = Value;
210 type IntoIter = std::vec::IntoIter<Value>;
211
212 fn into_iter(self) -> Self::IntoIter {
213 self.into_vec().into_iter()
214 }
215}
216
217impl<'a> IntoIterator for &'a Seq {
218 type Item = &'a Value;
219 type IntoIter = std::slice::Iter<'a, Value>;
220
221 fn into_iter(self) -> Self::IntoIter {
222 self.items.iter()
223 }
224}
225
226impl<'a> IntoIterator for &'a mut Seq {
227 type Item = &'a mut Value;
228 type IntoIter = std::slice::IterMut<'a, Value>;
229
230 fn into_iter(self) -> Self::IntoIter {
231 self.items.iter_mut()
232 }
233}