mod error;
mod serializer;
pub use {error::SerError, serializer::*};
use crate::schema::{self_referential::*, UnionVariantLookupKey};
use {integer_encoding::VarIntWriter, serde::ser::*, std::io::Write};
pub struct SerializerState<'c, 's, W> {
writer: W,
config: SerializerConfigRef<'c, 's>,
}
pub struct SerializerConfig<'s> {
buffers: Buffers,
allow_slow_sequence_to_bytes: bool,
schema: Option<&'s Schema>,
}
impl<'s> SerializerConfig<'s> {
pub fn new(schema: &'s Schema) -> Self {
Self::new_with_optional_schema(Some(schema))
}
pub(crate) fn new_with_optional_schema(schema: Option<&'s Schema>) -> Self {
Self {
schema,
allow_slow_sequence_to_bytes: false,
buffers: Buffers::default(),
}
}
pub fn allow_slow_sequence_to_bytes(&mut self) -> &mut Self {
self.allow_slow_sequence_to_bytes = true;
self
}
pub fn schema(&self) -> &'s Schema {
self.schema.expect("Unknown schema in SerializerConfig")
}
}
impl<'c, 's, W: std::io::Write> SerializerState<'c, 's, W> {
pub fn from_writer(writer: W, serializer_config: &'c mut SerializerConfig<'s>) -> Self {
Self {
writer,
config: SerializerConfigRef::Borrowed(serializer_config),
}
}
pub fn with_owned_config(writer: W, serializer_config: SerializerConfig<'s>) -> Self {
Self {
writer,
config: SerializerConfigRef::Owned(Box::new(serializer_config)),
}
}
pub(crate) fn with_opt_owned_config(
writer: W,
serializer_config: SerializerConfigRef<'c, 's>,
) -> Self {
Self {
writer,
config: serializer_config,
}
}
pub fn serializer<'r>(&'r mut self) -> DatumSerializer<'r, 'c, 's, W> {
DatumSerializer {
schema_node: self.config.schema().root().as_ref(),
state: self,
}
}
pub(crate) fn serializer_overriding_schema_root<'r>(
&'r mut self,
schema_root: &'s SchemaNode<'s>,
) -> DatumSerializer<'r, 'c, 's, W> {
DatumSerializer {
schema_node: schema_root,
state: self,
}
}
}
impl<W> SerializerState<'_, '_, W> {
pub fn into_writer(self) -> W {
self.writer
}
pub fn writer(&self) -> &W {
&self.writer
}
pub fn writer_mut(&mut self) -> &mut W {
&mut self.writer
}
}
#[derive(Default)]
struct Buffers {
field_reordering_buffers: Vec<Vec<u8>>,
field_reordering_super_buffers: Vec<Vec<Option<Vec<u8>>>>,
}
pub(crate) enum SerializerConfigRef<'c, 's> {
Borrowed(&'c mut SerializerConfig<'s>),
Owned(Box<SerializerConfig<'s>>),
}
impl<'c, 's> std::ops::Deref for SerializerConfigRef<'c, 's> {
type Target = SerializerConfig<'s>;
fn deref(&self) -> &Self::Target {
match self {
Self::Borrowed(config) => &**config,
Self::Owned(config) => &**config,
}
}
}
impl std::ops::DerefMut for SerializerConfigRef<'_, '_> {
fn deref_mut(&mut self) -> &mut Self::Target {
match &mut *self {
Self::Borrowed(config) => &mut **config,
Self::Owned(config) => &mut **config,
}
}
}