use serde::Serialize;
use serde::ser::SerializeStruct;
use serde_json::Value;
use crate::strict_json::{
Result,
StrictJsonError,
};
use super::{
ObjectSerializer,
json_number_serializer,
};
pub(in crate::strict_json) enum StructSerializer {
Object(ObjectSerializer),
Number(Option<Value>),
}
impl SerializeStruct for StructSerializer {
type Ok = Value;
type Error = StrictJsonError;
fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
match self {
Self::Object(serializer) => serializer.serialize_field(key, value),
Self::Number(output) => {
if key != json_number_serializer::NUMBER_TOKEN
|| output.is_some()
{
return Err(StrictJsonError::Serialization);
}
*output =
Some(json_number_serializer::serialize_number(value)?);
Ok(())
}
}
}
fn end(self) -> Result<Value> {
match self {
Self::Object(serializer) => serializer.end(),
Self::Number(Some(value)) => Ok(value),
Self::Number(None) => Err(StrictJsonError::Serialization),
}
}
}