use serde::Serialize;
use serde::ser::{
SerializeSeq,
SerializeTuple,
SerializeTupleStruct,
};
use serde_json::Value;
use crate::strict_json::{
Result,
StrictJsonError,
to_value,
};
pub(in crate::strict_json) struct SequenceSerializer {
pub(in crate::strict_json) values: Vec<Value>,
}
impl SerializeSeq for SequenceSerializer {
type Ok = Value;
type Error = StrictJsonError;
fn serialize_element<T>(&mut self, value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
self.values.push(to_value(value)?);
Ok(())
}
fn end(self) -> Result<Value> {
Ok(Value::Array(self.values))
}
}
impl SerializeTuple for SequenceSerializer {
type Ok = Value;
type Error = StrictJsonError;
#[inline(always)]
fn serialize_element<T>(&mut self, value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
SerializeSeq::serialize_element(self, value)
}
#[inline(always)]
fn end(self) -> Result<Value> {
SerializeSeq::end(self)
}
}
impl SerializeTupleStruct for SequenceSerializer {
type Ok = Value;
type Error = StrictJsonError;
#[inline(always)]
fn serialize_field<T>(&mut self, value: &T) -> Result<()>
where
T: ?Sized + Serialize,
{
SerializeSeq::serialize_element(self, value)
}
#[inline(always)]
fn end(self) -> Result<Value> {
SerializeSeq::end(self)
}
}