Documentation
use serde::ser::Serialize;

use crate::Result;

pub(crate) mod map_key_serializer;
mod map_serializer;
mod serializer;
mod unsorted_serializer;

pub use serializer::Serializer;
pub use unsorted_serializer::UnsortedSerializer;

pub fn to_writer_unsorted<W, T>(writer: W, value: &T) -> Result<()>
where
    W: std::io::Write,
    T: ?Sized + Serialize,
{
    let mut ser = UnsortedSerializer::new(writer);
    value.serialize(&mut ser)
}

pub fn to_bytes_unsorted<T>(value: &T) -> Result<Vec<u8>>
where
    T: ?Sized + Serialize,
{
    let mut writer = Vec::with_capacity(128);
    to_writer_unsorted(&mut writer, value)?;
    Ok(writer)
}

pub fn to_writer<W, T>(writer: W, value: &T) -> Result<()>
where
    W: std::io::Write,
    T: ?Sized + Serialize,
{
    let mut ser = Serializer::new(writer);
    value.serialize(&mut ser)
}

pub fn to_bytes<T>(value: &T) -> Result<Vec<u8>>
where
    T: ?Sized + Serialize,
{
    let mut writer = Vec::with_capacity(128);
    to_writer(&mut writer, value)?;
    Ok(writer)
}