mod error;
mod state;
use std::io::Write;
use rbx_dom_weak::{types::Ref, WeakDom};
use rbx_reflection::ReflectionDatabase;
use self::state::SerializerState;
pub use self::error::Error;
#[non_exhaustive]
pub struct Serializer<'db> {
database: &'db ReflectionDatabase<'db>,
compression: CompressionType,
}
impl<'db> Serializer<'db> {
pub fn new() -> Self {
Serializer {
database: rbx_reflection_database::get().unwrap(),
compression: CompressionType::default(),
}
}
#[inline]
pub fn reflection_database(self, database: &'db ReflectionDatabase<'db>) -> Self {
Self { database, ..self }
}
#[inline]
pub fn compression_type(self, compression: CompressionType) -> Self {
Self {
compression,
..self
}
}
pub fn serialize<W: Write>(&self, writer: W, dom: &WeakDom, refs: &[Ref]) -> Result<(), Error> {
profiling::scope!("rbx_binary::seserialize");
let mut serializer = SerializerState::new(self, dom, writer);
serializer.add_instances(refs)?;
serializer.generate_referents();
serializer.write_header()?;
serializer.serialize_metadata()?;
serializer.serialize_shared_strings()?;
serializer.serialize_instances()?;
serializer.serialize_properties()?;
serializer.serialize_parents()?;
serializer.serialize_end()?;
Ok(())
}
}
impl Default for Serializer<'_> {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)]
pub enum CompressionType {
#[default]
Lz4,
None,
Zstd,
}