use std::io;
use std::path::Path;
use std::process::{ExitStatus, Stdio};
use tokio::process::{Child, Command};
pub struct AppServer {
child: Child,
}
impl AppServer {
pub fn spawn(exe: &Path, dev_url: &str) -> io::Result<Self> {
let child = Command::new(exe)
.env("TOPCOAT_DEV_URL", dev_url)
.stdout(Stdio::inherit())
.stderr(Stdio::inherit())
.stdin(Stdio::inherit())
.kill_on_drop(true)
.spawn()?;
Ok(Self { child })
}
pub async fn exited(&mut self) -> io::Result<ExitStatus> {
self.child.wait().await
}
pub async fn shutdown(mut self) {
let _ = self.child.kill().await;
let _ = self.child.wait().await;
}
}