use serde::Serialize;
use serde::ser::{
SerializeMap,
SerializeStruct,
};
use serde_json::{
Map,
Value,
};
use crate::strict_json::{
Result,
StrictJsonError,
to_value,
};
use super::MapKeySerializer;
pub(in crate::strict_json) struct ObjectSerializer {
pub(in crate::strict_json) values: Map<String, Value>,
pub(in crate::strict_json) next_key: Option<String>,
}
impl SerializeMap for ObjectSerializer {
type Ok = Value;
type Error = StrictJsonError;
fn serialize_key<T>(&mut self, key: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
self.next_key = Some(key.serialize(MapKeySerializer)?);
Ok(())
}
fn serialize_value<T>(&mut self, value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
let key = self.next_key.take().ok_or(StrictJsonError::Serialization)?;
self.values.insert(key, to_value(value)?);
Ok(())
}
fn end(self) -> Result<Value> {
if self.next_key.is_some() {
return Err(StrictJsonError::Serialization);
}
Ok(Value::Object(self.values))
}
}
impl SerializeStruct for ObjectSerializer {
type Ok = Value;
type Error = StrictJsonError;
fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
self.values.insert(key.to_string(), to_value(value)?);
Ok(())
}
fn end(self) -> Result<Value> {
Ok(Value::Object(self.values))
}
}