Skip to main content

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}