pulith-fs 0.1.0

Cross-platform atomic filesystem primitives
Documentation
use crate::{Error, Result};
use std::path::Path;

pub fn atomic_symlink(target: impl AsRef<Path>, link: impl AsRef<Path>) -> Result<()> {
    let target = target.as_ref();
    let link = link.as_ref();

    #[cfg(unix)]
    {
        std::os::unix::fs::symlink(target, link).map_err(|e| Error::Write {
            path: link.to_path_buf(),
            source: e,
        })
    }

    #[cfg(windows)]
    {
        if target.is_dir() {
            junction::create(target, link).map_err(|e| Error::Write {
                path: link.to_path_buf(),
                source: e,
            })
        } else {
            std::os::windows::fs::symlink_file(target, link).map_err(|e| Error::Write {
                path: link.to_path_buf(),
                source: e,
            })
        }
    }
}