asn1_rs/asn1_types/
enumerated.rs

1use crate::ber::bytes_to_u64;
2use crate::*;
3use core::convert::TryFrom;
4
5/// ASN.1 `ENUMERATED` type
6///
7/// # Limitations
8///
9/// Supported values are limited to 0 .. 2^32
10#[derive(Debug, PartialEq, Eq)]
11pub struct Enumerated(pub u32);
12
13impl Enumerated {
14    pub const fn new(value: u32) -> Self {
15        Enumerated(value)
16    }
17}
18
19impl<'a> TryFrom<Any<'a>> for Enumerated {
20    type Error = Error;
21
22    fn try_from(any: Any<'a>) -> Result<Enumerated> {
23        TryFrom::try_from(&any)
24    }
25}
26
27impl<'a, 'b> TryFrom<&'b Any<'a>> for Enumerated {
28    type Error = Error;
29
30    fn try_from(any: &'b Any<'a>) -> Result<Enumerated> {
31        any.tag().assert_eq(Self::TAG)?;
32        any.header.assert_primitive()?;
33        let res_u64 = bytes_to_u64(any.data)?;
34        if res_u64 > (<u32>::MAX as u64) {
35            return Err(Error::IntegerTooLarge);
36        }
37        let value = res_u64 as u32;
38        Ok(Enumerated(value))
39    }
40}
41
42impl CheckDerConstraints for Enumerated {
43    fn check_constraints(any: &Any) -> Result<()> {
44        any.header.length.assert_definite()?;
45        Ok(())
46    }
47}
48
49impl DerAutoDerive for Enumerated {}
50
51impl Tagged for Enumerated {
52    const TAG: Tag = Tag::Enumerated;
53}
54
55#[cfg(feature = "std")]
56impl ToDer for Enumerated {
57    fn to_der_len(&self) -> Result<usize> {
58        Integer::from(self.0).to_der_len()
59    }
60
61    fn write_der_header(&self, writer: &mut dyn std::io::Write) -> SerializeResult<usize> {
62        let i = Integer::from(self.0);
63        let len = i.data.len();
64        let header = Header::new(Class::Universal, false, Self::TAG, Length::Definite(len));
65        header.write_der_header(writer).map_err(Into::into)
66    }
67
68    fn write_der_content(&self, writer: &mut dyn std::io::Write) -> SerializeResult<usize> {
69        let int = Integer::from(self.0);
70        int.write_der_content(writer).map_err(Into::into)
71    }
72}