Skip to main content

mago_analyzer/
error.rs

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