1use std::fs;
4use std::path::Path;
5
6use crate::ShellError;
7
8pub 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
20pub 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}