ridicule 0.3.0

Rust mocking library supporting non-static function generics
Documentation
use std::path::PathBuf;

use ridicule::mock;

trait Foo
{
    fn do_something<Callback>(&self, cb: Callback)
    where
        Callback: Fn(u64) -> String;

    fn do_something_else<Callback, Value>(&self, cb: Callback)
    where
        Callback: Fn(f32) -> Value;
}

mock! {
    MockFoo {}

    impl Foo for MockFoo
    {
        fn do_something<Callback>(&self, cb: Callback)
        where
            Callback: Fn(u64) -> String;

        fn do_something_else<Callback, Value>(&self, cb: Callback)
        where
            Callback: Fn(f32) -> Value;
        }
}

fn main()
{
    let mut mock_foo = MockFoo::new();

    unsafe {
        mock_foo
            .expect_do_something()
            .returning(|_me, cb: fn(_) -> _| {
                println!("do_something was called");

                let cb_res = cb(42);

                println!("Received '{cb_res}' from callback");
            });
    }

    unsafe {
        mock_foo
            .expect_do_something_else()
            .returning(|_me, cb: fn(_) -> PathBuf| {
                println!("do_something_else was called");

                let cb_res = cb(255.255);

                println!("Received '{}' from callback", cb_res.display());
            });
    }

    mock_foo.do_something((|num| format!("Hello there {num}")) as fn(_) -> _);

    mock_foo.do_something_else((|_| PathBuf::from(r"a/b/c.txt")) as fn(_) -> _);
}