refactor: comment on convoluted Filesystem::from_str code (#1315)

* refactor: use a less convoluted match for filesystem type conversion

* revert, just use comment

* just use if statements instead

* test

* inline
This commit is contained in:
Clement Tsang 2023-11-15 04:13:19 -05:00 committed by GitHub
parent 5eb4fbde5d
commit 8b9328e29e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 68 additions and 33 deletions

View File

@ -1,6 +1,7 @@
use std::str::FromStr; use std::str::FromStr;
/// Known filesystems. From [heim](https://github.com/heim-rs/heim/blob/master/heim-disk/src/filesystem.rs). /// Known filesystems. Original list from
/// [heim](https://github.com/heim-rs/heim/blob/master/heim-disk/src/filesystem.rs).
/// ///
/// All physical filesystems should have their own enum element and all virtual filesystems will go into /// All physical filesystems should have their own enum element and all virtual filesystems will go into
/// the [`FileSystem::Other`] element. /// the [`FileSystem::Other`] element.
@ -82,7 +83,8 @@ impl FileSystem {
} }
#[allow(dead_code)] #[allow(dead_code)]
/// Returns a string identifying this filesystem. #[inline]
/// Returns a string literal identifying this filesystem.
pub fn as_str(&self) -> &str { pub fn as_str(&self) -> &str {
match self { match self {
FileSystem::Ext2 => "ext2", FileSystem::Ext2 => "ext2",
@ -112,30 +114,70 @@ impl FileSystem {
impl FromStr for FileSystem { impl FromStr for FileSystem {
type Err = anyhow::Error; type Err = anyhow::Error;
#[inline]
fn from_str(s: &str) -> anyhow::Result<Self> { fn from_str(s: &str) -> anyhow::Result<Self> {
match () { // Done like this as `eq_ignore_ascii_case` avoids a string allocation.
_ if s.eq_ignore_ascii_case("ext2") => Ok(FileSystem::Ext2), Ok(if s.eq_ignore_ascii_case("ext2") {
_ if s.eq_ignore_ascii_case("ext3") => Ok(FileSystem::Ext3), FileSystem::Ext2
_ if s.eq_ignore_ascii_case("ext4") => Ok(FileSystem::Ext4), } else if s.eq_ignore_ascii_case("ext3") {
_ if s.eq_ignore_ascii_case("msdos") || s.eq_ignore_ascii_case("vfat") => { FileSystem::Ext3
Ok(FileSystem::VFat) } else if s.eq_ignore_ascii_case("ext4") {
} FileSystem::Ext4
_ if s == "ntfs3" || s.eq_ignore_ascii_case("ntfs") => Ok(FileSystem::Ntfs), } else if s.eq_ignore_ascii_case("msdos") || s.eq_ignore_ascii_case("vfat") {
_ if s.eq_ignore_ascii_case("zfs") => Ok(FileSystem::Zfs), FileSystem::VFat
_ if s.eq_ignore_ascii_case("hfs") => Ok(FileSystem::Hfs), } else if s.eq_ignore_ascii_case("ntfs3") || s.eq_ignore_ascii_case("ntfs") {
_ if s.eq_ignore_ascii_case("reiserfs") => Ok(FileSystem::Reiser3), FileSystem::Ntfs
_ if s.eq_ignore_ascii_case("reiser4") => Ok(FileSystem::Reiser4), } else if s.eq_ignore_ascii_case("zfs") {
_ if s.eq_ignore_ascii_case("exfat") => Ok(FileSystem::ExFat), FileSystem::Zfs
_ if s.eq_ignore_ascii_case("f2fs") => Ok(FileSystem::F2fs), } else if s.eq_ignore_ascii_case("hfs") {
_ if s.eq_ignore_ascii_case("hfsplus") => Ok(FileSystem::HfsPlus), FileSystem::Hfs
_ if s.eq_ignore_ascii_case("jfs") => Ok(FileSystem::Jfs), } else if s.eq_ignore_ascii_case("reiserfs") {
_ if s.eq_ignore_ascii_case("btrfs") => Ok(FileSystem::Btrfs), FileSystem::Reiser3
_ if s.eq_ignore_ascii_case("minix") => Ok(FileSystem::Minix), } else if s.eq_ignore_ascii_case("reiser4") {
_ if s.eq_ignore_ascii_case("nilfs") => Ok(FileSystem::Nilfs), FileSystem::Reiser4
_ if s.eq_ignore_ascii_case("xfs") => Ok(FileSystem::Xfs), } else if s.eq_ignore_ascii_case("exfat") {
_ if s.eq_ignore_ascii_case("apfs") => Ok(FileSystem::Apfs), FileSystem::ExFat
_ if s.eq_ignore_ascii_case("fuseblk") => Ok(FileSystem::FuseBlk), } else if s.eq_ignore_ascii_case("f2fs") {
_ => Ok(FileSystem::Other(s.to_string())), 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("minix") {
FileSystem::Minix
} else if s.eq_ignore_ascii_case("nilfs") {
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 super::FileSystem;
use std::str::FromStr;
#[test]
fn file_system_from_str() {
// Something supported
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);
// Something unsupported
assert_eq!(
FileSystem::from_str("this does not exist").unwrap(),
FileSystem::Other("this does not exist".to_owned())
);
}
} }

View File

@ -129,13 +129,6 @@ impl FromStr for Partition {
} }
}; };
// let options = match parts.next() {
// Some(opts) => opts.to_string(),
// None => {
// bail!("missing options");
// }
// };
Ok(Partition { Ok(Partition {
device, device,
mount_point, mount_point,