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}