use libtmux::test::unique_name;
use libtmux::{NewWindowOptions, 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-recover")));
let server = Server::builder().socket_path(&socket).build()?;
println!("server on {}", socket.display());
let home = server.new_session(unique_name("home").as_str()).await?;
let doomed = home.new_window(NewWindowOptions::new("doomed")).await?;
let doomed_id = doomed.id().clone();
let stale = doomed.clone();
doomed.kill().await?;
match server.window_by_id(&doomed_id).await {
Ok(Some(_)) => println!(" still there, which would be a bug"),
Ok(None) => println!(" {doomed_id} is gone: look it up again or give up"),
Err(error) if error.is_transient() => println!(" worth retrying: {error}"),
Err(error) => return Err(error.into()),
}
let refreshed = stale.refreshed().await;
match refreshed {
Ok(_) => println!(" refreshed a killed window, which would be a bug"),
Err(error) => println!(
" refresh says gone={}, retryable={}",
error.is_object_gone(),
error.is_transient()
),
}
let shared = home.new_window(NewWindowOptions::new("shared")).await?;
let elsewhere = server
.new_session(unique_name("elsewhere").as_str())
.await?;
shared.link_to(&elsewhere, None).await?;
let links = server.windows().await?;
let count = links.iter().filter(|w| w.id() == shared.id()).count();
println!(" {} is linked {count} times", shared.id());
let from_home = elsewhere
.windows()
.await?
.into_iter()
.find(|w| w.id() == shared.id())
.ok_or("the shared window is linked here")?;
let same_link = from_home.clone();
from_home.unlink().await?;
match same_link.unlink().await {
Ok(()) => println!(" unlinked the same link twice, which would be a bug"),
Err(error) => {
println!(" second unlink says: {error}");
println!(" debug: {error:?}");
println!(" is_object_gone: {}", error.is_object_gone());
println!(" is_transient: {}", error.is_transient());
}
}
let alive = server.window_by_id(shared.id()).await?.is_some();
println!(" and the window is still alive: {alive}");
home.kill().await?;
elsewhere.kill().await?;
server.kill().await?;
std::fs::remove_file(&socket).ok();
println!("told three failures apart, server gone, socket removed");
Ok(())
}