mod common;
use
{
async_executors :: { AsyncStd } ,
async_nursery :: { Nursery, NurseExt } ,
common :: { setup_tracing } ,
futures :: { FutureExt, TryStreamExt } ,
futures_timer :: { Delay } ,
std :: { time::Duration } ,
tracing_crate :: { info, error } ,
};
async fn return_catch_unwind() -> std::thread::Result<()>
{
let (nursery, mut output) = Nursery::new( AsyncStd ); info!( "nursery created" );
nursery.nurse( slow() )?;
nursery.nurse( wrong().catch_unwind() )?;
drop(nursery);
while output.try_next().await?.is_some() {};
unreachable!( "drop Nursery and NurseryStream" );
}
async fn slow() -> std::thread::Result<()>
{
info!( "spawned slow." );
Delay::new( Duration::from_secs(5) ).await;
error!( "I managed to stall you all." );
Ok(())
}
async fn wrong()
{
info!( "spawned wrong." );
panic!( "I don't like waiting." )
}
#[ async_std::main ]
async fn main()
{
setup_tracing();
std::panic::set_hook( Box::new( |e| error!( "{}", e ) ) );
for _ in 0..100
{
let err = return_catch_unwind().await;
assert!( err.is_err() );
}
}