use qubit_json::value::DuplicateKeyRejectingJsonValue;
use serde::Deserialize;
use serde::Deserializer;
use serde::Serialize;
use serde::Serializer;
#[cfg(feature = "converter")]
use serde_json::Map;
use serde_json::Value;
use super::internal::CanonicalJson;
pub(crate) fn serialize<S>(value: &Value, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
CanonicalJson(value).serialize(serializer)
}
pub(crate) fn deserialize<'de, D>(deserializer: D) -> Result<Value, D::Error>
where
D: Deserializer<'de>,
{
DuplicateKeyRejectingJsonValue::deserialize(deserializer).map(DuplicateKeyRejectingJsonValue::into_inner)
}
#[cfg(feature = "converter")]
pub(crate) fn canonicalize_json_value(value: &Value) -> Value {
match value {
Value::Null | Value::Bool(_) | Value::Number(_) | Value::String(_) => value.clone(),
Value::Array(values) => Value::Array(values.iter().map(canonicalize_json_value).collect()),
Value::Object(values) => {
let mut entries: Vec<_> = values.iter().collect();
entries.sort_unstable_by_key(|(left, _)| *left);
let mut object = Map::with_capacity(entries.len());
for (key, value) in entries {
object.insert(key.clone(), canonicalize_json_value(value));
}
Value::Object(object)
}
}
}