use crate::error::{KopiError, Result};
use std::ffi::OsString;
use std::path::{Path, PathBuf};
use std::process::Command;
#[cfg(unix)]
pub fn exec_replace(program: &Path, args: Vec<OsString>) -> std::io::Error {
use std::os::unix::process::CommandExt;
Command::new(program).args(args).exec()
}
#[cfg(windows)]
pub fn exec_replace(program: &Path, args: Vec<OsString>) -> std::io::Error {
use std::process::Stdio;
match Command::new(program)
.args(args)
.stdin(Stdio::inherit())
.stdout(Stdio::inherit())
.stderr(Stdio::inherit())
.status()
{
Ok(status) => {
std::process::exit(status.code().unwrap_or(1));
}
Err(e) => e,
}
}
#[cfg(unix)]
pub fn launch_shell_with_env(shell_path: &PathBuf, env_name: &str, env_value: &str) -> Result<()> {
use std::os::unix::process::CommandExt;
let err = Command::new(shell_path).env(env_name, env_value).exec();
Err(KopiError::SystemError(format!(
"Failed to execute shell: {err}"
)))
}
#[cfg(windows)]
pub fn launch_shell_with_env(shell_path: &PathBuf, env_name: &str, env_value: &str) -> Result<()> {
use std::process::Stdio;
let status = Command::new(shell_path)
.env(env_name, env_value)
.stdin(Stdio::inherit())
.stdout(Stdio::inherit())
.stderr(Stdio::inherit())
.status()
.map_err(|e| KopiError::SystemError(format!("Failed to spawn shell: {e}")))?;
std::process::exit(status.code().unwrap_or(1));
}