1use crate::{Choice, Decode, DerOrd, Encode, Error, Length, Reader, Tag, Writer};
4use core::cmp::Ordering;
5
6impl<'a, T> Decode<'a> for Option<T>
7where
8 T: Choice<'a>, {
10 type Error = T::Error;
11
12 fn decode<R: Reader<'a>>(reader: &mut R) -> Result<Option<T>, Self::Error> {
13 if reader.is_finished() {
14 return Ok(None);
15 }
16
17 if T::can_decode(Tag::peek(reader)?) {
18 return T::decode(reader).map(Some);
19 }
20
21 Ok(None)
22 }
23}
24
25impl<T> DerOrd for Option<T>
26where
27 T: DerOrd,
28{
29 fn der_cmp(&self, other: &Self) -> Result<Ordering, Error> {
30 match self {
31 Some(a) => match other {
32 Some(b) => a.der_cmp(b),
33 None => Ok(Ordering::Greater),
34 },
35 None => Ok(Ordering::Less),
36 }
37 }
38}
39
40impl<T> Encode for Option<T>
41where
42 T: Encode,
43{
44 fn encoded_len(&self) -> Result<Length, Error> {
45 (&self).encoded_len()
46 }
47
48 fn encode(&self, writer: &mut impl Writer) -> Result<(), Error> {
49 (&self).encode(writer)
50 }
51}
52
53impl<T> Encode for &Option<T>
54where
55 T: Encode,
56{
57 fn encoded_len(&self) -> Result<Length, Error> {
58 match self {
59 Some(encodable) => encodable.encoded_len(),
60 None => Ok(0u8.into()),
61 }
62 }
63
64 fn encode(&self, writer: &mut impl Writer) -> Result<(), Error> {
65 match self {
66 Some(encodable) => encodable.encode(writer),
67 None => Ok(()),
68 }
69 }
70}