1mod de;
2mod error;
3mod marker;
4mod read_ext;
5mod ser;
6mod value;
7mod varint;
8use marker::Marker;
9
10pub use error::{Error, Result};
11pub use value::Value;
12
13use std::io::Read;
14
15use read_ext::ReadExt;
16use ser::Serializer;
17
18use de::Deserializer;
19use serde::{de::DeserializeOwned, Serialize};
20
21const MAX_STRING_LEN_POSSIBLE: usize = 2000000000;
22const HEADER: &[u8] = b"\x01\x11\x01\x01\x01\x01\x02\x01";
23const PORTABLE_STORAGE_VERSION: u8 = 1;
24
25pub fn to_bytes<T>(object: &T) -> Result<Vec<u8>>
26where
27 T: Serialize,
28{
29 let mut buffer = Vec::new();
30 buffer.extend_from_slice(HEADER);
31 buffer.push(PORTABLE_STORAGE_VERSION);
32
33 let mut serializer = Serializer::new_root(&mut buffer);
34 object.serialize(&mut serializer)?;
35
36 Ok(buffer)
37}
38
39pub fn from_bytes<T, B>(bytes: B) -> Result<T>
40where
41 T: DeserializeOwned,
42 B: AsRef<[u8]>,
43{
44 let mut bytes = bytes.as_ref();
45
46 let mut header = [0u8; 8];
47 bytes.read_exact(&mut header)?;
48
49 if header != HEADER {
50 return Err(Error::MissingHeader);
51 }
52
53 let version = bytes.read_u8()?;
54 if version != PORTABLE_STORAGE_VERSION {
55 return Err(Error::InvalidVersion(version));
56 }
57
58 let mut deserializer = Deserializer::from_bytes(&mut bytes);
59
60 T::deserialize(&mut deserializer)
61}