#![allow(clippy::print_stdout, reason = "an example")]
use std::time::Duration;
use libtmux::control::{ControlMode, Event};
use libtmux::test::unique_name;
use libtmux::{Command, Server};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let root = std::path::Path::new("/tmp/libtmux-rs-dev");
std::fs::create_dir_all(root)?;
let socket = root.join(format!("{}.sock", unique_name("libtmux-watch")));
let server = Server::builder().socket_path(&socket).build()?;
let session = server.new_session(unique_name("watched").as_str()).await?;
let (commands, mut events) = ControlMode::attach(&server, session.id()).await?.split();
println!("one connection to {}", socket.display());
let watcher = tokio::spawn(async move {
let mut seen = Vec::new();
while let Some(event) = events.next_event().await {
match event {
Event::WindowAdded { window } => {
println!(" <- window {window} appeared");
seen.push(window.to_string());
}
Event::WindowRenamed { window, name } => {
println!(" <- window {window} is now {}", name.to_string_lossy());
seen.push(window.to_string());
}
Event::Exit { .. } => break,
_ => continue,
}
if seen.len() == 2 {
break;
}
}
(seen, events)
});
println!(" -> new-window (a line on that connection, not a process)");
commands
.send(Command::new("new-window").arg("-d").arg("-n").arg("built"))
.await?;
println!(" -> rename-window");
commands
.send(
Command::new("rename-window")
.arg("-t")
.arg("built")
.arg("renamed"),
)
.await?;
let (seen, events) = tokio::time::timeout(Duration::from_secs(10), watcher).await??;
println!(
"{} events arrived while those commands were being sent, on the same socket",
seen.len()
);
drop(commands);
events.shutdown().await?;
server.kill().await?;
server.shutdown().await?;
std::fs::remove_file(&socket)?;
Ok(())
}