use etcd_rs::{Client, ClientConfig, KeyRange, KeyValueOp, Result, WatchInbound, WatchOp}; #[tokio::main] async fn main() -> Result<()> { let cli = Client::connect(ClientConfig::new([ "http://127.0.0.1:12379".into(), "http://127.0.0.1:22379".into(), "http://127.0.0.1:32379".into(), ])) .await?; let (mut stream, cancel) = cli .watch(KeyRange::prefix("foo")) .await .expect("watch by prefix"); tokio::spawn(async move { cli.put(("foo1", "1")).await.expect("put kv"); cli.put(("bar", "2")).await.expect("put kv"); cli.put(("foo2", "3")).await.expect("put kv"); cli.put(("bar", "4")).await.expect("put kv"); cli.put(("foo2", "5")).await.expect("put kv"); cli.delete("foo1").await.expect("delete kv"); cli.delete("bar").await.expect("delete kv"); cancel.cancel().await.expect("cancel watch"); }); loop { match stream.inbound().await { WatchInbound::Ready(resp) => { println!("receive event: {:?}", resp); } WatchInbound::Interrupted(e) => { eprintln!("encounter error: {:?}", e); } WatchInbound::Closed => { println!("watch stream closed"); break; } } } Ok(()) }