use serde::Deserialize;
use serde::Deserializer;
use serde::Serialize;
use serde::Serializer;
use serde::ser::SerializeMap;
use serde::ser::SerializeSeq;
use serde_json::Value;
use super::SafeJsonValue;
use super::internal::Nested;
use super::internal::ValueVisitor;
impl Serialize for SafeJsonValue {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serialize_value(self.as_value(), serializer)
}
}
pub(in crate::value) fn serialize_value<S>(value: &Value, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
stacker::maybe_grow(32 * 1024, 1024 * 1024, || match value {
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 seq = serializer.serialize_seq(Some(values.len()))?;
for child in values {
seq.serialize_element(&Nested(child))?;
}
seq.end()
}
Value::Object(values) => {
let mut map = serializer.serialize_map(Some(values.len()))?;
for (key, child) in values {
map.serialize_entry(key, &Nested(child))?;
}
map.end()
}
})
}
impl<'de> Deserialize<'de> for SafeJsonValue {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
stacker::maybe_grow(32 * 1024, 1024 * 1024, || {
deserializer.deserialize_any(ValueVisitor).map(SafeJsonValue::new)
})
}
}