use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum ErrorKind {
NullArg,
InvalidUtf8,
ConfigLoad,
ConfigParse,
BuildFailed,
NotFound,
InvalidArg,
Panic,
}
impl ErrorKind {
#[must_use]
pub const fn label(self) -> &'static str {
match self {
Self::NullArg => "null-arg",
Self::InvalidUtf8 => "invalid-utf8",
Self::ConfigLoad => "config-load",
Self::ConfigParse => "config-parse",
Self::BuildFailed => "build-failed",
Self::NotFound => "not-found",
Self::InvalidArg => "invalid-arg",
Self::Panic => "panic",
}
}
}
#[cfg(test)]
mod tests {
use super::ErrorKind;
#[test]
fn label_is_kebab_case_and_stable() {
assert_eq!(ErrorKind::NullArg.label(), "null-arg");
assert_eq!(ErrorKind::InvalidUtf8.label(), "invalid-utf8");
assert_eq!(ErrorKind::ConfigLoad.label(), "config-load");
assert_eq!(ErrorKind::ConfigParse.label(), "config-parse");
assert_eq!(ErrorKind::BuildFailed.label(), "build-failed");
assert_eq!(ErrorKind::NotFound.label(), "not-found");
assert_eq!(ErrorKind::InvalidArg.label(), "invalid-arg");
assert_eq!(ErrorKind::Panic.label(), "panic");
}
#[test]
fn labels_are_unique() {
let labels = [
ErrorKind::NullArg.label(),
ErrorKind::InvalidUtf8.label(),
ErrorKind::ConfigLoad.label(),
ErrorKind::ConfigParse.label(),
ErrorKind::BuildFailed.label(),
ErrorKind::NotFound.label(),
ErrorKind::InvalidArg.label(),
ErrorKind::Panic.label(),
];
let unique: std::collections::HashSet<_> = labels.iter().collect();
assert_eq!(unique.len(), labels.len());
}
}