Refactor commandline processing

This reduces the amount of code duplication, and similar flow
is used for both wsl and non-wsl code paths.
macos-click-through
Fred Sundvik 3 years ago
parent 22cb5bc05f
commit 7d19cd5ebe

@ -29,8 +29,12 @@ fn set_windows_creation_flags(cmd: &mut Command) {
cmd.creation_flags(0x0800_0000); // CREATE_NO_WINDOW
}
fn build_nvim_cmd_with_args(bin: &str) -> Command {
let mut args = Vec::<String>::new();
args.push("--embed".to_string());
args.extend(SETTINGS.get::<CmdLineSettings>().neovim_args);
#[cfg(windows)]
fn platform_build_nvim_cmd(bin: &str) -> Option<Command> {
if SETTINGS.get::<CmdLineSettings>().wsl {
let mut cmd = Command::new("wsl");
cmd.args(&[
@ -38,62 +42,63 @@ fn platform_build_nvim_cmd(bin: &str) -> Option<Command> {
"-c",
"let \\$PATH=system(\"\\$SHELL -lic 'echo \\$PATH' 2>/dev/null\")",
]);
Some(cmd)
} else if Path::new(&bin).exists() {
Some(Command::new(bin))
} else {
None
cmd.args(args);
return cmd;
}
let mut cmd = Command::new(bin);
cmd.args(args);
cmd
}
#[cfg(unix)]
fn platform_build_nvim_cmd(bin: &str) -> Option<Command> {
if Path::new(&bin).exists() {
Some(Command::new(bin))
fn platform_exists(bin: &str) -> bool {
#[cfg(windows)]
if SETTINGS.get::<CmdLineSettings>().wsl {
if let Ok(output) = std::process::Command::new("wsl")
.args(&["$SHELL", "-lic"])
.arg(format!("exists -x {}", bin))
.output()
{
return output.status.success();
} else {
None
}
error!("wsl exists failed");
std::process::exit(1);
}
fn build_nvim_cmd() -> Command {
if let Some(path) = SETTINGS.get::<CmdLineSettings>().neovim_bin {
if let Some(cmd) = platform_build_nvim_cmd(&path) {
return cmd;
} else {
warn!("NEOVIM_BIN is invalid falling back to first bin in PATH");
}
Path::new(&bin).exists()
}
fn platform_which(bin: &str) -> Option<String> {
#[cfg(windows)]
if SETTINGS.get::<CmdLineSettings>().wsl {
if let Ok(output) = std::process::Command::new("wsl")
.args(&["$SHELL", "-lic", "which nvim"])
.args(&["$SHELL", "-lic"])
.arg(format!("which {}", bin))
.output()
{
if output.status.success() {
let path = String::from_utf8(output.stdout).unwrap();
let mut cmd = Command::new("wsl");
cmd.args(&[
path.trim(),
"-c",
"let \\$PATH=system(\"\\$SHELL -lic 'echo \\$PATH' 2>/dev/null\")",
]);
return cmd;
return Some(String::from_utf8(output.stdout).unwrap());
} else {
error!("nvim not found in WSL path");
std::process::exit(1);
return None;
}
}
}
if let Ok(path) = which::which(bin) {
path.into_os_string().into_string().ok()
} else {
error!("wsl which nvim failed");
std::process::exit(1);
None
}
}
if let Ok(path) = which::which("nvim") {
if let Some(cmd) = platform_build_nvim_cmd(path.to_str().unwrap()) {
cmd
fn build_nvim_cmd() -> Command {
if let Some(path) = SETTINGS.get::<CmdLineSettings>().neovim_bin {
if platform_exists(&path) {
return build_nvim_cmd_with_args(&path);
} else {
error!("nvim does not have proper permissions!");
std::process::exit(1);
warn!("NEOVIM_BIN is invalid falling back to first bin in PATH");
}
}
if let Some(path) = platform_which("nvim") {
build_nvim_cmd_with_args(&path)
} else {
error!("nvim not found!");
std::process::exit(1);
@ -123,9 +128,6 @@ pub fn build_neovide_command(channel: u64, num_args: u64, command: &str, event:
pub fn create_nvim_command() -> Command {
let mut cmd = build_nvim_cmd();
cmd.arg("--embed")
.args(SETTINGS.get::<CmdLineSettings>().neovim_args.iter());
info!("Starting neovim with: {:?}", cmd);
#[cfg(not(debug_assertions))]

Loading…
Cancel
Save