epee_serde/
lib.rs

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}