Coverage Report

Created: 2026-01-13 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/der-0.7.10/src/reader/slice.rs
Line
Count
Source
1
//! Slice reader.
2
3
use crate::{BytesRef, Decode, Error, ErrorKind, Header, Length, Reader, Result, Tag};
4
5
/// [`Reader`] which consumes an input byte slice.
6
#[derive(Clone, Debug)]
7
pub struct SliceReader<'a> {
8
    /// Byte slice being decoded.
9
    bytes: BytesRef<'a>,
10
11
    /// Did the decoding operation fail?
12
    failed: bool,
13
14
    /// Position within the decoded slice.
15
    position: Length,
16
}
17
18
impl<'a> SliceReader<'a> {
19
    /// Create a new slice reader for the given byte slice.
20
21.2k
    pub fn new(bytes: &'a [u8]) -> Result<Self> {
21
        Ok(Self {
22
21.2k
            bytes: BytesRef::new(bytes)?,
23
            failed: false,
24
            position: Length::ZERO,
25
        })
26
21.2k
    }
27
28
    /// Return an error with the given [`ErrorKind`], annotating it with
29
    /// context about where the error occurred.
30
1.12k
    pub fn error(&mut self, kind: ErrorKind) -> Error {
31
1.12k
        self.failed = true;
32
1.12k
        kind.at(self.position)
33
1.12k
    }
34
35
    /// Return an error for an invalid value with the given tag.
36
0
    pub fn value_error(&mut self, tag: Tag) -> Error {
37
0
        self.error(tag.value_error().kind())
38
0
    }
39
40
    /// Did the decoding operation fail due to an error?
41
268k
    pub fn is_failed(&self) -> bool {
42
268k
        self.failed
43
268k
    }
44
45
    /// Obtain the remaining bytes in this slice reader from the current cursor
46
    /// position.
47
101k
    fn remaining(&self) -> Result<&'a [u8]> {
48
101k
        if self.is_failed() {
49
0
            Err(ErrorKind::Failed.at(self.position))
50
        } else {
51
101k
            self.bytes
52
101k
                .as_slice()
53
101k
                .get(self.position.try_into()?..)
54
101k
                .ok_or_else(|| Error::incomplete(self.input_len()))
55
        }
56
101k
    }
57
}
58
59
impl<'a> Reader<'a> for SliceReader<'a> {
60
14.2k
    fn input_len(&self) -> Length {
61
14.2k
        self.bytes.len()
62
14.2k
    }
63
64
0
    fn peek_byte(&self) -> Option<u8> {
65
0
        self.remaining()
66
0
            .ok()
67
0
            .and_then(|bytes| bytes.first().cloned())
68
0
    }
69
70
0
    fn peek_header(&self) -> Result<Header> {
71
0
        Header::decode(&mut self.clone())
72
0
    }
73
74
72
    fn position(&self) -> Length {
75
72
        self.position
76
72
    }
77
78
101k
    fn read_slice(&mut self, len: Length) -> Result<&'a [u8]> {
79
101k
        if self.is_failed() {
80
0
            return Err(self.error(ErrorKind::Failed));
81
101k
        }
82
83
101k
        match self.remaining()?.get(..len.try_into()?) {
84
99.8k
            Some(result) => {
85
99.8k
                self.position = (self.position + len)?;
86
99.8k
                Ok(result)
87
            }
88
1.12k
            None => Err(self.error(ErrorKind::Incomplete {
89
1.12k
                expected_len: (self.position + len)?,
90
1.12k
                actual_len: self.input_len(),
91
            })),
92
        }
93
101k
    }
94
95
53.3k
    fn decode<T: Decode<'a>>(&mut self) -> Result<T> {
96
53.3k
        if self.is_failed() {
97
0
            return Err(self.error(ErrorKind::Failed));
98
53.3k
        }
