#[macro_export]
macro_rules! lol_paste_impl {
($x:ident, $y: expr, $f:expr, $args: expr) => {{
paste::paste! {
let [<$x $y>] = {
crate::lol::errors::Trace::stack_push(&crate::func_name!(std::stringify!($f)), $args);
let strs = crate::lol::errors::Trace::stack();
let mut trace = crate::lol::errors::Trace::new();
trace.0.push(strs);
trace
};
[<$x $y>]
}
}}
}
#[macro_export]
macro_rules! func_name {
($args: expr) => {{
let location = std::panic::Location::caller();
let func_name = {
fn type_name_of<T>(_: T) -> &'static str {
std::stringify!($args)
}
let name = type_name_of($args);
&name[..name.len()]
};
format!("FUNC_NAME:({}) IT IN THE (file:{}line:{}) ", func_name, location.file(), location.line())
}};
}
#[macro_export]
macro_rules! lol_paste{
($f: tt,$($args:expr),*) => {{
let arg = format!("{}", std::stringify!($($args),*));
let arg = &arg[..];
let arga = [format!("{}", arg)];
let location = std::panic::Location::caller();
let _line = location.line();
crate::lol_paste_impl!(traces, _line, std::stringify!($f), &arga)
}}
}
#[macro_export]
macro_rules! lol_trace_func {
($f: tt,$($args:expr),*) => {{
let trace = crate::lol_paste!($f, $($args),*);
trace
}};
}
#[macro_export]
macro_rules! lol_trace_var {
(($args:expr),*) => {
format!("{} = {}", std::stringify!($args), format!("{}",$args))
};
}
#[macro_export]
macro_rules! lol_throw_msg {
($($fstr:expr),*) => {{
let fstr = format!($($fstr),*);
crate::lol::errors::Trace::raise(&fstr)
}};
}
#[macro_export]
macro_rules! lol_throw_if_msg {
($cond:expr, $trace: expr) => {{
let can = $cond;
while(can) {
let ftrs = crate::lol_throw_msg!("{} {} {}", can, stringify!($cond), $trace);;
}
}};
}
#[macro_export]
macro_rules! lol_throw_if {
($cond:expr, $trace: expr) => {{
let can = $cond;
while(can) {
crate::lol_throw_msg!("{} {} {}", can, stringify!($cond), $trace);
}
}};
}