Coverage Report

Created: 2026-08-13 06:34

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/der-0.7.10/src/asn1/optional.rs
Line
Count
Source
1
//! ASN.1 `OPTIONAL` as mapped to Rust's `Option` type
2
3
use crate::{Choice, Decode, DerOrd, Encode, Length, Reader, Result, Tag, Writer};
4
use core::cmp::Ordering;
5
6
impl<'a, T> Decode<'a> for Option<T>
7
where
8
    T: Choice<'a>, // NOTE: all `Decode + Tagged` types receive a blanket `Choice` impl
9
{
10
109k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Option<T>> {
11
109k
        if let Some(byte) = reader.peek_byte() {
12
78.4k
            if T::can_decode(Tag::try_from(byte)?) {
13
53.8k
                return T::decode(reader).map(Some);
14
24.4k
            }
15
31.1k
        }
16
17
55.5k
        Ok(None)
18
109k
    }
<core::option::Option<der::asn1::any::allocating::Any> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>>
Line
Count
Source
10
21.9k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Option<T>> {
11
21.9k
        if let Some(byte) = reader.peek_byte() {
12
17.8k
            if T::can_decode(Tag::try_from(byte)?) {
13
17.7k
                return T::decode(reader).map(Some);
14
0
            }
15
4.15k
        }
16
17
4.15k
        Ok(None)
18
21.9k
    }
<core::option::Option<der::asn1::any::allocating::Any> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>
Line
Count
Source
10
35.1k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Option<T>> {
11
35.1k
        if let Some(byte) = reader.peek_byte() {
12
14.4k
            if T::can_decode(Tag::try_from(byte)?) {
13
14.4k
                return T::decode(reader).map(Some);
14
0
            }
15
20.6k
        }
16
17
20.6k
        Ok(None)
18
35.1k
    }
<core::option::Option<der::asn1::any::allocating::Any> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>
Line
Count
Source
10
15.1k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Option<T>> {
11
15.1k
        if let Some(byte) = reader.peek_byte() {
12
9.63k
            if T::can_decode(Tag::try_from(byte)?) {
13
9.60k
                return T::decode(reader).map(Some);
14
0
            }
15
5.55k
        }
16
17
5.55k
        Ok(None)
18
15.1k
    }
Unexecuted instantiation: <core::option::Option<der::asn1::any::allocating::Any> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
<core::option::Option<bool> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>>>
Line
Count
Source
10
34.9k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Option<T>> {
11
34.9k
        if let Some(byte) = reader.peek_byte() {
12
34.9k
            if T::can_decode(Tag::try_from(byte)?) {
13
10.7k
                return T::decode(reader).map(Some);
14
24.1k
            }
15
44
        }
16
17
24.1k
        Ok(None)
18
34.9k
    }
Unexecuted instantiation: <core::option::Option<bool> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>>>>
<core::option::Option<bool> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Line
Count
Source
10
1.20k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Option<T>> {
11
1.20k
        if let Some(byte) = reader.peek_byte() {
12
1.19k
            if T::can_decode(Tag::try_from(byte)?) {
13
904
                return T::decode(reader).map(Some);
14
268
            }
15
16
        }
16
17
284
        Ok(None)
18
1.20k
    }
<core::option::Option<u32> as der::decode::Decode>::decode::<der::reader::nested::NestedReader<der::reader::slice::SliceReader>>
Line
Count
Source
10
1.05k
    fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Option<T>> {
11
1.05k
        if let Some(byte) = reader.peek_byte() {
12
412
            if T::can_decode(Tag::try_from(byte)?) {
13
328
                return T::decode(reader).map(Some);
14
70
            }
15
642
        }
16
17
712
        Ok(None)
18
1.05k
    }
Unexecuted instantiation: <core::option::Option<_> as der::decode::Decode>::decode::<_>
19
}
20
21
impl<T> DerOrd for Option<T>
22
where
23
    T: DerOrd,
24
{
25
0
    fn der_cmp(&self, other: &Self) -> Result<Ordering> {
26
0
        match self {
27
0
            Some(a) => match other {
28
0
                Some(b) => a.der_cmp(b),
29
0
                None => Ok(Ordering::Greater),
30
            },
31
0
            None => Ok(Ordering::Less),
32
        }
33
0
    }
34
}
35
36
impl<T> Encode for Option<T>
37
where
38
    T: Encode,
