use std::process::{Command, Stdio};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Os {
Mac,
Linux,
Other,
}
impl Os {
pub fn current() -> Os {
if cfg!(target_os = "macos") {
Os::Mac
} else if cfg!(target_os = "linux") {
Os::Linux
} else {
Os::Other
}
}
}
pub fn display_name(runtime: &str) -> String {
match runtime {
"docker" => "Docker".to_string(),
"podman" => "Podman".to_string(),
"container" => "Apple container".to_string(),
other => other.to_string(),
}
}
fn liveness_probe(runtime: &str) -> &'static [&'static str] {
match runtime {
"container" => &["list"],
_ => &["info"],
}
}
pub fn start_command(runtime: &str, os: Os) -> Option<String> {
let cmd = match (runtime, os) {
("docker", Os::Mac) => "open -a Docker",
("docker", Os::Linux) => "sudo systemctl start docker",
("docker", Os::Other) => "start Docker Desktop",
("podman", Os::Mac) => "podman machine start",
("podman", Os::Linux) => "systemctl --user start podman.socket",
("podman", Os::Other) => "podman machine start",
("container", _) => "container system start",
_ => return None,
};
Some(cmd.to_string())
}
pub fn is_running(runtime: &str) -> bool {
Command::new(runtime)
.args(liveness_probe(runtime))
.stdout(Stdio::null())
.stderr(Stdio::null())
.status()
.map(|s| s.success())
.unwrap_or(false)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_names_are_friendly_with_a_raw_fallback() {
assert_eq!(display_name("docker"), "Docker");
assert_eq!(display_name("podman"), "Podman");
assert_eq!(display_name("container"), "Apple container");
assert_eq!(display_name("nerdctl"), "nerdctl");
}
#[test]
fn start_commands_are_os_specific() {
assert_eq!(start_command("docker", Os::Mac).as_deref(), Some("open -a Docker"));
assert!(start_command("docker", Os::Linux).unwrap().contains("systemctl start docker"));
assert_eq!(start_command("podman", Os::Mac).as_deref(), Some("podman machine start"));
assert!(start_command("podman", Os::Linux).unwrap().contains("podman.socket"));
assert_eq!(start_command("container", Os::Mac).as_deref(), Some("container system start"));
assert_eq!(start_command("nerdctl", Os::Linux), None);
}
}