Skip to main content

efivar_fix/efi/
variable_vendor.rs

1use std::fmt;
2
3use super::EFI_GUID;
4
5#[derive(Copy, Clone, Eq)]
6/// An EFI variable vendor identifier
7pub enum VariableVendor {
8    /// Standard EFI variables
9    Efi,
10    /// Other EFI vendors
11    Custom(uuid::Uuid),
12}
13
14impl VariableVendor {
15    /// Return true if this vendor is the EFI vendor
16    pub fn is_efi(&self) -> bool {
17        matches!(self, VariableVendor::Efi)
18    }
19}
20
21impl PartialEq for VariableVendor {
22    fn eq(&self, other: &Self) -> bool {
23        match self {
24            VariableVendor::Efi => match other {
25                VariableVendor::Efi => true,
26                VariableVendor::Custom(uuid) => *uuid == *EFI_GUID,
27            },
28            VariableVendor::Custom(uuid) => match other {
29                VariableVendor::Efi => *uuid == *EFI_GUID,
30                VariableVendor::Custom(other_uuid) => *other_uuid == *uuid,
31            },
32        }
33    }
34}
35
36impl From<uuid::Uuid> for VariableVendor {
37    fn from(other: uuid::Uuid) -> Self {
38        if other == *EFI_GUID {
39            VariableVendor::Efi
40        } else {
41            VariableVendor::Custom(other)
42        }
43    }
44}
45
46impl AsRef<uuid::Uuid> for VariableVendor {
47    fn as_ref(&self) -> &uuid::Uuid {
48        match self {
49            VariableVendor::Efi => &EFI_GUID,
50            VariableVendor::Custom(uuid) => uuid,
51        }
52    }
53}
54
55impl fmt::Debug for VariableVendor {
56    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
57        fmt::Debug::fmt(self.as_ref(), f)
58    }
59}
60
61impl fmt::Display for VariableVendor {
62    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
63        fmt::Display::fmt(self.as_ref(), f)
64    }
65}
66
67#[cfg(test)]
68mod tests {
69    use std::str::FromStr;
70
71    use uuid::Uuid;
72
73    use crate::efi::{variable_vendor::VariableVendor, EFI_GUID};
74
75    #[test]
76    fn variable_vendor_eq() {
77        assert_eq!(VariableVendor::Efi, VariableVendor::Efi);
78
79        // idk what the right behaviour would be here
80        assert_eq!(VariableVendor::Efi, VariableVendor::Custom(*EFI_GUID));
81        assert_eq!(VariableVendor::Custom(*EFI_GUID), VariableVendor::Efi);
82
83        assert_eq!(
84            VariableVendor::Custom(Uuid::from_str("9acae909-5f29-43c8-b925-30040693bdff").unwrap()),
85            VariableVendor::Custom(Uuid::from_str("9acae909-5f29-43c8-b925-30040693bdff").unwrap())
86        );
87
88        assert_ne!(
89            VariableVendor::Custom(Uuid::from_str("9acae909-5f29-43c8-b925-30040693bdff").unwrap()),
90            VariableVendor::Custom(Uuid::from_str("d3464728-c118-4d88-a450-7ac21a85a099").unwrap())
91        );
92
93        assert_ne!(
94            VariableVendor::Efi,
95            VariableVendor::Custom(Uuid::from_str("d3464728-c118-4d88-a450-7ac21a85a099").unwrap())
96        );
97    }
98}