39
{
40
11.2k
    fn encoded_len(&self) -> Result<Length> {
41
11.2k
        (&self).encoded_len()
42
11.2k
    }
<core::option::Option<der::asn1::any::allocating::Any> as der::encode::Encode>::encoded_len
Line
Count
Source
40
9.01k
    fn encoded_len(&self) -> Result<Length> {
41
9.01k
        (&self).encoded_len()
42
9.01k
    }
<core::option::Option<bool> as der::encode::Encode>::encoded_len
Line
Count
Source
40
2.28k
    fn encoded_len(&self) -> Result<Length> {
41
2.28k
        (&self).encoded_len()
42
2.28k
    }
Unexecuted instantiation: <core::option::Option<u32> as der::encode::Encode>::encoded_len
Unexecuted instantiation: <core::option::Option<_> as der::encode::Encode>::encoded_len
43
44
3.03k
    fn encode(&self, writer: &mut impl Writer) -> Result<()> {
45
3.03k
        (&self).encode(writer)
46
3.03k
    }
<core::option::Option<der::asn1::any::allocating::Any> as der::encode::Encode>::encode::<der::writer::slice::SliceWriter>
Line
Count
Source
44
2.57k
    fn encode(&self, writer: &mut impl Writer) -> Result<()> {
45
2.57k
        (&self).encode(writer)
46
2.57k
    }
<core::option::Option<bool> as der::encode::Encode>::encode::<der::writer::slice::SliceWriter>
Line
Count
Source
44
456
    fn encode(&self, writer: &mut impl Writer) -> Result<()> {
45
456
        (&self).encode(writer)
46
456
    }
Unexecuted instantiation: <core::option::Option<_> as der::encode::Encode>::encode::<_>
47
}
48
49
impl<T> Encode for &Option<T>
50
where
51
    T: Encode,
52
{
53
11.2k
    fn encoded_len(&self) -> Result<Length> {
54
11.2k
        match self {
55
7.11k
            Some(encodable) => encodable.encoded_len(),
56
4.18k
            None => Ok(0u8.into()),
57
        }
58
11.2k
    }
<&core::option::Option<der::asn1::any::allocating::Any> as der::encode::Encode>::encoded_len
Line
Count
Source
53
9.01k
    fn encoded_len(&self) -> Result<Length> {
54
9.01k
        match self {
55
5.71k
            Some(encodable) => encodable.encoded_len(),
56
3.30k
            None => Ok(0u8.into()),
57
        }
58
9.01k
    }
<&core::option::Option<bool> as der::encode::Encode>::encoded_len
Line
Count
Source
53
2.28k
    fn encoded_len(&self) -> Result<Length> {
54
2.28k
        match self {
55
1.40k
            Some(encodable) => encodable.encoded_len(),
56
880
            None => Ok(0u8.into()),
57
        }
58
2.28k
    }
Unexecuted instantiation: <&core::option::Option<u32> as der::encode::Encode>::encoded_len
Unexecuted instantiation: <&core::option::Option<_> as der::encode::Encode>::encoded_len
59
60
3.03k
    fn encode(&self, encoder: &mut impl Writer) -> Result<()> {
61
3.03k
        match self {
62
1.98k
            Some(encodable) => encodable.encode(encoder),
63
1.04k
            None => Ok(()),
64
        }
65
3.03k
    }
<&core::option::Option<der::asn1::any::allocating::Any> as der::encode::Encode>::encode::<der::writer::slice::SliceWriter>
Line
Count
Source
60
2.57k
    fn encode(&self, encoder: &mut impl Writer) -> Result<()> {
61
2.57k
        match self {
62
1.70k
            Some(encodable) => encodable.encode(encoder),
63
872
            None => Ok(()),
64
        }
65
2.57k
    }
<&core::option::Option<bool> as der::encode::Encode>::encode::<der::writer::slice::SliceWriter>
Line
Count
Source
60
456
    fn encode(&self, encoder: &mut impl Writer) -> Result<()> {
61
456
        match self {
62
280
            Some(encodable) => encodable.encode(encoder),
63
176
            None => Ok(()),
64
        }
65
456
    }
Unexecuted instantiation: <&core::option::Option<_> as der::encode::Encode>::encode::<_>
66
}