99
100
53.3k
        T::decode(self).map_err(|e| {
101
11.8k
            self.failed = true;
102
11.8k
            e.nested(self.position)
103
11.8k
        })
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<[anise::structure::planetocentric::phaseangle::PhaseAngle<0>; 32]>::{closure#0}
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<[f64; 32]>::{closure#0}
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<alloc::vec::Vec<der::asn1::octet_string::OctetStringRef>>::{closure#0}
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<alloc::vec::Vec<anise::structure::location::TerrainMask>>::{closure#0}
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<alloc::vec::Vec<i32>>::{closure#0}
Line
Count
Source
100
185
        T::decode(self).map_err(|e| {
101
185
            self.failed = true;
102
185
            e.nested(self.position)
103
185
        })
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<alloc::vec::Vec<u32>>::{closure#0}
Line
Count
Source
100
24
        T::decode(self).map_err(|e| {
101
24
            self.failed = true;
102
24
            e.nested(self.position)
103
24
        })
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::planetocentric::phaseangle::PhaseAngle<32>>::{closure#0}
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<der::asn1::utf8_string::Utf8StringRef>::{closure#0}
Line
Count
Source
100
1.42k
        T::decode(self).map_err(|e| {
101
1.42k
            self.failed = true;
102
1.42k
            e.nested(self.position)
103
1.42k
        })
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<der::asn1::octet_string::OctetStringRef>::{closure#0}
Line
Count
Source
100
2.26k
        T::decode(self).map_err(|e| {
101
2.26k
            self.failed = true;
102
2.26k
            e.nested(self.position)
103
2.26k
        })
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::frames::frameuid::FrameUid>::{closure#0}
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::lookuptable::LookUpTable>::{closure#0}
Line
Count
Source
100
209
        T::decode(self).map_err(|e| {
101
209
            self.failed = true;
102
209
            e.nested(self.position)
103
209
        })
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::semver::Semver>::{closure#0}
Line
Count
Source
100
767
        T::decode(self).map_err(|e| {
101
767
            self.failed = true;
102
767
            e.nested(self.position)
103
767
        })
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::metadata::Metadata>::{closure#0}
Line
Count
Source
100
6.40k
        T::decode(self).map_err(|e| {
101
6.40k
            self.failed = true;
102
6.40k
            e.nested(self.position)
103
6.40k
        })
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<der::asn1::octet_string::allocating::OctetString>::{closure#0}
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::spacecraft::srp::SRPData>::{closure#0}
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::spacecraft::drag::DragData>::{closure#0}
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::spacecraft::mass::Mass>::{closure#0}
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::spacecraft::inertia::Inertia>::{closure#0}
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::planetocentric::ellipsoid::Ellipsoid>::{closure#0}
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::dataset::datatype::DataSetType>::{closure#0}
Line
Count
Source
100
246
        T::decode(self).map_err(|e| {
101
246
            self.failed = true;
102
246
            e.nested(self.position)
103
246
        })
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<bool>::{closure#0}
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<f64>::{closure#0}
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<u8>::{closure#0}
Line
Count
Source
100
348
        T::decode(self).map_err(|e| {
101
348
            self.failed = true;
102
348
            e.nested(self.position)
103
348
        })
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<i32>::{closure#0}
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<u32>::{closure#0}
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<_>::{closure#0}
104
53.3k
    }
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<[anise::structure::planetocentric::phaseangle::PhaseAngle<0>; 32]>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<[f64; 32]>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<alloc::vec::Vec<der::asn1::octet_string::OctetStringRef>>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<alloc::vec::Vec<anise::structure::location::TerrainMask>>
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<alloc::vec::Vec<i32>>
Line
Count
Source
95
209
    fn decode<T: Decode<'a>>(&mut self) -> Result<T> {
96
209
        if self.is_failed() {
97
0
            return Err(self.error(ErrorKind::Failed));
98
209
        }
99
100
209
        T::decode(self).map_err(|e| {
101
            self.failed = true;
102
            e.nested(self.position)
103
        })
104
209
    }
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<alloc::vec::Vec<u32>>
Line
Count
Source
95
24
    fn decode<T: Decode<'a>>(&mut self) -> Result<T> {
96
24
        if self.is_failed() {
97
0
            return Err(self.error(ErrorKind::Failed));
98
24
        }
99
100
24
        T::decode(self).map_err(|e| {
101
            self.failed = true;
102
            e.nested(self.position)
103
        })
104
24
    }
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::planetocentric::phaseangle::PhaseAngle<32>>
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<der::asn1::utf8_string::Utf8StringRef>
Line
Count
Source
95
6.63k
    fn decode<T: Decode<'a>>(&mut self) -> Result<T> {
96
6.63k
        if self.is_failed() {
97
0
            return Err(self.error(ErrorKind::Failed));
98
6.63k
        }
99
100
6.63k
        T::decode(self).map_err(|e| {
101
            self.failed = true;
102
            e.nested(self.position)
103
        })
104
6.63k
    }
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<der::asn1::octet_string::OctetStringRef>
Line
Count
Source
95
17.6k
    fn decode<T: Decode<'a>>(&mut self) -> Result<T> {
96
17.6k
        if self.is_failed() {
97
0
            return Err(self.error(ErrorKind::Failed));
98
17.6k
        }
99
100
17.6k
        T::decode(self).map_err(|e| {
101
            self.failed = true;
102
            e.nested(self.position)
103
        })
104
17.6k
    }
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::frames::frameuid::FrameUid>
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::lookuptable::LookUpTable>
Line
Count
Source
95
209
    fn decode<T: Decode<'a>>(&mut self) -> Result<T> {
96
209
        if self.is_failed() {
97
0
            return Err(self.error(ErrorKind::Failed));
98
209
        }
99
100
209
        T::decode(self).map_err(|e| {
101
            self.failed = true;
102
            e.nested(self.position)
103
        })
104
209
    }
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::semver::Semver>
Line
Count
Source
95
6.61k
    fn decode<T: Decode<'a>>(&mut self) -> Result<T> {
96
6.61k
        if self.is_failed() {
97
0
            return Err(self.error(ErrorKind::Failed));
98
6.61k
        }
99
100
6.61k
        T::decode(self).map_err(|e| {
101
            self.failed = true;
102
            e.nested(self.position)
103
        })
104
6.61k
    }
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::metadata::Metadata>
Line
Count
Source
95
6.61k
    fn decode<T: Decode<'a>>(&mut self) -> Result<T> {
96
6.61k
        if self.is_failed() {
97
0
            return Err(self.error(ErrorKind::Failed));
98
6.61k
        }
99
100
6.61k
        T::decode(self).map_err(|e| {
101
            self.failed = true;
102
            e.nested(self.position)
103
        })
104
6.61k
    }
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<der::asn1::octet_string::allocating::OctetString>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::spacecraft::srp::SRPData>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::spacecraft::drag::DragData>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::spacecraft::mass::Mass>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::spacecraft::inertia::Inertia>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::planetocentric::ellipsoid::Ellipsoid>
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<anise::structure::dataset::datatype::DataSetType>
Line
Count
Source
95
5.85k
    fn decode<T: Decode<'a>>(&mut self) -> Result<T> {
96
5.85k
        if self.is_failed() {
97
0
            return Err(self.error(ErrorKind::Failed));
98
5.85k
        }
99
100
5.85k
        T::decode(self).map_err(|e| {
101
            self.failed = true;
102
            e.nested(self.position)
103
        })
104
5.85k
    }
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<bool>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<f64>
<der::reader::slice::SliceReader as der::reader::Reader>::decode::<u8>
Line
Count
Source
95
9.47k
    fn decode<T: Decode<'a>>(&mut self) -> Result<T> {
96
9.47k
        if self.is_failed() {
97
0
            return Err(self.error(ErrorKind::Failed));
98
9.47k
        }
99
100
9.47k
        T::decode(self).map_err(|e| {
101
            self.failed = true;
102
            e.nested(self.position)
103
        })
104
9.47k
    }
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<i32>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<u32>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::decode::<_>
105
106
0
    fn error(&mut self, kind: ErrorKind) -> Error {
107
0
        self.failed = true;
108
0
        kind.at(self.position)
109
0
    }
110
111
12.9k
    fn finish<T>(self, value: T) -> Result<T> {
112
12.9k
        if self.is_failed() {
113
0
            Err(ErrorKind::Failed.at(self.position))
114
12.9k
        } else if !self.is_finished() {
115
0
            Err(ErrorKind::TrailingData {
116
0
                decoded: self.position,
117
0
                remaining: self.remaining_len(),
118
0
            }
119
0
            .at(self.position))
120
        } else {
121
12.9k
            Ok(value)
122
        }
123
12.9k
    }
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<anise::structure::dataset::DataSet<anise::structure::spacecraft::SpacecraftData>>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<anise::structure::dataset::DataSet<anise::structure::planetocentric::PlanetaryData>>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<anise::structure::dataset::DataSet<anise::structure::location::Location>>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<anise::structure::dataset::DataSet<anise::math::rotation::quaternion::EulerParameter>>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<anise::structure::spacecraft::SpacecraftData>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<anise::structure::planetocentric::PlanetaryData>
<der::reader::slice::SliceReader as der::reader::Reader>::finish::<anise::structure::semver::Semver>
Line
Count
Source
111
9.49k
    fn finish<T>(self, value: T) -> Result<T> {
112
9.49k
        if self.is_failed() {
113
0
            Err(ErrorKind::Failed.at(self.position))
114
9.49k
        } else if !self.is_finished() {
115
0
            Err(ErrorKind::TrailingData {
116
0
                decoded: self.position,
117
0
                remaining: self.remaining_len(),
118
0
            }
119
0
            .at(self.position))
120
        } else {
121
9.49k
            Ok(value)
122
        }
123
9.49k
    }
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<anise::structure::location::Location>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<anise::structure::metadata::Metadata>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<anise::math::rotation::quaternion::EulerParameter>
<der::reader::slice::SliceReader as der::reader::Reader>::finish::<anise::structure::dataset::datatype::DataSetType>
Line
Count
Source
111
3.45k
    fn finish<T>(self, value: T) -> Result<T> {
112
3.45k
        if self.is_failed() {
113
0
            Err(ErrorKind::Failed.at(self.position))
114
3.45k
        } else if !self.is_finished() {
115
0
            Err(ErrorKind::TrailingData {
116
0
                decoded: self.position,
117
0
                remaining: self.remaining_len(),
118
0
            }
119
0
            .at(self.position))
120
        } else {
121
3.45k
            Ok(value)
122
        }
123
3.45k
    }
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::document::Document>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::bit_string::BitStringRef>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::ia5_string::Ia5StringRef>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::utf8_string::Utf8StringRef>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::octet_string::OctetStringRef>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::teletex_string::TeletexStringRef>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::videotex_string::VideotexStringRef>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::generalized_time::GeneralizedTime>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::printable_string::PrintableStringRef>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::any::AnyRef>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::null::Null>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::utc_time::UtcTime>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::bit_string::allocating::BitString>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::ia5_string::allocation::Ia5String>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::octet_string::allocating::OctetString>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::teletex_string::allocation::TeletexString>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::printable_string::allocation::PrintableString>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::integer::int::IntRef>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::integer::uint::UintRef>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::integer::int::allocating::Int>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<der::asn1::integer::uint::allocating::Uint>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<i8>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<u8>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<i32>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<u32>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<i128>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<u128>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<i16>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<u16>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<()>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<i64>
Unexecuted instantiation: <der::reader::slice::SliceReader as der::reader::Reader>::finish::<u64>
124
125
13.1k
    fn remaining_len(&self) -> Length {
126
13.1k
        debug_assert!(self.position <= self.input_len());
127
13.1k
        self.input_len().saturating_sub(self.position)
128
13.1k
    }
129
}
130
131
#[cfg(test)]
132
mod tests {
133
    use super::SliceReader;
134
    use crate::{Decode, ErrorKind, Length, Reader, Tag};
135
    use hex_literal::hex;
136
137
    // INTEGER: 42
138
    const EXAMPLE_MSG: &[u8] = &hex!("02012A00");
139
140
    #[test]
141
    fn empty_message() {
142
        let mut reader = SliceReader::new(&[]).unwrap();
143
        let err = bool::decode(&mut reader).err().unwrap();
144
        assert_eq!(Some(Length::ZERO), err.position());
145
146
        match err.kind() {
147
            ErrorKind::Incomplete {
148
                expected_len,
149
                actual_len,
150
            } => {
151
                assert_eq!(actual_len, 0u8.into());
152
                assert_eq!(expected_len, 1u8.into());
153
            }
154
            other => panic!("unexpected error kind: {:?}", other),
155
        }
156
    }
157
158
    #[test]
159
    fn invalid_field_length() {
160
        const MSG_LEN: usize = 2;
161
162
        let mut reader = SliceReader::new(&EXAMPLE_MSG[..MSG_LEN]).unwrap();
163
        let err = i8::decode(&mut reader).err().unwrap();
164
        assert_eq!(Some(Length::from(2u8)), err.position());
165
166
        match err.kind() {
167
            ErrorKind::Incomplete {
168
                expected_len,
169
                actual_len,
170
            } => {
171
                assert_eq!(actual_len, MSG_LEN.try_into().unwrap());
172
                assert_eq!(expected_len, (MSG_LEN + 1).try_into().unwrap());
173
            }
174
            other => panic!("unexpected error kind: {:?}", other),
175
        }
176
    }
177
178
    #[test]
179
    fn trailing_data() {
180
        let mut reader = SliceReader::new(EXAMPLE_MSG).unwrap();
181
        let x = i8::decode(&mut reader).unwrap();
182
        assert_eq!(42i8, x);
183
184
        let err = reader.finish(x).err().unwrap();
185
        assert_eq!(Some(Length::from(3u8)), err.position());
186
187
        assert_eq!(
188
            ErrorKind::TrailingData {
189
                decoded: 3u8.into(),
190
                remaining: 1u8.into()
191
            },
192
            err.kind()
193
        );
194
    }
195
196
    #[test]
197
    fn peek_tag() {
198
        let reader = SliceReader::new(EXAMPLE_MSG).unwrap();
199
        assert_eq!(reader.position(), Length::ZERO);
200
        assert_eq!(reader.peek_tag().unwrap(), Tag::Integer);
201
        assert_eq!(reader.position(), Length::ZERO); // Position unchanged
202
    }
203
204
    #[test]
205
    fn peek_header() {
206
        let reader = SliceReader::new(EXAMPLE_MSG).unwrap();
207
        assert_eq!(reader.position(), Length::ZERO);
208
209
        let header = reader.peek_header().unwrap();
210
        assert_eq!(header.tag, Tag::Integer);
211
        assert_eq!(header.length, Length::ONE);
212
        assert_eq!(reader.position(), Length::ZERO); // Position unchanged
213
    }
214
}