Skip to main content

mago_analyzer/
error.rs

1use mago_span::Span;
2
3use crate::plugin::PluginError;
4
5#[derive(Debug, Clone, Eq, PartialEq, Hash, PartialOrd, Ord)]
6pub enum AnalysisError {
7    Plugin(PluginError),
8    UserError(String),
9    InternalError(String, Span),
10}
11
12impl std::fmt::Display for AnalysisError {
13    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14        match self {
15            AnalysisError::Plugin(err) => write!(f, "Plugin Error: {err}"),
16            AnalysisError::UserError(message) => write!(f, "User Error: {message}"),
17            AnalysisError::InternalError(message, span) => {
18                write!(f, "Internal Error: {} at {}-{}:{}", message, span.file_id, span.start.offset, span.end.offset)
19            }
20        }
21    }
22}
23
24impl std::error::Error for AnalysisError {
25    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
26        match self {
27            AnalysisError::Plugin(err) => Some(err),
28            _ => None,
29        }
30    }
31}
32
33impl From<PluginError> for AnalysisError {
34    fn from(err: PluginError) -> Self {
35        AnalysisError::Plugin(err)
36    }
37}