#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub enum KernelOptLevel {
#[default]
Release,
Diagnostic,
}
impl KernelOptLevel {
pub fn keep_unreferenced_slots(self) -> bool {
matches!(self, Self::Diagnostic)
}
pub fn parse(s: &str) -> Result<Self, &str> {
match s {
"release" => Ok(Self::Release),
"diagnostic" => Ok(Self::Diagnostic),
_ => Err(s),
}
}
pub fn as_str(self) -> &'static str {
match self {
Self::Release => "release",
Self::Diagnostic => "diagnostic",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_release() {
assert_eq!(KernelOptLevel::default(), KernelOptLevel::Release);
}
#[test]
fn keep_unreferenced_slots_release() {
assert!(!KernelOptLevel::Release.keep_unreferenced_slots());
}
#[test]
fn keep_unreferenced_slots_diagnostic() {
assert!(KernelOptLevel::Diagnostic.keep_unreferenced_slots());
}
#[test]
fn parse_roundtrip() {
for lvl in [KernelOptLevel::Release, KernelOptLevel::Diagnostic] {
assert_eq!(KernelOptLevel::parse(lvl.as_str()), Ok(lvl));
}
}
#[test]
fn parse_unknown_returns_err() {
assert_eq!(KernelOptLevel::parse("none"), Err("none"));
assert_eq!(KernelOptLevel::parse(""), Err(""));
}
}