variable_len_reader/synchronous/
reader.rs1use crate::synchronous::VariableReadable;
2
3#[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}