// Utility for performing debug printing within a particular module. Still // requires some extra macros to be defined to be ergonomic. macro_rules! enabled_debug_print { (false, $name:literal, $format:literal) => {}; (false, $name:literal, $format:literal, $($args:expr),*) => {}; (true, $name:literal, $format:literal) => { println!("[{}] {}", $name, $format) }; (true, $name:literal, $format:literal, $($args:expr),*) => { println!("[{}] {}", $name, format!($format, $($args),*)) }; } // Utility for inserting code only executed in debug mode. Because writing the // conditional cfg is tedious and looks ugly. Still doesn't work for struct // fields, though. macro_rules! dbg_code { ($code:stmt) => { #[cfg(debug_assertions)] $code } } // Given a function name, return type and variant, will generate the all-so // common `union_value.as_variant()` method. macro_rules! union_cast_method_impl { ($func_name:ident, $ret_type:ty, $variant:path) => { fn $func_name(&self) -> &$ret_type { match self { $variant(content) => return content, _ => unreachable!(), } } } }