use async_injector::Key; use serde::Serialize; use std::{error::Error, time::Duration}; use tokio::time; #[derive(Serialize)] enum Tag { One, Two, } #[tokio::main] async fn main() -> Result<(), Box> { let injector = async_injector::Injector::new(); let one = Key::::tagged(Tag::One)?; let two = Key::::tagged(Tag::Two)?; tokio::spawn({ let injector = injector.clone(); let one = one.clone(); async move { let mut interval = time::interval(Duration::from_secs(1)); for i in 0u32.. { interval.tick().await; injector.update_key(&one, i).await; } } }); tokio::spawn({ let injector = injector.clone(); let two = two.clone(); async move { let mut interval = time::interval(Duration::from_secs(1)); for i in 0u32.. { interval.tick().await; injector.update_key(&two, i * 2).await; } } }); let (mut one_stream, mut one) = injector.stream_key(one).await; let (mut two_stream, mut two) = injector.stream_key(two).await; println!("one: {:?}", one); println!("two: {:?}", two); loop { tokio::select! { update = one_stream.recv() => { one = update; println!("one: {:?}", one); } update = two_stream.recv() => { two = update; println!("two: {:?}", two); } } } }