use serde_json::{Map, Value};
#[must_use]
pub fn sorted(value: Value) -> Value {
match value {
Value::Object(object) => {
let mut members: Vec<(String, Value)> = object.into_iter().collect();
members.sort_by(|(left, _), (right, _)| left.cmp(right));
let mut ordered = Map::with_capacity(members.len());
for (name, member) in members {
ordered.insert(name, sorted(member));
}
Value::Object(ordered)
}
Value::Array(items) => Value::Array(items.into_iter().map(sorted).collect()),
scalar => scalar,
}
}
pub fn to_vec(value: Value) -> Result<Vec<u8>, serde_json::Error> {
serde_json::to_vec(&sorted(value))
}
#[cfg(test)]
#[path = "canonical_tests.rs"]
mod tests;