haloumi_lowering/error.rs
1//! Error type.
2
3use std::sync::Arc;
4
5use thiserror::Error;
6
7/// Lowering error type.
8#[derive(Error, Debug)]
9pub enum Error {
10 /// Happens when [`Lowering::checked_generate_constraint`](crate::Lowering::checked_generate_constraint) fails
11 /// because the constraint was not generated.
12 #[error("Last constraint was not generated!")]
13 LastConstraintNotGenerated,
14 /// Error emitted by implementations of [`LowerableStmt`](crate::lowerable::LowerableStmt) or
15 /// [`LowerableExpr`](crate::lowerable::LowerableExpr).
16 ///
17 /// Use [`lowering_err!`] to easily create this kind of error.
18 #[error("Lowering error")]
19 Lowering(Arc<dyn std::error::Error>),
20 /// Error emitted by implementations of [`Lowering`](crate::Lowering) or
21 /// [`ExprLowering`](crate::ExprLowering).
22 ///
23 /// Use [`backend_err!`] to easily create this kind of error.
24 #[error("Backend error")]
25 Backend(Arc<dyn std::error::Error>),
26}
27
28unsafe impl Send for Error {}
29unsafe impl Sync for Error {}
30
31/// Convenience macro for creating [`Error::Lowering`] type of errors.
32#[macro_export]
33macro_rules! lowering_err {
34 ($err:expr) => {
35 $crate::error::Error::Lowering(std::sync::Arc::new($err))
36 };
37}
38
39/// Convenience macro for creating [`Error::Backend`] type of errors.
40#[macro_export]
41macro_rules! backend_err {
42 ($err:expr) => {
43 $crate::error::Error::Backend(std::sync::Arc::new($err))
44 };
45}
46
47/// Convenience macro for creating [`Error::Backend`] type of errors and immediately returning.
48#[macro_export]
49macro_rules! bail_backend {
50 ($err:expr) => {{
51 return Err($crate::error::Error::Backend(std::sync::Arc::new($err)));
52 }};
53}