#[macro_export]
macro_rules! msg_panic {
($($args:tt)+) => {{
solana_program::msg!("RUNTIME ERROR: {}", format_args!($($args)*));
panic!("RUNTIME ERROR: {}", format_args!($($args)*));
}};
}
#[macro_export]
macro_rules! sum {
($($args:expr),*) => {{
let mut result = 0;
$(
result = result + $args.len();
)*
result
}}
}
#[macro_export]
macro_rules! msg_trace {
($($args:tt)+) => {
let file_name = std::path::Path::new(file!()).file_name().unwrap().to_string_lossy();
let input_sizes = sum!($($args)*);
solana_program::msg!("input sizes {}", input_sizes);
if input_sizes > 512 {
solana_program::msg!("{}", format!("'{}', '{}:{}", format!($($args)*), file_name, line!()).as_str());
} else {
use tulip_arrform::{arrform, ArrForm};
let file_info = arrform!(256, "{}:{}", file_name, line!());
let msg_part = arrform!(512, $($args)*);
solana_program::msg!("'{}', {}", msg_part.as_str(), file_info.as_str());
}
};
}
#[cfg(test)]
mod test {
use super::*;
use solana_program::msg;
#[test]
fn test_trace() {
{
msg_trace!("hello world this is {}", "very big message");
}
{
let mut msg_str = String::new();
for _ in 0..550 {
msg_str.push('a');
}
msg_trace!("{}", msg_str);
}
}
#[test]
#[should_panic(expected = "RUNTIME ERROR: too many keks")]
fn test_msg_panic() {
msg_panic!("too many keks");
}
}