pub mod error;
pub mod implementations;
pub mod slice_reader;
pub mod walk;
pub use crate::error::Error;
pub use revision_derive::revisioned;
use std::any::TypeId;
use std::io::{Read, Write};
pub use slice_reader::{BorrowedReader, SliceReader, advance_read};
pub use walk::{
EnumWalker, LeafWalker, LengthPrefixedBytes, MapEntry, MapWalker, OptionWalker, ResultWalker,
SeqItem, SeqWalker, StructWalker, WalkRevisioned, read_enum_discriminant,
};
pub trait SkipRevisioned: Revisioned {
fn skip_revisioned<R: Read>(r: &mut R) -> Result<(), Error>;
fn skip_revisioned_slice(r: &mut SliceReader<'_>) -> Result<(), Error> {
Self::skip_revisioned(r)
}
}
pub trait SkipCheckRevisioned: Revisioned {
fn skip_check_revisioned<R: Read>(r: &mut R) -> Result<(), Error>;
}
#[inline]
pub fn skip_revisioned<T: SkipRevisioned, R: Read>(r: &mut R) -> Result<(), Error> {
T::skip_revisioned(r)
}
#[inline]
pub fn skip_reader<T: SkipRevisioned, R: Read>(r: &mut R) -> Result<(), Error> {
skip_revisioned::<T, R>(r)
}
#[inline]
pub fn skip_check_revisioned<T: SkipCheckRevisioned, R: Read>(r: &mut R) -> Result<(), Error> {
T::skip_check_revisioned(r)
}
#[inline]
pub fn skip_check_reader<T: SkipCheckRevisioned, R: Read>(r: &mut R) -> Result<(), Error> {
skip_check_revisioned::<T, R>(r)
}
#[inline]
pub fn skip_slice<T: SkipRevisioned>(bytes: &[u8]) -> Result<usize, Error> {
let mut sr = SliceReader::new(bytes);
T::skip_revisioned_slice(&mut sr)?;
Ok(sr.consumed_len())
}
#[inline]
pub fn skip_check_slice<T: SkipCheckRevisioned>(bytes: &[u8]) -> Result<usize, Error> {
let mut cursor = bytes;
let start = cursor.len();
<T as SkipCheckRevisioned>::skip_check_revisioned(&mut cursor)?;
Ok(start - cursor.len())
}
pub mod prelude {
pub use crate::{
BorrowedReader, EnumWalker, LeafWalker, LengthPrefixedBytes, MapEntry, MapWalker,
OptionWalker, ResultWalker, SeqItem, SeqWalker, StructWalker, WalkRevisioned,
};
pub use crate::{DeserializeRevisioned, Revisioned, SerializeRevisioned, revisioned};
pub use crate::{
SkipCheckRevisioned, SkipRevisioned, skip_check_reader, skip_check_revisioned,
skip_check_slice, skip_reader, skip_revisioned, skip_slice,
};
}
pub trait Revisioned {
fn revision() -> u16;
#[inline]
fn type_id() -> std::any::TypeId
where
Self: 'static,
{
TypeId::of::<Self>()
}
}
pub trait SerializeRevisioned: Revisioned {
fn serialize_revisioned<W: Write>(&self, w: &mut W) -> Result<(), Error>;
}
pub trait DeserializeRevisioned: Revisioned {
fn deserialize_revisioned<R: Read>(r: &mut R) -> Result<Self, Error>
where
Self: Sized;
}
#[inline]
pub fn from_reader<R, T>(rdr: &mut R) -> Result<T, Error>
where
R: Read,
T: DeserializeRevisioned,
{
DeserializeRevisioned::deserialize_revisioned(rdr)
}
#[inline]
pub fn from_slice<T>(mut bytes: &[u8]) -> Result<T, Error>
where
T: DeserializeRevisioned,
{
DeserializeRevisioned::deserialize_revisioned(&mut bytes)
}
#[inline]
pub fn to_writer<W, T>(writer: &mut W, t: &T) -> Result<(), Error>
where
W: Write,
T: SerializeRevisioned,
{
SerializeRevisioned::serialize_revisioned(t, writer)
}
#[inline]
pub fn to_vec<T>(t: &T) -> Result<Vec<u8>, Error>
where
T: SerializeRevisioned,
{
let mut res = Vec::new();
SerializeRevisioned::serialize_revisioned(t, &mut res)?;
Ok(res)
}