hanger 0.1.0

Attribute macro to put hooks around a function.
Documentation
use hanger::hook;
use std::sync::atomic::{AtomicUsize, Ordering};

#[test]
fn test_hooks() {
    static COUNTER: AtomicUsize = AtomicUsize::new(0);
    fn add_one() {
        COUNTER.fetch_add(1, Ordering::Relaxed);
    }
    fn sub_one() {
        COUNTER.fetch_sub(1, Ordering::Relaxed);
    }

    #[hook(add_one)]
    fn entry_add_one() {
        COUNTER.fetch_add(1, Ordering::Relaxed);
    }
    entry_add_one();
    assert_eq!(COUNTER.load(Ordering::Relaxed), 2);

    #[hook(before = add_one, after = sub_one)]
    fn entry_add_sub() {
        COUNTER.fetch_add(1, Ordering::Relaxed);
    }
    entry_add_sub();
    assert_eq!(COUNTER.load(Ordering::Relaxed), 3);
}

#[test]
fn test_path_hooks() {
    mod path {
        use super::*;
        pub static COUNTER: AtomicUsize = AtomicUsize::new(0);

        pub fn add_one() {
            COUNTER.fetch_add(1, Ordering::Relaxed);
        }
        pub fn sub_one() {
            COUNTER.fetch_sub(1, Ordering::Relaxed);
        }
    }

    #[hook(path::add_one)]
    fn entry_add_one() {
        path::COUNTER.fetch_add(1, Ordering::Relaxed);
    }
    entry_add_one();
    assert_eq!(path::COUNTER.load(Ordering::Relaxed), 2);

    #[hook(before = path::add_one, after = path::sub_one)]
    fn entry_add_sub() {
        path::COUNTER.fetch_add(1, Ordering::Relaxed);
    }
    entry_add_sub();
    assert_eq!(path::COUNTER.load(Ordering::Relaxed), 3);
}

mod tests {
    use super::*;
    static G_COUNTER: AtomicUsize = AtomicUsize::new(0);
    fn add_g() {
        G_COUNTER.fetch_add(1, Ordering::Relaxed);
    }

    #[test]
    #[hook(add_g)]
    fn test_hook_tests() {
        assert_eq!(G_COUNTER.load(Ordering::Relaxed), 1);
    }
}