use leo_errors::{InterpreterHalt, Result};
use leo_span::{Span, Symbol};
use snarkvm::prelude::{Identifier, TestnetV0};
#[macro_export]
macro_rules! tc_fail {
() => {
panic!("type checker failure")
};
}
#[macro_export]
macro_rules! halt_no_span {
($($x:tt)*) => {
return Err(InterpreterHalt::new(format!($($x)*)).into())
}
}
#[macro_export]
macro_rules! halt {
($span: expr) => {
return Err(InterpreterHalt::new_spanned(String::new(), $span).into())
};
($span: expr, $($x:tt)*) => {
return Err(InterpreterHalt::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(InterpreterHalt::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| InterpreterHalt::new_spanned("type failure".into(), span).into())
}
}
pub fn snarkvm_identifier_to_symbol(id: &Identifier<TestnetV0>) -> Symbol {
let s = id.to_string();
Symbol::intern(&s)
}