use std::path::Path;
use_enabled_fs_module!();
use crate::{directory::try_exists_without_follow, error::FileRemoveError};
pub fn remove_file<P>(file_path: P) -> Result<(), FileRemoveError>
where
P: AsRef<Path>,
{
let file_path = file_path.as_ref();
match try_exists_without_follow(file_path) {
Ok(exists) => {
if !exists {
return Err(FileRemoveError::NotFound {
path: file_path.to_path_buf(),
});
}
}
Err(error) => {
return Err(FileRemoveError::UnableToAccessFile {
path: file_path.to_path_buf(),
error,
});
}
}
let file_metadata =
fs::symlink_metadata(file_path).map_err(|error| FileRemoveError::UnableToAccessFile {
path: file_path.to_path_buf(),
error,
})?;
if file_metadata.is_symlink() {
let file_metadata_resolved =
fs::metadata(file_path).map_err(|error| FileRemoveError::UnableToAccessFile {
path: file_path.to_path_buf(),
error,
})?;
if !file_metadata_resolved.is_file() {
return Err(FileRemoveError::NotAFile {
path: file_path.to_path_buf(),
});
}
} else if !file_metadata.is_file() {
return Err(FileRemoveError::NotAFile {
path: file_path.to_path_buf(),
});
}
fs::remove_file(file_path).map_err(|error| FileRemoveError::OtherIoError { error })?;
Ok(())
}