use serde_json::Value;
use super::super::SafeJsonValue;
pub(crate) struct SafeValueBuilder {
value: Option<Value>,
}
impl SafeValueBuilder {
pub(crate) fn array() -> Self {
Self {
value: Some(Value::Array(Vec::new())),
}
}
pub(crate) fn array_with_capacity(capacity: usize) -> Self {
Self {
value: Some(Value::Array(Vec::with_capacity(capacity))),
}
}
pub(crate) fn object() -> Self {
Self {
value: Some(Value::Object(serde_json::Map::new())),
}
}
pub(crate) fn push(&mut self, child: SafeJsonValue) {
let Value::Array(values) = self.value.as_mut().expect("builder is active") else {
unreachable!()
};
values.push(Value::Null);
*values.last_mut().expect("just inserted a slot") = child.into_value();
super::super::safe_json_value::maybe_panic_after_guarded_insert();
}
pub(crate) fn insert(&mut self, key: String, child: SafeJsonValue) {
let Value::Object(values) = self.value.as_mut().expect("builder is active") else {
unreachable!()
};
let slot = values.entry(key).or_insert(Value::Null);
*slot = child.into_value();
super::super::safe_json_value::maybe_panic_after_guarded_insert();
}
pub(crate) fn finish(mut self) -> Value {
self.value.take().expect("builder is active")
}
}
impl Drop for SafeValueBuilder {
fn drop(&mut self) {
if let Some(mut value) = self.value.take() {
super::super::safe_json_value::drop_tree(&mut value);
}
}
}