#![warn(clippy::pedantic)]
#![warn(clippy::nursery)]
use std::fs::File;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum FileSystemKind {
Recognized(FileSystemName),
Unrecognized(Box<String>),
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[repr(u16)]
pub enum FileSystemName {
Autofs,
Btrfs,
Cdfs,
Devfs,
Ext2,
Ext3,
Ext4,
Fat,
Fat32,
Fatx,
Fdescfs,
Fusefs,
Linprocfs, Linsysfs, Mqueuefs,
Nfs,
Ntfs,
Nullfs,
Procfs,
Tmpfs,
Ufs,
Zfs,
}
pub trait FileExt {
fn filesystem(&self) -> Result<FileSystemKind, std::io::Error>;
}
cfg_if::cfg_if! {
if #[cfg(target_os = "freebsd")] {
mod freebsd;
use freebsd::filesystem;
} else if #[cfg(target_os = "windows")] {
mod windows;
use windows::filesystem;
} else if #[cfg(target_os = "macos")] {
mod macos;
use macos::filesystem;
} else if #[cfg(target_os = "linux")] {
mod linux;
use linux::filesystem;
} else {
}
}
impl FileExt for File {
fn filesystem(&self) -> Result<FileSystemKind, std::io::Error> {
filesystem(self)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn look_for_unrecognized_filesystems() {
use std::collections::HashSet;
use walkdir::WalkDir;
let mut set = HashSet::new();
for entry in WalkDir::new("/").into_iter().filter_map(Result::ok) {
if let Ok(file) = File::open(entry.path()) {
if let Ok(FileSystemKind::Unrecognized(s)) = file.filesystem() {
set.insert(s);
}
}
}
if !set.is_empty() {
panic!("{:?}", set);
}
}
}