use leo_errors::{ConstEvalError, Result};
use leo_span::Span;
#[macro_export]
macro_rules! tc_fail2 {
() => {
panic!("type checker failure")
};
}
#[macro_export]
macro_rules! halt_no_span2 {
($($x:tt)*) => {
return Err(ConstEvalError::new(format!($($x)*)).into())
}
}
#[macro_export]
macro_rules! halt2 {
($span: expr) => {
return Err(ConstEvalError::new_spanned(String::new(), $span).into())
};
($span: expr, $($x:tt)*) => {
return Err(ConstEvalError::new_spanned(format!($($x)*), $span).into())
};
}
#[macro_export]
macro_rules! fail2 {
($span: expr) => {
ConstEvalError::new_spanned(String::new(), $span).into()
};
($span: expr, $($x:tt)*) => {
ConstEvalError::new_spanned(format!($($x)*), $span).into()
};
}
pub trait ExpectTc {
type T;
fn expect_tc(self, span: Span) -> Result<Self::T>;
}
impl<T> ExpectTc for Option<T> {
type T = T;
fn expect_tc(self, span: Span) -> Result<Self::T> {
match self {
Some(t) => Ok(t),
None => Err(ConstEvalError::new_spanned("type failure".into(), span).into()),
}
}
}
impl<T, U: std::fmt::Debug> ExpectTc for Result<T, U> {
type T = T;
fn expect_tc(self, span: Span) -> Result<Self::T> {
self.map_err(|_e| ConstEvalError::new_spanned("type failure".into(), span).into())
}
}