use std::process::Output;
use std::time::Duration;
use tokio::process::Command;
pub const ROS2_COMMAND_TIMEOUT: Duration = Duration::from_secs(10);
pub async fn run_with_timeout(
program: &str,
args: &[&str],
timeout: Duration,
) -> std::io::Result<Output> {
let child = Command::new(program)
.args(args)
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.kill_on_drop(true)
.spawn()?;
match tokio::time::timeout(timeout, child.wait_with_output()).await {
Ok(result) => result,
Err(_) => Err(std::io::Error::new(
std::io::ErrorKind::TimedOut,
format!(
"`{} {}` timed out after {:?}",
program,
args.join(" "),
timeout
),
)),
}
}