use super::{IssueCategory, IssueSeverity};
use alloc::{format, string::String};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ParseIssue {
pub severity: IssueSeverity,
pub category: IssueCategory,
pub message: String,
pub line: usize,
pub column: Option<usize>,
pub span: Option<(usize, usize)>,
pub suggestion: Option<String>,
}
impl ParseIssue {
#[must_use]
pub const fn new(
severity: IssueSeverity,
category: IssueCategory,
message: String,
line: usize,
) -> Self {
Self {
severity,
category,
message,
line,
column: None,
span: None,
suggestion: None,
}
}
#[must_use]
pub const fn with_location(
severity: IssueSeverity,
category: IssueCategory,
message: String,
line: usize,
column: usize,
span: (usize, usize),
) -> Self {
Self {
severity,
category,
message,
line,
column: Some(column),
span: Some(span),
suggestion: None,
}
}
#[must_use]
pub fn with_suggestion(mut self, suggestion: String) -> Self {
self.suggestion = Some(suggestion);
self
}
#[must_use]
pub const fn info(category: IssueCategory, message: String, line: usize) -> Self {
Self::new(IssueSeverity::Info, category, message, line)
}
#[must_use]
pub const fn warning(category: IssueCategory, message: String, line: usize) -> Self {
Self::new(IssueSeverity::Warning, category, message, line)
}
#[must_use]
pub const fn error(category: IssueCategory, message: String, line: usize) -> Self {
Self::new(IssueSeverity::Error, category, message, line)
}
#[must_use]
pub const fn critical(category: IssueCategory, message: String, line: usize) -> Self {
Self::new(IssueSeverity::Critical, category, message, line)
}
#[must_use]
pub fn format_for_display(&self) -> String {
let location = self.column.map_or_else(
|| format!("{}", self.line),
|column| format!("{}:{}", self.line, column),
);
let mut result = format!(
"[{}:{}] {}: {}",
location, self.category, self.severity, self.message
);
if let Some(suggestion) = &self.suggestion {
result.push_str("\n Suggestion: ");
result.push_str(suggestion);
}
result
}
#[must_use]
pub const fn is_blocking(&self) -> bool {
matches!(self.severity, IssueSeverity::Critical)
}
}