mod error;
mod serializer;
pub use {error::SerError, serializer::*};
use crate::schema::{
DecimalRepr, Enum, Fixed, RecordField, Schema, SchemaNode, Union, UnionVariantLookupKey,
};
use {integer_encoding::VarIntWriter, serde::ser::*, std::io::Write};
pub struct SerializerState<'s, W> {
pub(crate) writer: W,
buffers: Buffers,
config: SerializerConfig<'s>,
}
#[derive(Clone)]
pub struct SerializerConfig<'s> {
schema_root: &'s SchemaNode<'s>,
}
impl<'s> SerializerConfig<'s> {
pub fn new(schema: &'s Schema) -> Self {
Self::from_schema_node(schema.root())
}
pub fn from_schema_node(schema_root: &'s SchemaNode<'s>) -> Self {
Self { schema_root }
}
}
impl<'s, W: std::io::Write> SerializerState<'s, W> {
pub fn from_writer(writer: W, schema: &'s Schema) -> Self {
Self {
writer,
config: SerializerConfig {
schema_root: schema.root(),
},
buffers: Buffers::default(),
}
}
pub fn with_config(writer: W, config: SerializerConfig<'s>) -> Self {
SerializerState {
writer,
config,
buffers: Buffers::default(),
}
}
pub fn serializer<'r>(&'r mut self) -> DatumSerializer<'r, 's, W> {
DatumSerializer {
schema_node: self.config.schema_root,
state: self,
}
}
pub fn add_buffers(&mut self, buffers: Buffers) {
if self.buffers.field_reordering_buffers.is_empty() {
self.buffers.field_reordering_buffers = buffers.field_reordering_buffers;
} else {
self.buffers
.field_reordering_buffers
.extend(buffers.field_reordering_buffers);
}
if self.buffers.field_reordering_super_buffers.is_empty() {
self.buffers.field_reordering_super_buffers = buffers.field_reordering_super_buffers;
} else {
self.buffers
.field_reordering_super_buffers
.extend(buffers.field_reordering_super_buffers);
}
}
}
impl<W> SerializerState<'_, W> {
pub fn into_writer(self) -> W {
self.writer
}
pub fn into_writer_and_buffers(self) -> (W, Buffers) {
(self.writer, self.buffers)
}
}
#[derive(Default)]
pub struct Buffers {
field_reordering_buffers: Vec<Vec<u8>>,
field_reordering_super_buffers: Vec<Vec<Option<Vec<u8>>>>,
}