asn1_rs/asn1_types/
enumerated.rs1use crate::ber::bytes_to_u64;
2use crate::*;
3use core::convert::TryFrom;
4
5#[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}