use std::time::Duration;
use libtmux::test::{retry_until, unique_name};
use libtmux::{NewWindowOptions, Server, SplitDirection, SplitOptions};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let socket = std::env::temp_dir().join(format!("{}.sock", unique_name("libtmux-scratch")));
let server = Server::builder().socket_path(&socket).build()?;
let output = server
.with_session(unique_name("scratch").as_str(), async |session| {
let window = session
.new_window(NewWindowOptions::new("work").command("sh"))
.await?;
window
.split(SplitOptions::new(SplitDirection::Below).command("sh"))
.await?;
let Some(pane) = window.active_pane().await? else {
return Ok(0);
};
pane.send_keys("printf 'hello from tmux\\n'").await?;
pane.send_key_names(["Enter"]).await?;
retry_until(Duration::from_secs(5), async || {
pane.capture().await.is_ok_and(|lines| {
lines
.iter()
.any(|line| line.as_bytes().windows(5).any(|window| window == b"hello"))
})
})
.await?;
Ok::<_, Box<dyn std::error::Error>>(pane.capture().await?.len())
})
.await?;
println!("captured {output} lines");
assert!(server.sessions().await?.is_empty(), "the scope cleaned up");
server.shutdown().await?;
Ok(())
}