variable_len_reader/synchronous/
reader.rs

1use crate::synchronous::VariableReadable;
2
3/// AP means all-platform. This is used for usize/isize converting from u128/i128.
4/// CP means current-platform. It reads usize/isize directly.
5#[allow(unused_macros)]
6macro_rules! read_size_ap {
7    (f $feature: meta, $primitive: ty, $func: ident, $read_internal: ident) => {
8        #[$feature]
9        #[cfg_attr(docsrs, doc($feature))]
10        #[inline]
11        fn $func(&mut self) -> ::core::result::Result<$primitive, Self::Error> {
12            self.$read_internal().map(|v| v as $primitive)
13        }
14    };
15}
16
17include!("read_bools.rs");
18
19include!("read_raw.rs");
20include!("read_raw_size.rs");
21
22include!("read_varint.rs");
23include!("read_varint_size.rs");
24include!("read_varint_long.rs");
25include!("read_varint_long_size.rs");
26
27include!("read_signed_varint.rs");
28include!("read_signed_varint_size.rs");
29include!("read_signed_varint_long.rs");
30include!("read_signed_varint_long_size.rs");
31
32include!("read_float_varint.rs");
33include!("read_float_varint_long.rs");
34
35pub trait VariableReader: VariableReadable {
36    fn read_bool_error(func_name: &'static str, byte: u8) -> Self::Error;
37
38    #[inline]
39    fn read_bool(&mut self) -> Result<bool, Self::Error> {
40        match self.read_single()? {
41            0 => Ok(false),
42            1 => Ok(true),
43            b => Err(Self::read_bool_error("read_bool", b)),
44        }
45    }
46
47    define_read_bools!();
48
49    define_read_raw!();
50    define_read_raw_size!();
51
52    define_read_varint!();
53    define_read_varint_size!();
54    define_read_varint_long!();
55    define_read_varint_long_size!();
56
57    define_read_signed_varint!();
58    define_read_signed_varint_size!();
59    define_read_signed_varint_long!();
60    define_read_signed_varint_long_size!();
61
62    define_read_float_varint!();
63    define_read_float_varint_long!();
64
65    #[cfg(feature = "sync_u8_vec")]
66    #[cfg_attr(docsrs, doc(cfg(feature = "sync_u8_vec")))]
67    #[inline]
68    fn read_u8_vec(&mut self) -> Result<alloc::vec::Vec<u8>, Self::Error> {
69        let length = self.read_usize_varint_ap()?;
70        let mut bytes = alloc::vec![0; length];
71        self.read_more(&mut bytes)?;
72        Ok(bytes)
73    }
74
75    #[cfg(feature = "sync_string")]
76    #[cfg_attr(docsrs, doc(cfg(feature = "sync_string")))]
77    fn read_string_error(func_name: &'static str, error: alloc::string::FromUtf8Error) -> Self::Error;
78
79    #[cfg(feature = "sync_string")]
80    #[cfg_attr(docsrs, doc(cfg(feature = "sync_string")))]
81    #[inline]
82    fn read_string(&mut self) -> Result<alloc::string::String, Self::Error> {
83        match alloc::string::String::from_utf8(self.read_u8_vec()?) {
84            Ok(s) => Ok(s),
85            Err(e) => Err(Self::read_string_error("read_string", e)),
86        }
87    }
88}