1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#[macro_export]
macro_rules! function_path {
    () => {{
        fn f() {}
        fn t<T>(_: T) -> &'static str {
            std::any::type_name::<T>()
        }
        let n = t(f);
        &n[..n.len() - 3]
    }};
}

#[macro_export]
macro_rules! function_name {
    () => {{
        fn f() {}
        fn t<T>(_: T) -> &'static str {
            std::any::type_name::<T>()
        }
        let n = t(f);
        let v = &n[..n.len() - 3];

        match &v.strip_suffix("::call") {
            Some(d) => match &d.rfind(':') {
                Some(s) => &d[s + 1..d.len()],
                None => v,
            },
            None => match v.strip_suffix("::call::{{closure}}") {
                Some(f) => match &f.rfind(':') {
                    Some(s) => &f[s + 1..f.len()],
                    None => v,
                },
                None => match &v.rfind(':') {
                    Some(s) => &v[s + 1..v.len()],
                    None => v,
                },
            },
        }
    }};
}