#[doc(hidden)]
#[must_use]
pub fn func_name_from_item_type_name(
module_path: &'static str,
subitem: &'static str,
) -> &'static str {
let name = str::strip_suffix(subitem, "::Item").unwrap_or(subitem);
let name = str::strip_suffix(name, "::{{closure}}").unwrap_or(name);
let name = str::strip_prefix(name, module_path).unwrap_or(name);
let name = str::strip_prefix(name, "::").unwrap_or(name);
name
}
#[macro_export]
macro_rules! func_name {
() => {{
struct Item;
let module_path = ::core::module_path!();
let item_type_name = ::core::any::type_name::<Item>();
$crate::func_name_from_item_type_name(module_path, item_type_name)
}};
}
#[cfg(test)]
mod tests {
#[test]
fn test_func_name() {
fn foo() -> &'static str {
func_name!()
}
fn bar() -> &'static str {
func_name!()
}
fn baz() -> &'static str {
func_name!()
}
assert!(foo().contains("foo"));
assert!(bar().contains("bar"));
assert!(baz().contains("baz"));
}
}