1 //! Class of an ASN.1 tag.
2 
3 use super::{TagNumber, CONSTRUCTED_FLAG};
4 use core::fmt;
5 
6 /// Class of an ASN.1 tag.
7 #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
8 #[repr(u8)]
9 pub enum Class {
10     /// `UNIVERSAL`: built-in types whose meaning is the same in all
11     /// applications.
12     Universal = 0b00000000,
13 
14     /// `APPLICATION`: types whose meaning is specific to an application,
15     ///
16     /// Types in two different applications may have the same
17     /// application-specific tag and different meanings.
18     Application = 0b01000000,
19 
20     /// `CONTEXT-SPECIFIC`: types whose meaning is specific to a given
21     /// structured type.
22     ///
23     /// Context-specific tags are used to distinguish between component types
24     /// with the same underlying tag within the context of a given structured
25     /// type, and component types in two different structured types may have
26     /// the same tag and different meanings.
27     ContextSpecific = 0b10000000,
28 
29     /// `PRIVATE`: types whose meaning is specific to a given enterprise.
30     Private = 0b11000000,
31 }
32 
33 impl Class {
34     /// Compute the identifier octet for a tag number of this class.
35     #[allow(clippy::integer_arithmetic)]
octet(self, constructed: bool, number: TagNumber) -> u836     pub(super) fn octet(self, constructed: bool, number: TagNumber) -> u8 {
37         self as u8 | number.value() | (u8::from(constructed) * CONSTRUCTED_FLAG)
38     }
39 }
40 
41 impl fmt::Display for Class {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result42     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43         f.write_str(match self {
44             Class::Universal => "UNIVERSAL",
45             Class::Application => "APPLICATION",
46             Class::ContextSpecific => "CONTEXT-SPECIFIC",
47             Class::Private => "PRIVATE",
48         })
49     }
50 }
51