collab-common 0.0.7

Code shared by collab's client and server
Documentation
//! This module contains the `serialize` and `deserialize` functions that
//! are used to convert data to and from bytes.
//!
//! We implement those here to easily swap out the serialization format
//! in the future if we want to.

use bincode::Options;
use serde::{Deserialize, Serialize};

/// Serializes the given value to bytes.
#[inline(always)]
pub(crate) fn serialize_into<T: Serialize>(
    value: &T,
    buf: &mut Vec<u8>,
) -> Result<(), SerializeError> {
    bincode_opts().serialize_into(buf, value).map_err(Into::into)
}

/// Deserializes the given value from a byte slice.
#[inline(always)]
pub(crate) fn deserialize<'de, T: Deserialize<'de>>(
    buf: &'de [u8],
) -> Result<T, DeserializeError> {
    bincode_opts().deserialize(buf).map_err(Into::into)
}

#[inline(always)]
fn bincode_opts() -> impl bincode::Options {
    bincode::DefaultOptions::new().with_varint_encoding()
}

/// TODO: docs
pub struct SerializeError {
    inner: bincode::Error,
}

impl core::fmt::Debug for SerializeError {
    #[inline]
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        self.inner.fmt(f)
    }
}

impl core::fmt::Display for SerializeError {
    #[inline]
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        self.inner.fmt(f)
    }
}

impl std::error::Error for SerializeError {}

impl From<bincode::Error> for SerializeError {
    #[inline]
    fn from(inner: bincode::Error) -> Self {
        Self { inner }
    }
}

/// TODO: docs
pub struct DeserializeError {
    inner: bincode::Error,
}

impl core::fmt::Debug for DeserializeError {
    #[inline]
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        self.inner.fmt(f)
    }
}

impl core::fmt::Display for DeserializeError {
    #[inline]
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        self.inner.fmt(f)
    }
}

impl std::error::Error for DeserializeError {}

impl From<bincode::Error> for DeserializeError {
    #[inline]
    fn from(inner: bincode::Error) -> Self {
        Self { inner }
    }
}