use core::fmt;
pub const CLASS_UNIVERSAL: u8 = 0b00000000;
pub const CLASS_APPLICATION: u8 = 0b01000000;
pub const CLASS_CONTEXT_SPECIFIC: u8 = 0b10000000;
pub const CLASS_PRIVATE: u8 = 0b11000000;
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
#[repr(u8)]
pub enum Class {
Universal = CLASS_UNIVERSAL,
Application = CLASS_APPLICATION,
ContextSpecific = CLASS_CONTEXT_SPECIFIC,
Private = CLASS_PRIVATE,
}
impl fmt::Display for Class {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(match self {
Class::Universal => "UNIVERSAL",
Class::Application => "APPLICATION",
Class::ContextSpecific => "CONTEXT-SPECIFIC",
Class::Private => "PRIVATE",
})
}
}
impl Class {
#[must_use]
pub const fn bits(&self) -> u8 {
*self as u8
}
#[must_use]
pub const fn from_bits(bits: u8) -> Self {
match (bits >> 6) & 0b11 {
0b00 => Class::Universal,
0b01 => Class::Application,
0b10 => Class::ContextSpecific,
0b11 => Class::Private,
_ => unreachable!(),
}
}
}
impl From<u8> for Class {
fn from(value: u8) -> Self {
Class::from_bits(value)
}
}