Skip to main content

vs_shell/
link.rs

1use std::fs;
2use std::path::Path;
3
4use crate::ShellError;
5
6/// Creates a fresh directory symlink.
7pub fn link_directory(target: &Path, link: &Path) -> Result<(), ShellError> {
8    if link.exists() || link.is_symlink() {
9        remove_existing(link)?;
10    }
11    if let Some(parent) = link.parent() {
12        fs::create_dir_all(parent)?;
13    }
14    create_symlink(target, link)?;
15    Ok(())
16}
17
18/// Removes a symlink or directory recursively.
19pub fn remove_existing(path: &Path) -> Result<(), ShellError> {
20    if !path.exists() && !path.is_symlink() {
21        return Ok(());
22    }
23    let metadata = fs::symlink_metadata(path)?;
24    if metadata.file_type().is_symlink() || metadata.is_file() {
25        fs::remove_file(path)?;
26    } else {
27        fs::remove_dir_all(path)?;
28    }
29    Ok(())
30}
31
32#[cfg(unix)]
33fn create_symlink(target: &Path, link: &Path) -> Result<(), ShellError> {
34    std::os::unix::fs::symlink(target, link)?;
35    Ok(())
36}
37
38#[cfg(windows)]
39fn create_symlink(target: &Path, link: &Path) -> Result<(), ShellError> {
40    std::os::windows::fs::symlink_dir(target, link)?;
41    Ok(())
42}