mod common;
use
{
async_executors :: { TokioCtBuilder, LocalSpawnHandle } ,
async_nursery :: { Nursery, LocalNurseExt } ,
common :: { DynResult, setup_tracing } ,
futures :: { TryStreamExt } ,
futures_timer :: { Delay } ,
std :: { time::Duration, rc::Rc } ,
tracing_crate :: { info, error } ,
};
async fn return_error( exec: impl LocalSpawnHandle<DynResult<()>> ) -> DynResult<()>
{
let (nursery, mut output) = Nursery::new( exec ); info!( "nursery created" );
nursery.nurse_local( slow() )?;
nursery.nurse_local( wrong() )?;
drop(nursery);
while output.try_next().await?.is_some() {};
unreachable!( "drop Nursery and NurseryStream" );
}
async fn slow() -> DynResult<()>
{
info!( "spawned slow." );
let delay = Rc::new(5);
Delay::new( Duration::from_secs( *delay) ).await;
error!( "I managed to stall you all." );
Ok(())
}
async fn wrong() -> DynResult<()>
{
info!( "spawned wrong." );
Err( "I don't like waiting.".into() )
}
fn main() -> DynResult<()>
{
setup_tracing();
let exec = TokioCtBuilder::new().build()?;
let err = exec.block_on( return_error( exec.clone() ) );
assert!( err.is_err() );
Ok(())
}