use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum CapabilityError {
InvalidId {
id: String,
reason: String,
},
InvalidConfig {
id: String,
reason: String,
},
InvalidDefinition {
id: String,
reason: String,
},
Duplicate {
id: String,
},
}
impl CapabilityError {
pub fn id(&self) -> &str {
match self {
Self::InvalidId { id, .. }
| Self::InvalidConfig { id, .. }
| Self::InvalidDefinition { id, .. }
| Self::Duplicate { id } => id,
}
}
pub fn reason(&self) -> String {
match self {
Self::InvalidId { reason, .. }
| Self::InvalidConfig { reason, .. }
| Self::InvalidDefinition { reason, .. } => reason.clone(),
Self::Duplicate { id } => format!("duplicate capability id {id:?}"),
}
}
pub fn is_duplicate(&self) -> bool {
matches!(self, Self::Duplicate { .. })
}
}
impl fmt::Display for CapabilityError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::InvalidId { id, reason } => {
write!(f, "invalid capability id {id:?}: {reason}")
}
Self::InvalidConfig { id, reason } => {
write!(f, "invalid capability config for {id:?}: {reason}")
}
Self::InvalidDefinition { id, reason } => {
write!(f, "invalid capability definition {id:?}: {reason}")
}
Self::Duplicate { id } => write!(f, "duplicate capability id {id:?}"),
}
}
}
impl std::error::Error for CapabilityError {}