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, other) {
31 (Some(a), Some(b)) => a.der_cmp(b),
32 (Some(_), None) => Ok(Ordering::Greater),
33 (None, Some(_)) => Ok(Ordering::Less),
34 (None, None) => Ok(Ordering::Equal),
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}
71
72#[cfg(test)]
73mod tests {
74 use crate::DerOrd;
75 use core::cmp::Ordering;
76
77 #[test]
78 fn der_cmp() {
79 let none: Option<u8> = None;
80 assert_eq!(none.der_cmp(&None), Ok(Ordering::Equal));
81 assert_eq!(none.der_cmp(&Some(0)), Ok(Ordering::Less));
82 assert_eq!(Some(0u8).der_cmp(&None), Ok(Ordering::Greater));
83 assert_eq!(Some(1u8).der_cmp(&Some(2)), Ok(Ordering::Less));
84 assert_eq!(Some(2u8).der_cmp(&Some(2)), Ok(Ordering::Equal));
85 }
86}