use super::{ErrorCode, SourceLocation};
mod formatting;
mod kinds;
mod source_context;
mod suggestions;
mod tokens;
#[cfg(test)]
mod tests;
pub use formatting::{format_error_message, matching_close, rule_to_friendly_name};
pub use kinds::{
ErrorSeverity, IdentifierContext, MissingComponentKind, NumberError, ParseErrorKind,
StringDelimiter,
};
pub use source_context::{Highlight, HighlightStyle, SourceContext, SourceLine};
pub use suggestions::{RelatedInfo, Suggestion, SuggestionConfidence, TextEdit};
pub use tokens::{ExpectedToken, TokenCategory, TokenInfo, TokenKind};
#[derive(Debug, Clone)]
pub struct StructuredParseError {
pub kind: ParseErrorKind,
pub location: SourceLocation,
pub span_end: Option<(usize, usize)>,
pub source_context: SourceContext,
pub suggestions: Vec<Suggestion>,
pub related: Vec<RelatedInfo>,
pub severity: ErrorSeverity,
pub code: ErrorCode,
}
impl StructuredParseError {
pub fn new(kind: ParseErrorKind, location: SourceLocation) -> Self {
Self {
kind,
location,
span_end: None,
source_context: SourceContext::default(),
suggestions: Vec::new(),
related: Vec::new(),
severity: ErrorSeverity::Error,
code: ErrorCode::E0001,
}
}
pub fn with_span_end(mut self, line: usize, col: usize) -> Self {
self.span_end = Some((line, col));
self
}
pub fn with_source_context(mut self, ctx: SourceContext) -> Self {
self.source_context = ctx;
self
}
pub fn with_suggestion(mut self, suggestion: Suggestion) -> Self {
self.suggestions.push(suggestion);
self
}
pub fn with_suggestions(mut self, suggestions: impl IntoIterator<Item = Suggestion>) -> Self {
self.suggestions.extend(suggestions);
self
}
pub fn with_related(mut self, info: RelatedInfo) -> Self {
self.related.push(info);
self
}
pub fn with_severity(mut self, severity: ErrorSeverity) -> Self {
self.severity = severity;
self
}
pub fn with_code(mut self, code: ErrorCode) -> Self {
self.code = code;
self
}
}
impl std::fmt::Display for StructuredParseError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", format_error_message(&self.kind))
}
}
impl std::error::Error for StructuredParseError {}