use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "kebab-case")]
pub enum DiagnosticCategory {
Parse,
MissingStdlib,
UnsupportedLowering,
TypeConstraint,
UnresolvedReference,
Internal,
}
impl DiagnosticCategory {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Parse => "parse",
Self::MissingStdlib => "missing-stdlib",
Self::UnsupportedLowering => "unsupported-lowering",
Self::TypeConstraint => "type-constraint",
Self::UnresolvedReference => "unresolved-reference",
Self::Internal => "internal",
}
}
#[must_use]
pub const fn label(self) -> &'static str {
match self {
Self::Parse => "parse error",
Self::MissingStdlib => "missing stdlib",
Self::UnsupportedLowering => "non-working Rust (unlowered)",
Self::TypeConstraint => "typed-subset violation",
Self::UnresolvedReference => "unresolved reference",
Self::Internal => "internal",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn as_str_is_stable_kebab_case() {
assert_eq!(DiagnosticCategory::MissingStdlib.as_str(), "missing-stdlib");
assert_eq!(
DiagnosticCategory::UnsupportedLowering.as_str(),
"unsupported-lowering"
);
assert_eq!(DiagnosticCategory::Parse.as_str(), "parse");
}
#[test]
fn serde_matches_as_str() -> Result<(), serde_json::Error> {
let json = serde_json::to_string(&DiagnosticCategory::TypeConstraint)?;
assert_eq!(json, "\"type-constraint\"");
let back: DiagnosticCategory = serde_json::from_str(&json)?;
assert_eq!(back, DiagnosticCategory::TypeConstraint);
Ok(())
}
}