1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
use crate::{ Any, CheckDerConstraints, DynTagged, Error, FromBer, FromDer, ParseResult, Tag, ToDer, }; impl<'a, T> FromBer<'a> for Option<T> where T: FromBer<'a>, { fn from_ber(bytes: &'a [u8]) -> ParseResult<Self> { if bytes.is_empty() { return Ok((bytes, None)); } match T::from_ber(bytes) { Ok((rem, t)) => Ok((rem, Some(t))), Err(nom::Err::Failure(Error::UnexpectedTag { .. })) => Ok((bytes, None)), Err(e) => Err(e), } } } impl<'a, T> FromDer<'a> for Option<T> where T: FromDer<'a>, { fn from_der(bytes: &'a [u8]) -> ParseResult<Self> { if bytes.is_empty() { return Ok((bytes, None)); } match T::from_der(bytes) { Ok((rem, t)) => Ok((rem, Some(t))), Err(nom::Err::Failure(Error::UnexpectedTag { .. })) => Ok((bytes, None)), Err(e) => Err(e), } } } impl<T> CheckDerConstraints for Option<T> where T: CheckDerConstraints, { fn check_constraints(any: &Any) -> crate::Result<()> { T::check_constraints(any) } } impl<T> DynTagged for Option<T> where T: DynTagged, { fn tag(&self) -> Tag { if self.is_some() { self.tag() } else { Tag(0) } } } impl<T> ToDer for Option<T> where T: ToDer, { fn to_der_len(&self) -> crate::Result<usize> { match self { None => Ok(0), Some(t) => t.to_der_len(), } } fn write_der_header(&self, writer: &mut dyn std::io::Write) -> crate::SerializeResult<usize> { match self { None => Ok(0), Some(t) => t.write_der_header(writer), } } fn write_der_content(&self, writer: &mut dyn std::io::Write) -> crate::SerializeResult<usize> { match self { None => Ok(0), Some(t) => t.write_der_content(writer), } } }