1use crate::LeoMessageCode;
19
20mod ast;
22pub use self::ast::*;
23
24mod cli;
26pub use self::cli::*;
27
28mod compiler;
30pub use self::compiler::*;
31
32mod flattener;
34pub use self::flattener::*;
35
36mod loop_unroller;
38pub use self::loop_unroller::*;
39
40mod interpreter_halt;
41pub use self::interpreter_halt::*;
42
43mod package;
45pub use self::package::*;
46
47mod parser;
49pub use self::parser::*;
50
51mod static_analyzer;
53pub use self::static_analyzer::*;
54
55mod type_checker;
57pub use self::type_checker::*;
58
59mod name_validation;
61pub use self::name_validation::*;
62
63mod utils;
65pub use self::utils::*;
66
67#[derive(Debug, Error)]
70pub enum LeoError {
71 #[error(transparent)]
73 AstError(#[from] AstError),
74 #[error(transparent)]
76 CliError(#[from] CliError),
77 #[error(transparent)]
79 CompilerError(#[from] CompilerError),
80 #[error(transparent)]
81 InterpreterHalt(#[from] InterpreterHalt),
82 #[error(transparent)]
84 PackageError(#[from] PackageError),
85 #[error(transparent)]
87 ParserError(#[from] ParserError),
88 #[error(transparent)]
90 StaticAnalyzerError(#[from] StaticAnalyzerError),
91 #[error(transparent)]
93 TypeCheckerError(#[from] TypeCheckerError),
94 #[error(transparent)]
96 NameValidationError(#[from] NameValidationError),
97 #[error(transparent)]
99 LoopUnrollerError(#[from] LoopUnrollerError),
100 #[error(transparent)]
102 FlattenError(#[from] FlattenError),
103 #[error("")]
106 LastErrorCode(i32),
107 #[error(transparent)]
109 UtilError(#[from] UtilError),
110 #[error(transparent)]
112 Anyhow(#[from] anyhow::Error),
113}
114
115impl LeoError {
116 pub fn error_code(&self) -> String {
118 use LeoError::*;
119
120 match self {
121 AstError(error) => error.error_code(),
122 CompilerError(error) => error.error_code(),
123 CliError(error) => error.error_code(),
124 ParserError(error) => error.error_code(),
125 PackageError(error) => error.error_code(),
126 StaticAnalyzerError(error) => error.error_code(),
127 TypeCheckerError(error) => error.error_code(),
128 NameValidationError(error) => error.error_code(),
129 LoopUnrollerError(error) => error.error_code(),
130 FlattenError(error) => error.error_code(),
131 UtilError(error) => error.error_code(),
132 LastErrorCode(_) => unreachable!(),
133 Anyhow(_) => "SnarkVM Error".to_string(), InterpreterHalt(_) => "Interpreter Halt".to_string(),
135 }
136 }
137
138 pub fn exit_code(&self) -> i32 {
140 use LeoError::*;
141
142 match self {
143 AstError(error) => error.exit_code(),
144 CompilerError(error) => error.exit_code(),
145 CliError(error) => error.exit_code(),
146 ParserError(error) => error.exit_code(),
147 PackageError(error) => error.exit_code(),
148 StaticAnalyzerError(error) => error.exit_code(),
149 TypeCheckerError(error) => error.exit_code(),
150 NameValidationError(error) => error.exit_code(),
151 LoopUnrollerError(error) => error.exit_code(),
152 FlattenError(error) => error.exit_code(),
153 UtilError(error) => error.exit_code(),
154 LastErrorCode(code) => *code,
155 Anyhow(_) => 11000, InterpreterHalt(_) => 1,
157 }
158 }
159}
160
161#[derive(Debug, Error, Hash, PartialEq, Eq)]
164pub enum LeoWarning {
165 #[error(transparent)]
167 ParserWarning(#[from] ParserWarning),
168 #[error(transparent)]
170 StaticAnalyzerWarning(#[from] StaticAnalyzerWarning),
171 #[error(transparent)]
173 TypeCheckerWarning(#[from] TypeCheckerWarning),
174}
175
176impl LeoWarning {
177 pub fn error_code(&self) -> String {
179 use LeoWarning::*;
180
181 match self {
182 ParserWarning(warning) => warning.warning_code(),
183 TypeCheckerWarning(warning) => warning.warning_code(),
184 StaticAnalyzerWarning(warning) => warning.warning_code(),
185 }
186 }
187}
188
189pub type Result<T, E = LeoError> = core::result::Result<T, E>;