asn1_rs/asn1_types/
null.rs

1use crate::*;
2use core::convert::TryFrom;
3
4/// ASN.1 `NULL` type
5#[derive(Debug, PartialEq, Eq)]
6pub struct Null {}
7
8impl Default for Null {
9    fn default() -> Self {
10        Self::new()
11    }
12}
13
14impl Null {
15    pub const fn new() -> Self {
16        Null {}
17    }
18}
19
20impl<'a> TryFrom<Any<'a>> for Null {
21    type Error = Error;
22
23    fn try_from(any: Any<'a>) -> Result<Null> {
24        TryFrom::try_from(&any)
25    }
26}
27
28impl<'a, 'b> TryFrom<&'b Any<'a>> for Null {
29    type Error = Error;
30
31    fn try_from(any: &'b Any<'a>) -> Result<Null> {
32        any.tag().assert_eq(Self::TAG)?;
33        if !any.header.length.is_null() {
34            return Err(Error::InvalidLength);
35        }
36        Ok(Null {})
37    }
38}
39
40impl CheckDerConstraints for Null {
41    fn check_constraints(_any: &Any) -> Result<()> {
42        Ok(())
43    }
44}
45
46impl DerAutoDerive for Null {}
47
48impl Tagged for Null {
49    const TAG: Tag = Tag::Null;
50}
51
52#[cfg(feature = "std")]
53impl ToDer for Null {
54    fn to_der_len(&self) -> Result<usize> {
55        Ok(2)
56    }
57
58    fn write_der_header(&self, writer: &mut dyn std::io::Write) -> SerializeResult<usize> {
59        writer.write(&[0x05, 0x00]).map_err(Into::into)
60    }
61
62    fn write_der_content(&self, _writer: &mut dyn std::io::Write) -> SerializeResult<usize> {
63        Ok(0)
64    }
65}
66
67impl<'a> TryFrom<Any<'a>> for () {
68    type Error = Error;
69
70    fn try_from(any: Any<'a>) -> Result<()> {
71        any.tag().assert_eq(Self::TAG)?;
72        any.header.assert_primitive()?;
73        if !any.header.length.is_null() {
74            return Err(Error::InvalidLength);
75        }
76        Ok(())
77    }
78}
79
80impl CheckDerConstraints for () {
81    fn check_constraints(_any: &Any) -> Result<()> {
82        Ok(())
83    }
84}
85
86impl DerAutoDerive for () {}
87
88impl Tagged for () {
89    const TAG: Tag = Tag::Null;
90}
91
92#[cfg(feature = "std")]
93impl ToDer for () {
94    fn to_der_len(&self) -> Result<usize> {
95        Ok(2)
96    }
97
98    fn write_der_header(&self, writer: &mut dyn std::io::Write) -> SerializeResult<usize> {
99        writer.write(&[0x05, 0x00]).map_err(Into::into)
100    }
101
102    fn write_der_content(&self, _writer: &mut dyn std::io::Write) -> SerializeResult<usize> {
103        Ok(0)
104    }
105}