1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#![deny(missing_docs)]
extern crate bincode;
extern crate crc64;
extern crate serde;
extern crate serde_derive;
extern crate versionize_derive;
extern crate vm_memory;
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;
#[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));
}
}