#![expect(clippy::inline_always)]
mod blanket;
mod buffer;
mod formatter;
mod primitives;
mod sequences;
mod strings;
mod structs;
use buffer::Buffer;
use formatter::{CompactFormatter, Formatter, PrettyFormatter};
use sequences::ESTreeSequenceSerializer;
use structs::ESTreeStructSerializer;
pub use sequences::SequenceSerializer;
pub use structs::{FlatStructSerializer, StructSerializer};
pub trait ESTree {
fn serialize<S: Serializer>(&self, serializer: S);
}
#[expect(private_bounds)]
pub trait Serializer: SerializerPrivate {
type StructSerializer: StructSerializer;
type SequenceSerializer: SequenceSerializer;
fn serialize_struct(self) -> Self::StructSerializer;
fn serialize_sequence(self) -> Self::SequenceSerializer;
}
trait SerializerPrivate: Sized {
type Formatter: Formatter;
fn buffer_mut(&mut self) -> &mut Buffer;
fn buffer_and_formatter_mut(&mut self) -> (&mut Buffer, &mut Self::Formatter);
}
pub type CompactSerializer = ESTreeSerializer<CompactFormatter>;
pub type PrettySerializer = ESTreeSerializer<PrettyFormatter>;
pub struct ESTreeSerializer<F: Formatter> {
buffer: Buffer,
formatter: F,
}
impl<F: Formatter> ESTreeSerializer<F> {
pub fn new() -> Self {
Self { buffer: Buffer::new(), formatter: F::new() }
}
pub fn into_string(self) -> String {
self.buffer.into_string()
}
}
impl<F: Formatter> Default for ESTreeSerializer<F> {
#[inline(always)]
fn default() -> Self {
Self::new()
}
}
impl<'s, F: Formatter> Serializer for &'s mut ESTreeSerializer<F> {
type StructSerializer = ESTreeStructSerializer<'s, F>;
type SequenceSerializer = ESTreeSequenceSerializer<'s, F>;
#[inline(always)]
fn serialize_struct(self) -> ESTreeStructSerializer<'s, F> {
ESTreeStructSerializer::new(self)
}
#[inline(always)]
fn serialize_sequence(self) -> ESTreeSequenceSerializer<'s, F> {
ESTreeSequenceSerializer::new(self)
}
}
impl<F: Formatter> SerializerPrivate for &mut ESTreeSerializer<F> {
type Formatter = F;
#[inline(always)]
fn buffer_mut(&mut self) -> &mut Buffer {
&mut self.buffer
}
#[inline(always)]
fn buffer_and_formatter_mut(&mut self) -> (&mut Buffer, &mut F) {
(&mut self.buffer, &mut self.formatter)
}
}