use std::time::Duration;
use libtmux::test::unique_name;
use libtmux::{ChannelWait, NewWindowOptions, Server};
const JOBS: [(&str, &str); 3] = [
("build", "printf 'built 3 targets\\n'"),
("test", "printf '12 passed\\n'"),
("lint", "printf 'no findings\\n'"),
];
#[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-orchestrate")));
let server = Server::builder().socket_path(&socket).build()?;
println!("server on {}", socket.display());
let finished = server
.with_session(unique_name("orchestrate").as_str(), async |session| {
let mut channels = Vec::new();
for (name, work) in JOBS {
let channel = unique_name(&format!("done-{name}"));
let script = format!("{work}; tmux wait-for -S {channel}");
let window = session
.new_window(NewWindowOptions::new(name).command(script))
.await?;
println!(" {name} started in window {}", window.id());
channels.push((name, channel));
}
let mut finished = 0;
for (name, channel) in channels {
match server
.wait_for_channel(&channel, Duration::from_secs(10))
.await?
{
ChannelWait::Signalled => {
println!(" {name} finished");
finished += 1;
}
_ => println!(" {name} did not finish in time"),
}
}
Ok::<_, libtmux::Error>(finished)
})
.await?;
println!("{finished} of {} jobs finished", JOBS.len());
server.kill().await?;
std::fs::remove_file(&socket).ok();
println!("server gone, socket removed");
Ok(())
}