Skip to main content

vs_shell/
link.rs

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