#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum PassKind {
MandatoryDiagnostic,
MandatoryLowering,
Optional,
}
impl PassKind {
#[inline]
#[must_use]
pub const fn is_mandatory(self) -> bool {
matches!(
self,
PassKind::MandatoryDiagnostic | PassKind::MandatoryLowering
)
}
#[inline]
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
PassKind::MandatoryDiagnostic => "mandatory-diagnostic",
PassKind::MandatoryLowering => "mandatory-lowering",
PassKind::Optional => "optional",
}
}
#[must_use]
pub const fn from_str(text: &str) -> Option<Self> {
match text.as_bytes() {
b"mandatory-diagnostic" => Some(PassKind::MandatoryDiagnostic),
b"mandatory-lowering" => Some(PassKind::MandatoryLowering),
b"optional" => Some(PassKind::Optional),
_ => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Fusability {
Fusable,
Barrier,
}
impl Fusability {
#[inline]
#[must_use]
pub const fn is_fusable(self) -> bool {
matches!(self, Fusability::Fusable)
}
#[inline]
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Fusability::Fusable => "fusable",
Fusability::Barrier => "barrier",
}
}
#[must_use]
pub const fn from_str(text: &str) -> Option<Self> {
match text.as_bytes() {
b"fusable" => Some(Fusability::Fusable),
b"barrier" => Some(Fusability::Barrier),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::{Fusability, PassKind};
#[test]
fn both_mandatory_kinds_report_mandatory_and_optional_does_not() {
assert!(PassKind::MandatoryDiagnostic.is_mandatory());
assert!(PassKind::MandatoryLowering.is_mandatory());
assert!(!PassKind::Optional.is_mandatory());
}
#[test]
fn kind_identifiers_are_stable_strings() {
assert_eq!(
PassKind::MandatoryDiagnostic.as_str(),
"mandatory-diagnostic"
);
assert_eq!(PassKind::MandatoryLowering.as_str(), "mandatory-lowering");
assert_eq!(PassKind::Optional.as_str(), "optional");
}
#[test]
fn fusability_identifiers_are_stable_strings() {
assert!(Fusability::Fusable.is_fusable());
assert!(!Fusability::Barrier.is_fusable());
assert_eq!(Fusability::Fusable.as_str(), "fusable");
assert_eq!(Fusability::Barrier.as_str(), "barrier");
}
#[test]
fn identifiers_parse_back_and_nothing_else_does() {
for kind in [
PassKind::MandatoryDiagnostic,
PassKind::MandatoryLowering,
PassKind::Optional,
] {
assert_eq!(PassKind::from_str(kind.as_str()), Some(kind));
}
for fusability in [Fusability::Fusable, Fusability::Barrier] {
assert_eq!(Fusability::from_str(fusability.as_str()), Some(fusability));
}
assert_eq!(PassKind::from_str("Optional"), None);
assert_eq!(PassKind::from_str("mandatory"), None);
assert_eq!(Fusability::from_str("fused"), None);
assert_eq!(Fusability::from_str(""), None);
}
}