try-drop 0.2.0

Batteries included error handling mechanisms for drops which can fail
Documentation
use try_drop::drop_strategies::unreachable::UnreachableDropStrategy;
use try_drop::drop_strategies::AdHocDropStrategy;
use try_drop::handlers::*;
use try_drop::test_utils::{ErrorsOnDrop, Fallible};
use try_drop::PureTryDrop;

fn main() {
    println!("install main thread local handler");
    primary::thread_local::install(AdHocDropStrategy(|error| {
        println!("error from the main thread local: {error}")
    }));
    let thing = ErrorsOnDrop::<Fallible, _>::not_given().adapt();
    println!("drop test from main thread local handler");
    drop(thing);

    {
        println!("install first thread local scope");
        let _guard = primary::thread_local::scope(AdHocDropStrategy(|error| {
            println!("error from the first thread local scope: {error}")
        }));

        let thing = ErrorsOnDrop::<Fallible, _>::not_given().adapt();
        println!("drop test from first thread local scope");
        drop(thing)
    }

    println!("after the scope is dropped, we should be using the main thread local scope again");
    let thing = ErrorsOnDrop::<Fallible, _>::not_given().adapt();
    println!("drop test from exit of first thread local scope");
    drop(thing);

    {
        println!("install second thread local scope");
        let _guard = primary::thread_local::scope(AdHocDropStrategy(|error| {
            println!("error from the second thread local scope: {error}")
        }));

        let thing = ErrorsOnDrop::<Fallible, _>::not_given().adapt();
        println!("drop test from second thread local scope");
        drop(thing)
    }

    {
        println!("create nested scope");
        let _guard = primary::thread_local::ScopeGuard::try_new(UnreachableDropStrategy::safe());

        {
            println!("nested scopes aren't allowed");
            let error = primary::thread_local::ScopeGuard::try_new(UnreachableDropStrategy::safe())
                .unwrap_err();
            println!(
                "the error comes in a form of a `LockedError`: debug={error:?}, display={error}"
            )
        }
    }
}