Coverage Report

Created: 2026-08-14 06:55

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/nested.rs
Line
Count
Source
1
//! Reader type for consuming nested TLV records within a DER document.
2
3
use crate::{reader::Reader, Error, ErrorKind, Header, Length, Result};
4
5
/// Reader type used by [`Reader::read_nested`].
6
pub struct NestedReader<'i, R> {
7
    /// Inner reader type.
8
    inner: &'i mut R,
9
10
    /// Nested input length.
11
    input_len: Length,
12
13
    /// Position within the nested input.
14
    position: Length,
15
}
16
17
impl<'i, 'r, R: Reader<'r>> NestedReader<'i, R> {
18
    /// Create a new nested reader which can read the given [`Length`].
19
3.19k
    pub(crate) fn new(inner: &'i mut R, len: Length) -> Result<Self> {
20
3.19k
        if len <= inner.remaining_len() {
21
3.19k
            Ok(Self {
22
3.19k
                inner,
23
3.19k
                input_len: len,
24
3.19k
                position: Length::ZERO,
25
3.19k
            })
26
        } else {
27
            Err(ErrorKind::Incomplete {
28
0
                expected_len: (inner.offset() + len)?,
29
0
                actual_len: (inner.offset() + inner.remaining_len())?,
30
            }
31
0
            .at(inner.offset()))
32
        }
33
3.19k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>::new
<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>::new
Line
Count
Source
19
3.19k
    pub(crate) fn new(inner: &'i mut R, len: Length) -> Result<Self> {
20
3.19k
        if len <= inner.remaining_len() {
21
3.19k
            Ok(Self {
22
3.19k
                inner,
23
3.19k
                input_len: len,
24
3.19k
                position: Length::ZERO,
25
3.19k
            })
26
        } else {
27
            Err(ErrorKind::Incomplete {
28
0
                expected_len: (inner.offset() + len)?,
29
0
                actual_len: (inner.offset() + inner.remaining_len())?,
30
            }
31
0
            .at(inner.offset()))
32
        }
33
3.19k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<_>>::new
34
35
    /// Move the position cursor the given length, returning an error if there
36
    /// isn't enough remaining data in the nested input.
37
19.1k
    fn advance_position(&mut self, len: Length) -> Result<()> {
38
19.1k
        let new_position = (self.position + len)?;
39
40
19.1k
        if new_position <= self.input_len {
41
19.1k
            self.position = new_position;
42
19.1k
            Ok(())
43
        } else {
44
            Err(ErrorKind::Incomplete {
45
0
                expected_len: (self.inner.offset() + len)?,
46
0
                actual_len: (self.inner.offset() + self.remaining_len())?,
47
            }
48
0
            .at(self.inner.offset()))
49
        }
50
19.1k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>::advance_position
<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>::advance_position
Line
Count
Source
37
19.1k
    fn advance_position(&mut self, len: Length) -> Result<()> {
38
19.1k
        let new_position = (self.position + len)?;
39
40
19.1k
        if new_position <= self.input_len {
41
19.1k
            self.position = new_position;
42
19.1k
            Ok(())
43
        } else {
44
            Err(ErrorKind::Incomplete {
45
0
                expected_len: (self.inner.offset() + len)?,
46
0
                actual_len: (self.inner.offset() + self.remaining_len())?,
47
            }
48
0
            .at(self.inner.offset()))
49
        }
50
19.1k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<_>>::advance_position
51
}
52
53
impl<'i, 'r, R: Reader<'r>> Reader<'r> for NestedReader<'i, R> {
54
3.19k
    fn input_len(&self) -> Length {
55
3.19k
        self.input_len
56
3.19k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> as der::reader::Reader>::input_len
<der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::input_len
Line
Count
Source
54
3.19k
    fn input_len(&self) -> Length {
55
3.19k
        self.input_len
56
3.19k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<_> as der::reader::Reader>::input_len
57
58
0
    fn peek_byte(&self) -> Option<u8> {
59
0
        if self.is_finished() {
60
0
            None
61
        } else {
62
0
            self.inner.peek_byte()
63
        }
64
0
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::peek_byte
Unexecuted instantiation: <der::reader::nested::NestedReader<_> as der::reader::Reader>::peek_byte
65
66
0
    fn peek_header(&self) -> Result<Header> {
67
0
        if self.is_finished() {
68
0
            Err(Error::incomplete(self.offset()))
69
        } else {
70
            // TODO(tarcieri): handle peeking past nested length
71
0
            self.inner.peek_header()
72
        }
73
0
    }
74
75
3.19k
    fn position(&self) -> Length {
76
3.19k
        self.position
77
3.19k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> as der::reader::Reader>::position
<der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::position
Line
Count
Source
75
3.19k
    fn position(&self) -> Length {
76
3.19k
        self.position
77
3.19k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<_> as der::reader::Reader>::position
78
79
6.39k
    fn read_slice(&mut self, len: Length) -> Result<&'r [u8]> {
80
6.39k
        self.advance_position(len)?;
81
6.39k
        self.inner.read_slice(len)
82
6.39k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> as der::reader::Reader>::read_slice
<der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::read_slice
Line
Count
Source
79
6.39k
    fn read_slice(&mut self, len: Length) -> Result<&'r [u8]> {
80
6.39k
        self.advance_position(len)?;
81
6.39k
        self.inner.read_slice(len)
82
6.39k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<_> as der::reader::Reader>::read_slice
83
84
0
    fn error(&mut self, kind: ErrorKind) -> Error {
85
0
        self.inner.error(kind)
86
0
    }
87
88
0
    fn offset(&self) -> Length {
89
0
        self.inner.offset()
90
0
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::offset
Unexecuted instantiation: <der::reader::nested::NestedReader<_> as der::reader::Reader>::offset
91
92
12.7k
    fn read_into<'o>(&mut self, out: &'o mut [u8]) -> Result<&'o [u8]> {
93
12.7k
        self.advance_position(Length::try_from(out.len())?)?;
94
12.7k
        self.inner.read_into(out)
95
12.7k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>> as der::reader::Reader>::read_into
<der::reader::nested::NestedReader<der::reader::slice::SliceReader> as der::reader::Reader>::read_into
Line
Count
Source
92
12.7k
    fn read_into<'o>(&mut self, out: &'o mut [u8]) -> Result<&'o [u8]> {
93
12.7k
        self.advance_position(Length::try_from(out.len())?)?;
94
12.7k
        self.inner.read_into(out)
95
12.7k
    }
Unexecuted instantiation: <der::reader::nested::NestedReader<_> as der::reader::Reader>::read_into
96
}