use toml_edit::{Array, Value};
use crate::{convert, set_value, Kind};
pub fn push_element(a: &mut Array, kind: Kind) -> bool {
let Some(mut value) = kind.as_value() else {
return false;
};
if let Some(last) = a.iter().last() {
*value.decor_mut() = last.decor().clone();
}
a.push_formatted(value);
true
}
pub fn remove_element(a: &mut Array, index: usize) -> bool {
if index >= a.len() {
return false;
}
a.remove(index);
true
}
pub fn set_element(a: &mut Array, index: usize, new: Value) -> bool {
match a.get_mut(index) {
Some(slot) => {
set_value(slot, new);
true
}
None => false,
}
}
pub fn convert_element(a: &mut Array, index: usize, to: Kind) -> bool {
let Some(slot) = a.get_mut(index) else {
return false;
};
match convert(slot, to) {
Some(new) => {
set_value(slot, new);
true
}
None => false,
}
}
#[cfg(test)]
mod tests {
use super::{convert_element, push_element, remove_element, set_element};
use crate::Kind;
use toml_edit::{DocumentMut, Value};
fn doc(text: &str) -> DocumentMut {
text.parse().expect("valid TOML")
}
fn array(d: &mut DocumentMut) -> &mut toml_edit::Array {
d["a"].as_array_mut().expect("an array")
}
#[test]
fn an_added_element_takes_the_style_of_the_one_before() {
let mut d = doc("a = [1, 2]\n");
assert!(push_element(array(&mut d), Kind::Integer));
assert_eq!(d.to_string(), "a = [1, 2, 0]\n");
let mut d = doc("a = [\n 1,\n 2,\n]\n");
assert!(push_element(array(&mut d), Kind::Integer));
assert_eq!(d.to_string(), "a = [\n 1,\n 2,\n 0,\n]\n");
let mut d = doc("a = []\n");
assert!(push_element(array(&mut d), Kind::Text));
assert_eq!(d.to_string(), "a = [\"\"]\n");
}
#[test]
fn a_table_is_refused() {
let mut d = doc("a = [1]\n");
assert!(!push_element(array(&mut d), Kind::Table));
assert_eq!(d.to_string(), "a = [1]\n");
}
#[test]
fn an_element_is_removed_in_place() {
let mut d = doc("a = [1, 2, 3] # three\n");
assert!(remove_element(array(&mut d), 1));
assert_eq!(d.to_string(), "a = [1, 3] # three\n");
assert!(!remove_element(array(&mut d), 5));
}
#[test]
fn an_element_is_changed_or_converted_where_it_is() {
let mut d = doc("a = [ 1 , 2 ]\n");
assert!(set_element(array(&mut d), 0, Value::from(9)));
assert_eq!(d.to_string(), "a = [ 9 , 2 ]\n");
assert!(convert_element(array(&mut d), 1, Kind::Text));
assert_eq!(d.to_string(), "a = [ 9 , \"2\" ]\n");
assert!(!convert_element(array(&mut d), 1, Kind::Boolean));
assert!(!set_element(array(&mut d), 7, Value::from(0)));
}
}