use std::time::Duration;
use await_tree::{Config, InstrumentAwait, Registry};
use futures::channel::oneshot::{self, Receiver};
use futures::future::{pending, select};
use futures::FutureExt;
use tokio::time::sleep;
async fn work(rx: Receiver<()>) {
let mut fut = pending().instrument_await("fut");
let _ = select(
sleep(Duration::from_millis(500))
.instrument_await("sleep")
.boxed(),
&mut fut,
)
.instrument_await("select")
.await;
rx.instrument_await("rx").await.unwrap();
fut.await
}
#[tokio::main]
async fn main() {
let registry = Registry::new(Config::default());
let root = registry.register((), "work");
let (tx, rx) = oneshot::channel();
tokio::spawn(root.instrument(work(rx)));
sleep(Duration::from_millis(100)).await;
let tree = registry.get(()).unwrap().to_string();
println!("{tree}");
sleep(Duration::from_secs(1)).await;
let tree = registry.get(()).unwrap().to_string();
println!("{tree}");
tx.send(()).unwrap();
sleep(Duration::from_secs(1)).await;
let tree = registry.get(()).unwrap().to_string();
println!("{tree}");
}