1use toml_edit::{Array, Value};
5
6use crate::{convert, set_value, Kind};
7
8pub fn push_element(a: &mut Array, kind: Kind) -> bool {
16 let Some(mut value) = kind.as_value() else {
17 return false;
18 };
19 if let Some(last) = a.iter().last() {
20 *value.decor_mut() = last.decor().clone();
21 }
22 a.push_formatted(value);
23 true
24}
25
26pub fn remove_element(a: &mut Array, index: usize) -> bool {
28 if index >= a.len() {
29 return false;
30 }
31 a.remove(index);
32 true
33}
34
35pub fn set_element(a: &mut Array, index: usize, new: Value) -> bool {
37 match a.get_mut(index) {
38 Some(slot) => {
39 set_value(slot, new);
40 true
41 }
42 None => false,
43 }
44}
45
46pub fn convert_element(a: &mut Array, index: usize, to: Kind) -> bool {
48 let Some(slot) = a.get_mut(index) else {
49 return false;
50 };
51 match convert(slot, to) {
52 Some(new) => {
53 set_value(slot, new);
54 true
55 }
56 None => false,
57 }
58}
59
60#[cfg(test)]
61mod tests {
62 use super::{convert_element, push_element, remove_element, set_element};
63 use crate::Kind;
64 use toml_edit::{DocumentMut, Value};
65
66 fn doc(text: &str) -> DocumentMut {
67 text.parse().expect("valid TOML")
68 }
69
70 fn array(d: &mut DocumentMut) -> &mut toml_edit::Array {
71 d["a"].as_array_mut().expect("an array")
72 }
73
74 #[test]
79 fn an_added_element_takes_the_style_of_the_one_before() {
80 let mut d = doc("a = [1, 2]\n");
81 assert!(push_element(array(&mut d), Kind::Integer));
82 assert_eq!(d.to_string(), "a = [1, 2, 0]\n");
83
84 let mut d = doc("a = [\n 1,\n 2,\n]\n");
85 assert!(push_element(array(&mut d), Kind::Integer));
86 assert_eq!(d.to_string(), "a = [\n 1,\n 2,\n 0,\n]\n");
87
88 let mut d = doc("a = []\n");
89 assert!(push_element(array(&mut d), Kind::Text));
90 assert_eq!(d.to_string(), "a = [\"\"]\n");
91 }
92
93 #[test]
95 fn a_table_is_refused() {
96 let mut d = doc("a = [1]\n");
97 assert!(!push_element(array(&mut d), Kind::Table));
98 assert_eq!(d.to_string(), "a = [1]\n");
99 }
100
101 #[test]
104 fn an_element_is_removed_in_place() {
105 let mut d = doc("a = [1, 2, 3] # three\n");
106 assert!(remove_element(array(&mut d), 1));
107 assert_eq!(d.to_string(), "a = [1, 3] # three\n");
108 assert!(!remove_element(array(&mut d), 5));
109 }
110
111 #[test]
114 fn an_element_is_changed_or_converted_where_it_is() {
115 let mut d = doc("a = [ 1 , 2 ]\n");
116 assert!(set_element(array(&mut d), 0, Value::from(9)));
117 assert_eq!(d.to_string(), "a = [ 9 , 2 ]\n");
118 assert!(convert_element(array(&mut d), 1, Kind::Text));
119 assert_eq!(d.to_string(), "a = [ 9 , \"2\" ]\n");
120 assert!(!convert_element(array(&mut d), 1, Kind::Boolean));
121 assert!(!set_element(array(&mut d), 7, Value::from(0)));
122 }
123}