toml_edit/
array_of_tables.rs1use std::iter::FromIterator;
2
3use crate::{Array, Item, Table};
4
5#[derive(Clone, Debug, Default)]
7pub struct ArrayOfTables {
8 pub(crate) span: Option<std::ops::Range<usize>>,
10 pub(crate) values: Vec<Item>,
11}
12
13impl ArrayOfTables {
17 pub fn new() -> Self {
19 Default::default()
20 }
21}
22
23impl ArrayOfTables {
25 pub fn into_array(mut self) -> Array {
27 for value in self.values.iter_mut() {
28 value.make_value();
29 }
30 let mut a = Array::with_vec(self.values);
31 a.fmt();
32 a
33 }
34
35 pub fn span(&self) -> Option<std::ops::Range<usize>> {
39 self.span.clone()
40 }
41
42 pub(crate) fn despan(&mut self, input: &str) {
43 self.span = None;
44 for value in &mut self.values {
45 value.despan(input);
46 }
47 }
48}
49
50impl ArrayOfTables {
51 pub fn iter(&self) -> ArrayOfTablesIter<'_> {
53 Box::new(self.iter_tables())
54 }
55
56 pub(crate) fn iter_tables(&self) -> impl Iterator<Item = &Table> {
57 self.values.iter().filter_map(Item::as_table)
58 }
59
60 pub fn iter_mut(&mut self) -> ArrayOfTablesIterMut<'_> {
62 Box::new(self.values.iter_mut().filter_map(Item::as_table_mut))
63 }
64
65 pub fn len(&self) -> usize {
68 self.values.len()
69 }
70
71 pub fn is_empty(&self) -> bool {
73 self.len() == 0
74 }
75
76 pub fn clear(&mut self) {
78 self.values.clear();
79 }
80
81 pub fn get(&self, index: usize) -> Option<&Table> {
83 self.values.get(index).and_then(Item::as_table)
84 }
85
86 pub fn get_mut(&mut self, index: usize) -> Option<&mut Table> {
88 self.values.get_mut(index).and_then(Item::as_table_mut)
89 }
90
91 pub fn push(&mut self, table: Table) {
93 self.values.push(Item::Table(table));
94 }
95
96 pub fn insert(&mut self, index: usize, table: Table) {
103 self.values.insert(index, Item::Table(table));
104 }
105
106 pub fn replace(&mut self, index: usize, table: Table) -> Table {
123 match std::mem::replace(&mut self.values[index], Item::Table(table)) {
124 Item::Table(old) => old,
125 x => panic!("non-table item {x:?} in an array of tables"),
126 }
127 }
128
129 pub fn remove(&mut self, index: usize) -> Table {
131 self.values
132 .remove(index)
133 .into_table()
134 .expect("cannot have any other item in an array-of-tables")
135 }
136
137 pub fn retain<F>(&mut self, mut keep: F)
144 where
145 F: FnMut(&Table) -> bool,
146 {
147 self.values
148 .retain(|item| item.as_table().map(&mut keep).unwrap_or(false));
149 }
150}
151
152pub type ArrayOfTablesIter<'a> = Box<dyn Iterator<Item = &'a Table> + 'a>;
154pub type ArrayOfTablesIterMut<'a> = Box<dyn Iterator<Item = &'a mut Table> + 'a>;
156pub type ArrayOfTablesIntoIter = Box<dyn Iterator<Item = Table>>;
158
159impl Extend<Table> for ArrayOfTables {
160 fn extend<T: IntoIterator<Item = Table>>(&mut self, iter: T) {
161 for value in iter {
162 self.push(value);
163 }
164 }
165}
166
167impl FromIterator<Table> for ArrayOfTables {
168 fn from_iter<I>(iter: I) -> Self
169 where
170 I: IntoIterator<Item = Table>,
171 {
172 let v = iter.into_iter().map(Item::Table);
173 Self {
174 values: v.collect(),
175 span: None,
176 }
177 }
178}
179
180impl IntoIterator for ArrayOfTables {
181 type Item = Table;
182 type IntoIter = ArrayOfTablesIntoIter;
183
184 fn into_iter(self) -> Self::IntoIter {
185 Box::new(
186 self.values
187 .into_iter()
188 .filter(|v| v.is_table())
189 .map(|v| v.into_table().unwrap()),
190 )
191 }
192}
193
194impl<'s> IntoIterator for &'s ArrayOfTables {
195 type Item = &'s Table;
196 type IntoIter = ArrayOfTablesIter<'s>;
197
198 fn into_iter(self) -> Self::IntoIter {
199 self.iter()
200 }
201}
202
203#[cfg(feature = "display")]
204impl std::fmt::Display for ArrayOfTables {
205 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
206 self.clone().into_array().fmt(f)
208 }
209}