use serde::Serialize;
use serde::ser::SerializeMap;
use serde::ser::SerializeSeq;
use serde::ser::Serializer;
use serde_json::Value;
pub(in crate::wire) struct CanonicalJson<'a>(
pub(in crate::wire) &'a Value,
);
impl Serialize for CanonicalJson<'_> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match self.0 {
Value::Null => serializer.serialize_unit(),
Value::Bool(value) => serializer.serialize_bool(*value),
Value::Number(value) => value.serialize(serializer),
Value::String(value) => serializer.serialize_str(value),
Value::Array(values) => {
let mut sequence = serializer.serialize_seq(Some(values.len()))?;
for value in values {
sequence.serialize_element(&Self(value))?;
}
sequence.end()
}
Value::Object(values) => {
let mut entries: Vec<_> = values.iter().collect();
entries.sort_unstable_by_key(|(left, _)| *left);
let mut map = serializer.serialize_map(Some(entries.len()))?;
for (key, value) in entries {
map.serialize_entry(key, &Self(value))?;
}
map.end()
}
}
}
}