async-task-group 0.2.1

Manage groups of `async-std` tasks as a single unit.
Documentation
use anyhow::{anyhow, Error};
use async_std::{prelude::*, task};
use std::time::Duration;

#[async_std::main]
async fn main() -> Result<(), Error> {
    let deadline = Duration::from_secs(5);
    let handle = async_task_group::group(|group| async move {
        println!("hello dogs!");

        group.spawn(async move {
            task::sleep(Duration::from_secs(2)).await;
            println!("Gussie goes and sucks on a blanket");
            Ok(())
        });

        group.spawn(async move {
            task::sleep(Duration::from_secs(1)).await;
            println!("Willa wants to play outside");
            task::sleep(Duration::from_secs(1)).await;
            if true {
                println!("Willa is upset and about to do something naughty");
                Err(anyhow!("willa is chewing on the blinds"))
            } else {
                Ok(())
            }
        });

        group.spawn(async move {
            for _ in 1..4usize {
                task::sleep(Duration::from_millis(500)).await;
                println!("Sparky wants to go out too");
            }
            task::sleep(Duration::from_millis(500)).await;
            println!("Sparky is taking a nap");
            Ok(())
        });

        Ok(group)
    });

    match handle.timeout(deadline).await {
        Ok(Ok(())) => {
            println!("dogs have not defeated me");
            Ok(())
        }
        Ok(Err(error)) => Err(error.context(format!("task died"))),
        Err(_) => Err(anyhow!("timeout")),
    }
}