use super::level::IssueLevel;
use alloc::{format, string::String};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TokenIssue<'a> {
pub level: IssueLevel,
pub message: String,
pub span: &'a str,
pub line: usize,
pub column: usize,
}
impl<'a> TokenIssue<'a> {
#[must_use]
pub const fn new(
level: IssueLevel,
message: String,
span: &'a str,
line: usize,
column: usize,
) -> Self {
Self {
level,
message,
span,
line,
column,
}
}
#[must_use]
pub const fn warning(message: String, span: &'a str, line: usize, column: usize) -> Self {
Self::new(IssueLevel::Warning, message, span, line, column)
}
#[must_use]
pub const fn error(message: String, span: &'a str, line: usize, column: usize) -> Self {
Self::new(IssueLevel::Error, message, span, line, column)
}
#[must_use]
pub const fn critical(message: String, span: &'a str, line: usize, column: usize) -> Self {
Self::new(IssueLevel::Critical, message, span, line, column)
}
#[must_use]
pub const fn is_error(&self) -> bool {
self.level.is_error()
}
#[must_use]
pub fn location_string(&self) -> String {
format!("{}:{}", self.line, self.column)
}
#[must_use]
pub fn format_issue(&self) -> String {
format!(
"{}: {} at {}:{}",
self.level.as_str(),
self.message,
self.line,
self.column
)
}
}