#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Severity {
Error,
Warning,
Note,
}
impl Severity {
pub fn as_str(self) -> &'static str {
match self {
Severity::Error => "error",
Severity::Warning => "warning",
Severity::Note => "note",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Finding {
pub severity: Severity,
pub check: &'static str,
pub entity: String,
pub message: String,
pub remedy: Option<String>,
}
impl Finding {
pub fn error(
check: &'static str,
entity: impl Into<String>,
message: impl Into<String>,
) -> Self {
Self {
severity: Severity::Error,
check,
entity: entity.into(),
message: message.into(),
remedy: None,
}
}
pub fn warning(
check: &'static str,
entity: impl Into<String>,
message: impl Into<String>,
) -> Self {
Self {
severity: Severity::Warning,
check,
entity: entity.into(),
message: message.into(),
remedy: None,
}
}
pub fn note(
check: &'static str,
entity: impl Into<String>,
message: impl Into<String>,
) -> Self {
Self {
severity: Severity::Note,
check,
entity: entity.into(),
message: message.into(),
remedy: None,
}
}
pub fn with_remedy(mut self, remedy: impl Into<String>) -> Self {
self.remedy = Some(remedy.into());
self
}
pub fn is_error(&self) -> bool {
self.severity == Severity::Error
}
pub fn is_warning(&self) -> bool {
self.severity == Severity::Warning
}
}
impl std::fmt::Display for Finding {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{}: [{}] {}: {}",
self.severity.as_str(),
self.check,
self.entity,
self.message
)?;
if let Some(remedy) = &self.remedy {
write!(f, "\n fix: {remedy}")?;
}
Ok(())
}
}