#![deny(missing_docs)]
extern crate bincode;
extern crate crc64;
extern crate serde;
extern crate serde_derive;
extern crate versionize_derive;
extern crate vmm_sys_util;
pub mod crc;
pub mod primitives;
pub mod version_map;
use std::any::TypeId;
use std::io::{Read, Write};
pub use version_map::VersionMap;
use versionize_derive::Versionize;
#[allow(clippy::derive_partial_eq_without_eq)] #[derive(Debug, PartialEq)]
pub enum VersionizeError {
Io(i32),
Serialize(String),
Deserialize(String),
Semantic(String),
StringLength(usize),
VecLength(usize),
}
impl std::fmt::Display for VersionizeError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::result::Result<(), std::fmt::Error> {
use VersionizeError::*;
match self {
Io(e) => write!(f, "An IO error occured: {}", e),
Serialize(e) => write!(f, "A serialization error occured: {}", e),
Deserialize(e) => write!(f, "A deserialization error occured: {}", e),
Semantic(e) => write!(f, "A user generated semantic error occured: {}", e),
StringLength(bad_len) => write!(
f,
"String length exceeded {} > {} bytes",
bad_len,
primitives::MAX_STRING_LEN
),
VecLength(bad_len) => write!(
f,
"Vec of length {} exceeded maximum size of {} bytes",
bad_len,
primitives::MAX_VEC_SIZE
),
}
}
}
pub type VersionizeResult<T> = std::result::Result<T, VersionizeError>;
pub trait Versionize {
fn serialize<W: Write>(
&self,
writer: &mut W,
version_map: &VersionMap,
target_version: u16,
) -> VersionizeResult<()>;
fn deserialize<R: Read>(
reader: &mut R,
version_map: &VersionMap,
source_version: u16,
) -> VersionizeResult<Self>
where
Self: Sized;
fn type_id() -> std::any::TypeId
where
Self: 'static,
{
TypeId::of::<Self>()
}
fn version() -> u16;
}
#[cfg(test)]
mod tests {
#[test]
fn test_error_debug_display() {
use VersionizeError::*;
let str = String::from("test");
format!("{:?}{}", Io(0), Io(0));
format!("{:?}{}", Serialize(str.clone()), Serialize(str.clone()));
format!("{:?}{}", Deserialize(str.clone()), Deserialize(str.clone()));
format!("{:?}{}", Semantic(str.clone()), Semantic(str));
}
}