checkleft 0.1.0-alpha.8

Experimental repository convention checker; API and behavior may change without notice
Documentation
use std::path::PathBuf;

use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct CheckResult {
    pub check_id: String,
    pub findings: Vec<Finding>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Finding {
    pub severity: Severity,
    pub message: String,
    pub location: Option<Location>,
    pub remediation: Option<String>,
    pub suggested_fix: Option<SuggestedFix>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Severity {
    Error,
    Warning,
    Info,
}

impl Severity {
    pub fn parse_with_default(raw: Option<&str>, default: Self) -> Self {
        match raw.unwrap_or("").to_ascii_lowercase().as_str() {
            "error" => Self::Error,
            "warning" => Self::Warning,
            "info" => Self::Info,
            _ => default,
        }
    }
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Location {
    pub path: PathBuf,
    pub line: Option<u32>,
    pub column: Option<u32>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SuggestedFix {
    pub description: String,
    pub edits: Vec<FileEdit>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FileEdit {
    pub path: PathBuf,
    pub old_text: String,
    pub new_text: String,
}

#[cfg(test)]
mod tests {
    use super::Severity;

    #[test]
    fn parse_with_default_respects_known_values() {
        assert_eq!(
            Severity::parse_with_default(Some("error"), Severity::Warning),
            Severity::Error
        );
        assert_eq!(
            Severity::parse_with_default(Some("warning"), Severity::Error),
            Severity::Warning
        );
        assert_eq!(
            Severity::parse_with_default(Some("info"), Severity::Error),
            Severity::Info
        );
    }

    #[test]
    fn parse_with_default_falls_back_for_unknown_or_missing_values() {
        assert_eq!(
            Severity::parse_with_default(Some("unknown"), Severity::Warning),
            Severity::Warning
        );
        assert_eq!(
            Severity::parse_with_default(None, Severity::Error),
            Severity::Error
        );
    }
}