platform_serialization/enc/
mod.rs

1use bincode::enc::Encoder;
2use bincode::error::EncodeError;
3use bincode::{enc, Encode};
4use platform_version::version::PlatformVersion;
5
6mod impls;
7
8#[derive(Default)]
9pub(crate) struct VecWriter {
10    inner: Vec<u8>,
11}
12
13impl VecWriter {
14    /// Create a new vec writer with the given capacity
15    #[allow(dead_code)]
16    #[deprecated(note = "This function is marked as unused.")]
17    #[allow(deprecated)]
18    pub fn with_capacity(cap: usize) -> Self {
19        Self {
20            inner: Vec::with_capacity(cap),
21        }
22    }
23    // May not be used in all feature combinations
24    #[allow(dead_code)]
25    #[deprecated(note = "This function is marked as unused.")]
26    #[allow(deprecated)]
27    pub(crate) fn collect(self) -> Vec<u8> {
28        self.inner
29    }
30}
31
32impl enc::write::Writer for VecWriter {
33    #[inline(always)]
34    fn write(&mut self, bytes: &[u8]) -> Result<(), EncodeError> {
35        self.inner.extend_from_slice(bytes);
36        Ok(())
37    }
38}
39
40pub trait PlatformVersionEncode {
41    /// Encode a given type.
42    fn platform_encode<E: Encoder>(
43        &self,
44        encoder: &mut E,
45        platform_version: &PlatformVersion,
46    ) -> Result<(), EncodeError>;
47}
48
49/// Encode the variant of the given option. Will not encode the option itself.
50#[inline]
51pub(crate) fn encode_option_variant<E: Encoder, T>(
52    encoder: &mut E,
53    value: &Option<T>,
54) -> Result<(), EncodeError> {
55    match value {
56        None => 0u8.encode(encoder),
57        Some(_) => 1u8.encode(encoder),
58    }
59}
60
61/// Encodes the length of any slice, container, etc into the given encoder
62#[inline]
63pub(crate) fn encode_slice_len<E: Encoder>(encoder: &mut E, len: usize) -> Result<(), EncodeError> {
64    (len as u64).encode(encoder)
65}
66
67#[cfg(test)]
68mod tests {
69    use super::*;
70    use bincode::config;
71
72    fn cfg() -> impl bincode::config::Config {
73        config::standard().with_big_endian().with_no_limit()
74    }
75
76    #[test]
77    fn encode_option_variant_none() {
78        let value: Option<u32> = None;
79        let mut writer = VecWriter::default();
80        let mut encoder = bincode::enc::EncoderImpl::new(&mut writer, cfg());
81        encode_option_variant(&mut encoder, &value).unwrap();
82        drop(encoder);
83        assert_eq!(writer.inner, &[0u8]);
84    }
85
86    #[test]
87    fn encode_option_variant_some() {
88        let value: Option<u32> = Some(42);
89        let mut writer = VecWriter::default();
90        let mut encoder = bincode::enc::EncoderImpl::new(&mut writer, cfg());
91        encode_option_variant(&mut encoder, &value).unwrap();
92        drop(encoder);
93        assert_eq!(writer.inner, &[1u8]);
94    }
95
96    #[test]
97    fn encode_slice_len_encodes_as_u64() {
98        let mut writer = VecWriter::default();
99        let mut encoder = bincode::enc::EncoderImpl::new(&mut writer, cfg());
100        encode_slice_len(&mut encoder, 5).unwrap();
101        drop(encoder);
102        // 5 as u64 in big-endian varint
103        let expected = bincode::encode_to_vec(5u64, cfg()).unwrap();
104        assert_eq!(writer.inner, expected);
105    }
106
107    #[test]
108    fn vec_writer_write_impl() {
109        let mut writer = VecWriter::default();
110        bincode::enc::write::Writer::write(&mut writer, b"hello").unwrap();
111        bincode::enc::write::Writer::write(&mut writer, b" world").unwrap();
112        assert_eq!(writer.inner, b"hello world");
113    }
114}