hot_restart/hot_restart/
fn.rs

1use crate::*;
2
3fn run_hot_restart(run_args: &[&str], wait: bool) -> ResultHotRestartError {
4    let check_output: Output = Command::new("cargo")
5        .args(&["install", "--list"])
6        .output()
7        .map_err(|e| HotRestartError::Other(e.to_string()))?;
8    let check_output_str: Cow<'_, str> = String::from_utf8_lossy(&check_output.stdout);
9    if !check_output_str.contains("cargo-watch") {
10        eprintln!("Cargo-watch is not installed. Attempting to install...");
11        let install_status: ExitStatus = Command::new("cargo")
12            .args(&["install", "cargo-watch"])
13            .stdout(Stdio::inherit())
14            .stderr(Stdio::inherit())
15            .spawn()?
16            .wait()?;
17        if !install_status.success() {
18            return Err(HotRestartError::CargoWatchNotInstalled);
19        }
20        eprintln!("Cargo-watch installed successfully.");
21    }
22    let mut command: Command = Command::new("cargo-watch");
23    command
24        .args(run_args)
25        .stdout(Stdio::inherit())
26        .stderr(Stdio::inherit())
27        .stdin(Stdio::inherit());
28    let mut child: Child = command
29        .spawn()
30        .map_err(|e| HotRestartError::CommandSpawnFailed(e.to_string()))?;
31    if wait {
32        child
33            .wait()
34            .map_err(|e| HotRestartError::CommandWaitFailed(e.to_string()))?;
35    }
36    exit(0);
37}
38
39pub fn hot_restart(run_args: &[&str]) -> ResultHotRestartError {
40    run_hot_restart(run_args, false)
41}
42
43pub fn hot_restart_wait(run_args: &[&str]) -> ResultHotRestartError {
44    run_hot_restart(run_args, true)
45}