use std::process::{Command, Stdio};
fn open_command(os: &str, url: &str) -> (&'static str, Vec<String>) {
match os {
"macos" => ("open", vec![url.to_owned()]),
"windows" => (
"cmd",
vec![
"/C".to_owned(),
"start".to_owned(),
String::new(),
url.to_owned(),
],
),
_ => ("xdg-open", vec![url.to_owned()]),
}
}
pub fn open_in_browser(url: &str) -> bool {
let (program, args) = open_command(std::env::consts::OS, url);
Command::new(program)
.args(args)
.stdin(Stdio::null())
.stdout(Stdio::null())
.stderr(Stdio::null())
.spawn()
.is_ok()
}
#[cfg(test)]
mod tests {
use super::*;
fn arg_strs(args: &[String]) -> Vec<&str> {
args.iter().map(String::as_str).collect()
}
#[test]
fn linux_uses_xdg_open() {
let (program, args) = open_command("linux", "https://example.test/x");
assert_eq!(program, "xdg-open");
assert_eq!(arg_strs(&args), ["https://example.test/x"]);
}
#[test]
fn macos_uses_open() {
let (program, args) = open_command("macos", "https://example.test/x");
assert_eq!(program, "open");
assert_eq!(arg_strs(&args), ["https://example.test/x"]);
}
#[test]
fn windows_uses_cmd_start_with_empty_title() {
let (program, args) = open_command("windows", "https://example.test/x");
assert_eq!(program, "cmd");
assert_eq!(
arg_strs(&args),
["/C", "start", "", "https://example.test/x"]
);
}
#[test]
fn unknown_os_falls_back_to_xdg_open() {
let (program, _) = open_command("freebsd", "https://example.test/x");
assert_eq!(program, "xdg-open");
}
}