use core::fmt::{Display, Formatter};
#[derive(Debug, Copy, Clone, PartialOrd, PartialEq, Eq, Ord)]
pub enum BootPolicyError {
InvalidInteger(u8),
}
impl Display for BootPolicyError {
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
let s = match self {
Self::InvalidInteger(_) => {
"Only `0` and `1` are valid integers, all other values are undefined."
}
};
f.write_str(s)
}
}
#[cfg(feature = "unstable")]
impl core::error::Error for BootPolicyError {}
#[derive(Copy, Clone, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
pub enum BootPolicy {
BootSelection,
#[default]
ExactMatch,
}
impl From<BootPolicy> for bool {
fn from(value: BootPolicy) -> Self {
match value {
BootPolicy::BootSelection => true,
BootPolicy::ExactMatch => false,
}
}
}
impl From<bool> for BootPolicy {
fn from(value: bool) -> Self {
match value {
true => Self::BootSelection,
false => Self::ExactMatch,
}
}
}
impl From<BootPolicy> for u8 {
fn from(value: BootPolicy) -> Self {
match value {
BootPolicy::BootSelection => 1,
BootPolicy::ExactMatch => 0,
}
}
}
impl TryFrom<u8> for BootPolicy {
type Error = BootPolicyError;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::ExactMatch),
1 => Ok(Self::BootSelection),
err => Err(Self::Error::InvalidInteger(err)),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn boot_policy() {
assert_eq!(bool::from(BootPolicy::ExactMatch), false);
assert_eq!(bool::from(BootPolicy::BootSelection), true);
assert_eq!(BootPolicy::from(false), BootPolicy::ExactMatch);
assert_eq!(BootPolicy::from(true), BootPolicy::BootSelection);
assert_eq!(u8::from(BootPolicy::ExactMatch), 0);
assert_eq!(u8::from(BootPolicy::BootSelection), 1);
assert_eq!(BootPolicy::try_from(0), Ok(BootPolicy::ExactMatch));
assert_eq!(BootPolicy::try_from(1), Ok(BootPolicy::BootSelection));
assert_eq!(
BootPolicy::try_from(2),
Err(BootPolicyError::InvalidInteger(2))
);
}
}