acceptor 0.0.1

no_std bundle of thin acceptors built on the accepts core traits
Documentation
use core::sync::atomic::{AtomicUsize, Ordering};

use accepts::{Accepts, AsyncAccepts};

use crate::support::{Recorder, block_on};

use super::{Around, AsyncAround};

#[test]
fn around_runs_hooks_and_forwards() {
    let before = AtomicUsize::new(0);
    let after = AtomicUsize::new(0);
    let rec = Recorder::new();

    let adapter = Around::new(
        (),
        |_: &()| {
            before.fetch_add(1, Ordering::SeqCst);
        },
        |_: &()| {
            after.fetch_add(1, Ordering::SeqCst);
        },
        rec.clone(),
    );

    adapter.accept(7u32);

    assert_eq!(before.load(Ordering::SeqCst), 1);
    assert_eq!(after.load(Ordering::SeqCst), 1);
    assert_eq!(rec.take(), vec![7]);
}

#[test]
fn async_around_runs_hooks_and_forwards() {
    let before = AtomicUsize::new(0);
    let after = AtomicUsize::new(0);
    let rec = Recorder::new();

    let adapter = AsyncAround::new(
        (),
        |_: &()| {
            let before = &before;
            async move {
                before.fetch_add(1, Ordering::SeqCst);
            }
        },
        |_: &()| {
            let after = &after;
            async move {
                after.fetch_add(1, Ordering::SeqCst);
            }
        },
        rec.clone(),
    );

    block_on(adapter.accept_async(9u32));

    assert_eq!(before.load(Ordering::SeqCst), 1);
    assert_eq!(after.load(Ordering::SeqCst), 1);
    assert_eq!(rec.take(), vec![9]);
}