#[cfg(not(debug_assertions))]
#[macro_export]
macro_rules! develop_debug {
($($args:tt)*) => {};
}
thread_local! {
pub static DEVELOP_DEBUG_OUTPUT_STATE: std::cell::RefCell<bool> = std::cell::RefCell::new(false);
}
pub fn debug(output: bool) {
DEVELOP_DEBUG_OUTPUT_STATE.with(|state| *state.borrow_mut() = output);
}
pub fn enable_develop_debug_output() -> bool {
DEVELOP_DEBUG_OUTPUT_STATE.with(|state| *state.borrow())
}
#[cfg(debug_assertions)]
#[macro_export]
macro_rules! develop_debug {
(output method)=>{
fn enable_develop_debug_output() -> bool { true }
};
(output global true)=>{
debug(true);
};
(output global false)=>{
debug(false);
};
(title $(,)? $fmt:literal $(,)? $($msg:expr),*) => {
if enable_develop_debug_output() {
println!();
print!("❲ {}:{} ❳",file!(),line!());
print!(" 🍀 ");
println!($fmt,$($msg),*);
}
};
(step $(,)? $fmt:literal $(,)? $($msg:expr),*) => {
if enable_develop_debug_output() {
println!();
print!("❲ {}:{} ❳",file!(),line!());
print!(" 🦀 ");
println!($fmt,$($msg),*);
}
};
(vars $(,)? $($arg:expr),*)=>{
if enable_develop_debug_output() {
println!();
$(
let prefix = format!("❲ {}:{} ❳ 🔹 ‹ {:<10} › = ",file!(),line!(),stringify!($arg));
let spaces = " ".repeat(prefix.chars().count());
let value = format!("{:#?}",&$arg);
let lines = value.lines().into_iter().map(|s| s).collect::<Vec<&str>>();
let lines = lines.as_slice();
if lines.len()==1{
for s in lines{
println!("{}{}",prefix,s);
}
}else{
if let [first,body @ ..,last] = lines{
println!("{}{}",prefix,first);
for s in body {
println!("{} ›{}",spaces,s);
}
println!("{} {}",spaces,last);
}
}
)*
}
};
(done $(,)? $fmt:literal $(,)? $($msg:expr),*) => {
if enable_develop_debug_output() {
println!();
print!("❲ {}:{} ❳",file!(),line!());
print!(" 🌱 done. ");
println!($fmt,$($msg),*);
println!();
}
};
(error $(,)? $fmt:literal $(,)? $($msg:expr),*) => {
if enable_develop_debug_output() {
println!();
print!("❲ {}:{} ❳",file!(),line!());
print!(" 💥 error. ");
println!($fmt,$($msg),*);
println!();
}
};
($($args:tt)*) => {
if enable_develop_debug_output() {
println!();
print!("❲ {}:{} ❳",file!(),line!());
print!(" 🐰 ");
println!($($args)*);
println!();
}
};
}
pub use develop_debug as dd________;
#[macro_export]
macro_rules! dd____show {
() => {
develop_debug!(output method);
};
(global) => {
develop_debug!(output global true);
};
}
#[macro_export]
macro_rules! dd____hide {
(global) => {
develop_debug!(output global false);
};
}
#[macro_export]
macro_rules! dd____done {
() => {
develop_debug!(done "");
};
($fmt:literal $(,)? $($msg:expr),*) => {
develop_debug!(done $fmt $($msg),*);
};
}
#[macro_export]
macro_rules! dd___error {
() => {
develop_debug!(error "");
};
($fmt:literal $(,)? $($msg:expr),*) => {
develop_debug!(error $fmt $($msg),*);
};
}
#[macro_export]
macro_rules! dd____vars {
($($arg:expr),*) => {
develop_debug!(vars $($arg),*);
};
}
#[macro_export]
macro_rules! dd____step {
($fmt:literal $(,)? $($msg:expr),*) => {
develop_debug!(step $fmt $($msg),*);
};
}
#[macro_export]
macro_rules! dd___title {
($fmt:literal $(,)? $($msg:expr),*) => {
develop_debug!(title $fmt $($msg),*);
};
}