1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
use std::fmt;

/// Enum with the different tag classes
/// * Universal: basic common types that are the same in all applications, defined in X.208 (all defined in this library are of this type)
/// * Application: types specific to an application (custom types)
/// * Context: types which depends on context, as sequence fields
/// * Private: types specific to an enterprise
#[derive(Debug, PartialEq, Copy, Clone)]
pub enum TagClass {
    Universal = 0b00,
    Application = 0b01,
    Context = 0b10,
    Private = 0b11
}


impl From<u8> for TagClass {
    fn from(u: u8) -> TagClass {
        match u & 0x03 {
            0b00 => TagClass::Universal,
            0b01 => TagClass::Application,
            0b10 => TagClass::Context,
            0b11 => TagClass::Private,
            _ => unreachable!()
        }
    }
}

impl fmt::Display for TagClass {

    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            TagClass::Universal => {
                write!(f, "universal")
            }
            TagClass::Application => {
                write!(f, "application")
            }
            TagClass::Context => {
                write!(f, "context")
            }
            TagClass::Private => {
                write!(f, "private")
            }
        }
        
    }

}

impl Default for TagClass {
    fn default() -> Self {
        return Self::Universal;
    }
}