use crate::{Value, object::Entry};
pub(crate) fn dismantle(pending: &mut Vec<Value>) {
while let Some(mut value) = pending.pop() {
release_children(&mut value, pending);
}
}
fn release_children(value: &mut Value, pending: &mut Vec<Value>) {
match value {
Value::Array(items) => pending.extend(items.drain(..).filter(Value::is_nested_container)),
Value::Object(object) => pending.extend(
object
.drain_entries()
.map(Entry::into_value)
.filter(Value::is_nested_container),
),
Value::Null | Value::Boolean(_) | Value::Number(_) | Value::String(_) => {}
}
}
impl Value {
pub(crate) const fn is_nested_container(&self) -> bool {
match self {
Self::Array(items) => !items.is_empty(),
Self::Object(object) => !object.is_empty(),
Self::Null | Self::Boolean(_) | Self::Number(_) | Self::String(_) => false,
}
}
}