mirror of https://github.com/kdl-org/kdl-rs.git
fix(api): Fix `insert` and `remove` behavior for `KdlNode`
This commit is contained in:
parent
85b65eefc3
commit
be0dc1708d
60
src/node.rs
60
src/node.rs
|
|
@ -227,9 +227,6 @@ impl KdlNode {
|
||||||
return Some(entry);
|
return Some(entry);
|
||||||
}
|
}
|
||||||
current_idx += 1;
|
current_idx += 1;
|
||||||
if current_idx > idx + 1 {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
|
|
@ -266,13 +263,10 @@ impl KdlNode {
|
||||||
let mut current_idx = 0;
|
let mut current_idx = 0;
|
||||||
for entry in &mut self.entries {
|
for entry in &mut self.entries {
|
||||||
if entry.name.is_none() {
|
if entry.name.is_none() {
|
||||||
if current_idx >= idx {
|
if current_idx == idx {
|
||||||
return Some(entry);
|
return Some(entry);
|
||||||
}
|
}
|
||||||
current_idx += 1;
|
current_idx += 1;
|
||||||
if current_idx >= idx {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
|
|
@ -326,9 +320,6 @@ impl KdlNode {
|
||||||
return Some(entry);
|
return Some(entry);
|
||||||
}
|
}
|
||||||
current_idx += 1;
|
current_idx += 1;
|
||||||
if current_idx >= idx {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if idx > current_idx {
|
if idx > current_idx {
|
||||||
|
|
@ -357,7 +348,7 @@ impl KdlNode {
|
||||||
fn remove_impl(&mut self, key: NodeKey) -> Option<KdlEntry> {
|
fn remove_impl(&mut self, key: NodeKey) -> Option<KdlEntry> {
|
||||||
match key {
|
match key {
|
||||||
NodeKey::Key(key) => {
|
NodeKey::Key(key) => {
|
||||||
for (idx, entry) in self.entries.iter_mut().enumerate() {
|
for (idx, entry) in self.entries.iter().enumerate() {
|
||||||
if entry.name.is_some() && entry.name.as_ref() == Some(&key) {
|
if entry.name.is_some() && entry.name.as_ref() == Some(&key) {
|
||||||
return Some(self.entries.remove(idx));
|
return Some(self.entries.remove(idx));
|
||||||
}
|
}
|
||||||
|
|
@ -366,15 +357,12 @@ impl KdlNode {
|
||||||
}
|
}
|
||||||
NodeKey::Index(idx) => {
|
NodeKey::Index(idx) => {
|
||||||
let mut current_idx = 0;
|
let mut current_idx = 0;
|
||||||
for entry in &mut self.entries {
|
for (idx_entry, entry) in self.entries.iter().enumerate() {
|
||||||
if entry.name.is_none() {
|
if entry.name.is_none() {
|
||||||
if current_idx == idx {
|
if current_idx == idx {
|
||||||
return Some(self.entries.remove(idx));
|
return Some(self.entries.remove(idx_entry));
|
||||||
}
|
}
|
||||||
current_idx += 1;
|
current_idx += 1;
|
||||||
if current_idx >= idx {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
|
|
@ -680,4 +668,44 @@ mod test {
|
||||||
node.entries_mut().push(KdlEntry::new_prop("x", 2));
|
node.entries_mut().push(KdlEntry::new_prop("x", 2));
|
||||||
assert_eq!(&node["x"], &2.into())
|
assert_eq!(&node["x"], &2.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn insertion() {
|
||||||
|
let mut node = KdlNode::new("foo");
|
||||||
|
node.push("pos0");
|
||||||
|
node.insert("keyword", 6.0);
|
||||||
|
node.push("pos1");
|
||||||
|
assert_eq!(node.entries().len(), 3);
|
||||||
|
|
||||||
|
node.insert(0, "inserted0");
|
||||||
|
node.insert(1, "inserted1");
|
||||||
|
assert_eq!(node.entries().len(), 3);
|
||||||
|
assert_eq!(node[0], "inserted0".into());
|
||||||
|
assert_eq!(node[1], "inserted1".into());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn removal() {
|
||||||
|
let mut node = KdlNode::new("foo");
|
||||||
|
node.push("pos0");
|
||||||
|
node.insert("keyword", 6.0);
|
||||||
|
node.push("pos1");
|
||||||
|
assert_eq!(node.entries().len(), 3);
|
||||||
|
|
||||||
|
node.remove(1);
|
||||||
|
assert_eq!(node.entries().len(), 2, "index removal should succeed");
|
||||||
|
assert!(
|
||||||
|
node.get("keyword").is_some(),
|
||||||
|
"keyword property should not be removed by index removal"
|
||||||
|
);
|
||||||
|
node.remove(1);
|
||||||
|
assert_eq!(node.entries().len(), 2, "index removal should not succeed");
|
||||||
|
node.remove("not an existing keyword");
|
||||||
|
assert_eq!(node.entries().len(), 2, "key removal should not succeed");
|
||||||
|
node.remove("keyword");
|
||||||
|
assert_eq!(node.entries().len(), 1, "key removal should succeed");
|
||||||
|
node.remove(0);
|
||||||
|
assert_eq!(node.entries().len(), 0, "index removal should suceed");
|
||||||
|
node.remove(0); // should not panic
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue