use std::time::Instant;
use etcdv3client::{pb::RangeRequest, Error, EtcdClient};
#[tokio::main]
async fn main() -> Result<(), Error> {
let key = "/hello";
let value = "world";
let mut origin: Option<Vec<u8>> = None;
let endpoint = "http://localhost:2379";
let cred = None;
let mut client = EtcdClient::new(vec![endpoint], cred).await?;
match client.get(key).await {
Ok(v) => {
println!("got orignal {} => {:?}", key, String::from_utf8_lossy(&v));
origin = Some(v.to_vec());
}
Err(err) => {
if err.is_key_not_found() {
client.put(key, value).await.unwrap();
} else {
return Err(err);
}
}
}
let req = RangeRequest {
key: key.as_bytes().to_vec(),
..Default::default()
};
let resp = client.kv.range(req).await?;
println!("got range resp => {:?}", resp);
let start = Instant::now();
let mut watcher = client.watch(key).await?;
client.kv.do_put(key, value).await?;
let mut n: i32 = 0;
while let Some(w) = watcher.message().await? {
println!("[{:?}] [{}] watch got => {:?}", start.elapsed(), n, w);
if w.canceled {
println!("[{:?}] watch cancaled, exit...", start.elapsed());
break;
}
let v = format!("{}-{}", value, n);
client.put(key, v.clone()).await?;
println!("put value done: {}", v);
if n > 1 {
watcher.cancel().await?;
println!("[{:?}] sent cancel at {}", start.elapsed(), n);
}
n += 1;
}
match origin {
Some(orig) => {
client.put(key, orig).await?;
}
None => {
client.delete(key).await?;
}
}
Ok(())
}