#![warn(missing_docs)]
use std::process::Command;
#[cfg(windows)]
use std::os::windows::process::CommandExt;
#[derive(Debug)]
pub enum Conversion {
WindowsToWsl,
WslToWindows,
WslToWindowsLinuxStyle,
}
pub fn convert(
path: &str,
distro: Option<&str>,
options: Conversion,
force_absolute_path: bool,
) -> Result<String, Box<dyn std::error::Error>> {
let mut args = Vec::new();
if let Some(distro) = distro {
args.push("-d");
args.push(distro);
}
args.push("-e");
args.push("wslpath");
args.push(match options {
Conversion::WindowsToWsl => "-u",
Conversion::WslToWindows => "-w",
Conversion::WslToWindowsLinuxStyle => "-m",
});
if force_absolute_path {
args.push("-a");
}
let mut cmd = Command::new("wsl.exe");
cmd.args(args);
cmd.arg(path.replace('\\', "\\\\"));
#[cfg(windows)]
cmd.creation_flags(0x08000000);
let output = cmd
.output()
.map_err(|e| format!("Error executing wsl.exe: {}", e))?;
let code = output.status.code().unwrap_or(-1);
if code != 0 {
return Err(format!("Error getting wslpath: {}", code).into());
}
Ok(std::str::from_utf8(&output.stdout)
.map_err(|e| format!("Error converting output to string: {}", e))?
.trim()
.to_string())
}
#[cfg(test)]
mod tests {
use crate::{convert, Conversion};
#[test]
fn test_wsl_to_windows() {
assert_eq!(
convert("/mnt/c", None, Conversion::WslToWindows, false).unwrap_or_default(),
"C:\\"
);
}
#[test]
fn test_wsl_to_windows_absolute() {
assert_eq!(
convert("/mnt/c", None, Conversion::WslToWindows, true).unwrap_or_default(),
"C:\\"
);
}
#[test]
fn test_wsl_to_windows_linux_style() {
assert_eq!(
convert("/mnt/c", None, Conversion::WslToWindowsLinuxStyle, false).unwrap_or_default(),
"C:/"
);
}
#[test]
fn test_wsl_to_windows_linux_style_absolute() {
assert_eq!(
convert("/mnt/c", None, Conversion::WslToWindowsLinuxStyle, true).unwrap_or_default(),
"C:/"
);
}
#[test]
fn test_windows_to_wsl() {
assert_eq!(
convert("C:/", None, Conversion::WindowsToWsl, false).unwrap_or_default(),
"/mnt/c/"
);
}
#[test]
fn test_windows_to_wsl_absolute() {
assert_eq!(
convert("C:/", None, Conversion::WindowsToWsl, true).unwrap_or_default(),
"/mnt/c/"
);
}
}