use std::str::FromStr;
use crate::multi_eq_ignore_ascii_case;
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
#[non_exhaustive]
pub enum FileSystem {
Ext2,
Ext3,
Ext4,
VFat,
ExFat,
F2fs,
Ntfs,
Zfs,
Hfs,
HfsPlus,
Jfs,
Reiser3,
Reiser4,
Btrfs,
Bcachefs,
Minix,
Nilfs,
Xfs,
Apfs,
FuseBlk,
Other(String),
}
impl FileSystem {
#[inline]
pub fn is_physical(&self) -> bool {
!self.is_virtual()
}
#[inline]
pub fn is_virtual(&self) -> bool {
matches!(self, FileSystem::Other(..))
}
#[expect(dead_code)]
#[inline]
pub fn as_str(&self) -> &str {
match self {
FileSystem::Ext2 => "ext2",
FileSystem::Ext3 => "ext3",
FileSystem::Ext4 => "ext4",
FileSystem::VFat => "vfat",
FileSystem::Ntfs => "ntfs",
FileSystem::Zfs => "zfs",
FileSystem::Hfs => "hfs",
FileSystem::Reiser3 => "reiserfs",
FileSystem::Reiser4 => "reiser4",
FileSystem::FuseBlk => "fuseblk",
FileSystem::ExFat => "exfat",
FileSystem::F2fs => "f2fs",
FileSystem::HfsPlus => "hfs+",
FileSystem::Jfs => "jfs",
FileSystem::Btrfs => "btrfs",
FileSystem::Bcachefs => "bcachefs",
FileSystem::Minix => "minix",
FileSystem::Nilfs => "nilfs",
FileSystem::Xfs => "xfs",
FileSystem::Apfs => "apfs",
FileSystem::Other(string) => string.as_str(),
}
}
}
impl FromStr for FileSystem {
type Err = anyhow::Error;
#[inline]
fn from_str(s: &str) -> anyhow::Result<Self> {
Ok(if s.eq_ignore_ascii_case("ext2") {
FileSystem::Ext2
} else if s.eq_ignore_ascii_case("ext3") {
FileSystem::Ext3
} else if s.eq_ignore_ascii_case("ext4") {
FileSystem::Ext4
} else if multi_eq_ignore_ascii_case!(s, "msdos" | "vfat") {
FileSystem::VFat
} else if multi_eq_ignore_ascii_case!(s, "ntfs3" | "ntfs") {
FileSystem::Ntfs
} else if s.eq_ignore_ascii_case("zfs") {
FileSystem::Zfs
} else if s.eq_ignore_ascii_case("hfs") {
FileSystem::Hfs
} else if s.eq_ignore_ascii_case("reiserfs") {
FileSystem::Reiser3
} else if s.eq_ignore_ascii_case("reiser4") {
FileSystem::Reiser4
} else if s.eq_ignore_ascii_case("exfat") {
FileSystem::ExFat
} else if s.eq_ignore_ascii_case("f2fs") {
FileSystem::F2fs
} else if s.eq_ignore_ascii_case("hfsplus") {
FileSystem::HfsPlus
} else if s.eq_ignore_ascii_case("jfs") {
FileSystem::Jfs
} else if s.eq_ignore_ascii_case("btrfs") {
FileSystem::Btrfs
} else if s.eq_ignore_ascii_case("bcachefs") {
FileSystem::Bcachefs
} else if s.eq_ignore_ascii_case("minix") {
FileSystem::Minix
} else if multi_eq_ignore_ascii_case!(s, "nilfs" | "nilfs2") {
FileSystem::Nilfs
} else if s.eq_ignore_ascii_case("xfs") {
FileSystem::Xfs
} else if s.eq_ignore_ascii_case("apfs") {
FileSystem::Apfs
} else if s.eq_ignore_ascii_case("fuseblk") {
FileSystem::FuseBlk
} else {
FileSystem::Other(s.to_string())
})
}
}
#[cfg(test)]
mod test {
use std::str::FromStr;
use super::FileSystem;
#[test]
fn file_system_from_str() {
assert_eq!(FileSystem::from_str("ext4").unwrap(), FileSystem::Ext4);
assert_eq!(FileSystem::from_str("msdos").unwrap(), FileSystem::VFat);
assert_eq!(FileSystem::from_str("vfat").unwrap(), FileSystem::VFat);
assert_eq!(
FileSystem::from_str("this does not exist").unwrap(),
FileSystem::Other("this does not exist".to_owned())
);
}
}