1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
pub use crate::codec_err::DecodeError;
use crate::TryStaticCast;
pub trait NestedDecodeInput {
fn remaining_len(&self) -> usize;
fn is_depleted(&self) -> bool {
self.remaining_len() == 0
}
fn read_into(&mut self, into: &mut [u8]) -> Result<(), DecodeError>;
fn read_into_or_exit<ExitCtx: Clone>(
&mut self,
into: &mut [u8],
c: ExitCtx,
exit: fn(ExitCtx, DecodeError) -> !,
);
#[inline]
fn read_specialized<T, C, F>(&mut self, _context: C, else_deser: F) -> Result<T, DecodeError>
where
T: TryStaticCast,
C: TryStaticCast,
F: FnOnce(&mut Self) -> Result<T, DecodeError>,
{
else_deser(self)
}
#[inline]
fn read_specialized_or_exit<T, C, ExitCtx, F>(
&mut self,
_context: C,
c: ExitCtx,
_exit: fn(ExitCtx, DecodeError) -> !,
else_deser: F,
) -> T
where
T: TryStaticCast,
C: TryStaticCast,
F: FnOnce(&mut Self, ExitCtx) -> T,
ExitCtx: Clone,
{
else_deser(self, c)
}
fn read_byte(&mut self) -> Result<u8, DecodeError> {
let mut buf = [0u8];
self.read_into(&mut buf[..])?;
Ok(buf[0])
}
fn read_byte_or_exit<ExitCtx: Clone>(
&mut self,
c: ExitCtx,
exit: fn(ExitCtx, DecodeError) -> !,
) -> u8 {
let mut buf = [0u8];
self.read_into_or_exit(&mut buf[..], c, exit);
buf[0]
}
}