use crate::error::{Error, Result};
use crate::value::Value;
use super::object::render_object_body;
pub fn render(value: &Value) -> Result<String> {
let obj = match value {
Value::Object(o) => o,
_ => return Err(Error::Message("top-level value must be an object".into())),
};
let mut out = String::with_capacity(estimate_size(value));
render_object_body(obj, 0, &mut out)?;
Ok(out)
}
fn estimate_size(value: &Value) -> usize {
match value {
Value::Null => 5, Value::Bool(_) => 6, Value::Integer(s) | Value::Float(s) | Value::String(s) => s.len() + 4,
Value::Array(items) => 4 + items.iter().map(estimate_size).sum::<usize>(),
Value::Object(obj) => obj
.iter()
.map(|(k, v)| k.len() + 4 + estimate_size(v))
.sum::<usize>()
.saturating_add(4),
}
}