platform_serialization/enc/
mod.rs1use 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 #[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 #[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 fn platform_encode<E: Encoder>(
43 &self,
44 encoder: &mut E,
45 platform_version: &PlatformVersion,
46 ) -> Result<(), EncodeError>;
47}
48
49#[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#[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 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}