try-drop 0.2.0

Batteries included error handling mechanisms for drops which can fail
Documentation
use once_cell::sync::OnceCell;
use std::sync::Arc;
use try_drop::drop_strategies::once_cell::Ignore;
use try_drop::drop_strategies::{OnceCellDropStrategy, PanicDropStrategy};
use try_drop::test_utils::{ErrorsOnDrop, Mode, Random, TryDropTypes};
use try_drop::{adapters::DropAdapter, PureTryDrop};

fn drops_value<M: Mode, TDT: TryDropTypes>(value: DropAdapter<ErrorsOnDrop<M, TDT>>)
where
    ErrorsOnDrop<M, TDT>: PureTryDrop,
{
    drop(value)
}

fn main() {
    let error = Arc::new(OnceCell::new());
    let strategy = OnceCellDropStrategy::<Ignore>::new(Arc::clone(&error));
    let value = ErrorsOnDrop::<Random, _>::given(strategy, PanicDropStrategy::DEFAULT).adapt();

    println!("will only error on drop sometimes");
    drops_value(value);

    if let Some(error) = Arc::try_unwrap(error).unwrap().take() {
        println!("an error occurred in `drops_value`: {error}")
    } else {
        println!("no error occurred in `drops_value`")
    }
}