use alloc::borrow::Cow;
use alloc::boxed::Box;
use core::ops::Deref;
use crate::State;
use crate::error::Error;
use crate::event::ContainerShape;
pub(crate) mod begin;
mod boxed;
mod chunk;
mod describe;
mod driver;
#[cfg(feature = "derive")]
pub(crate) mod enums;
#[cfg(feature = "derive")]
pub(crate) mod flatten;
pub(crate) mod impls;
mod layer;
mod serializer;
mod stream;
pub use self::boxed::Boxed;
pub use self::chunk::Chunk;
pub use self::describe::{Describe, Variant, VariantKind, VariantRepr};
pub use self::layer::{Layer, Next};
pub use self::serializer::Serializer;
pub use self::stream::{StreamSerializer, Written};
pub use driver::{EventSink, PausableSink, SerializeDriver};
pub(crate) use self::begin::{
Begin, BeginKind, FIELDS_END, IndexedSeq, IndexedSeqEmitter, IndexedStruct, PLAIN_BUDGET,
PlainSink, StructField, atom_cost, plain_atom,
};
pub enum SerializeHandle<'a> {
Borrowed(&'a dyn Serialize),
Owned(Boxed<dyn Serialize + Send + 'a>),
}
impl<'a> Deref for SerializeHandle<'a> {
type Target = dyn Serialize + 'a;
fn deref(&self) -> &Self::Target {
match self {
SerializeHandle::Borrowed(val) => *val,
SerializeHandle::Owned(val) => &**val,
}
}
}
impl<'a> SerializeHandle<'a> {
pub fn to<S: Serialize + 'a>(val: &'a S) -> SerializeHandle<'a> {
SerializeHandle::Borrowed(val as &dyn Serialize)
}
#[inline(always)]
pub fn arena<S: Serialize + Send + 'a>(val: S, state: &mut State) -> SerializeHandle<'a> {
SerializeHandle::Owned(boxed::unsize(Boxed::arena(val, state), |x| {
x as *mut (dyn Serialize + Send + 'a)
}))
}
pub fn heap<S: Serialize + Send + 'a>(val: S) -> SerializeHandle<'a> {
SerializeHandle::Owned(Boxed::from(Box::new(val) as Box<dyn Serialize + Send + 'a>))
}
}
pub trait StructEmitter: Send {
fn next(
&mut self,
state: &mut State,
) -> Result<Option<(Cow<'_, str>, SerializeHandle<'_>)>, Error>;
}
pub trait MapEmitter: Send {
fn next_key(&mut self, state: &mut State) -> Result<Option<SerializeHandle<'_>>, Error>;
fn next_value(&mut self, state: &mut State) -> Result<SerializeHandle<'_>, Error>;
}
pub trait SeqEmitter: Send {
fn next(&mut self, state: &mut State) -> Result<Option<SerializeHandle<'_>>, Error>;
}
pub trait Serialize: Sync {
fn serialize(&self, state: &mut State) -> Result<Chunk<'_>, Error>;
fn finish(&self, _state: &mut State) -> Result<(), Error> {
Ok(())
}
fn is_optional(&self) -> bool {
false
}
fn describe(&self, d: &mut dyn Describe) {
let _ = d;
}
fn container_shape(&self) -> ContainerShape {
ContainerShape::new()
}
#[doc(hidden)]
#[inline]
fn __private_begin(&self, state: &mut State) -> Result<Begin<'_>, Error> {
let shape = self.container_shape();
Ok(Begin::chunk(self.serialize(state)?, shape, true))
}
#[doc(hidden)]
#[inline]
fn __private_is_plain() -> bool
where
Self: Sized,
{
false
}
#[doc(hidden)]
#[inline]
fn __private_is_plain_value(&self) -> bool
where
Self: Sized,
{
Self::__private_is_plain()
}
#[doc(hidden)]
fn __private_emit_plain(&self, sink: &mut dyn PlainSink) -> Result<(), Error> {
let _ = sink;
unreachable!("not a plain value")
}
#[doc(hidden)]
#[inline]
fn __private_plain_cost(&self, budget: usize) -> Option<usize> {
budget.checked_sub(1)
}
#[doc(hidden)]
fn __private_slice_as_bytes(_val: &[Self]) -> Option<Cow<'_, [u8]>>
where
Self: Sized,
{
None
}
}
#[test]
fn test_serialize() {
let mut v = Vec::new();
let mut m = alloc::collections::BTreeMap::new();
m.insert(true, vec![vec![&b"x"[..], b"yyy"], vec![b"zzzz"]]);
m.insert(false, vec![]);
let mut driver = SerializeDriver::new(&m);
while let Some((event, _, _)) = driver.next().unwrap() {
v.push(format!(
"{:?}",
crate::event::without_len(event.to_static())
));
}
assert_eq!(
&v[..],
[
"MapStart(ContainerShape { len: None, order: Sorted })",
"Atom(Bool(false))",
"SeqStart",
"SeqEnd",
"Atom(Bool(true))",
"SeqStart",
"SeqStart",
"Atom(Bytes([120]))",
"Atom(Bytes([121, 121, 121]))",
"SeqEnd",
"SeqStart",
"Atom(Bytes([122, 122, 122, 122]))",
"SeqEnd",
"SeqEnd",
"MapEnd",
]
);
}