git/
file_mode.rs

1/// Represents the mode of a file
2#[derive(Debug, Copy, Clone, PartialEq, Eq)]
3#[allow(clippy::exhaustive_enums)]
4pub enum FileMode {
5	/// A normal type of file
6	Normal,
7	/// A file that is executable
8	Executable,
9	/// A file that is a link
10	Link,
11	/// Any other file types
12	Other,
13}
14
15impl FileMode {
16	pub(crate) const fn from(file_mode: git2::FileMode) -> Self {
17		match file_mode {
18			git2::FileMode::Commit | git2::FileMode::Tree | git2::FileMode::Unreadable => Self::Other,
19			git2::FileMode::Blob => Self::Normal,
20			git2::FileMode::BlobExecutable => Self::Executable,
21			git2::FileMode::Link => Self::Link,
22		}
23	}
24}
25
26#[cfg(test)]
27mod tests {
28	use rstest::rstest;
29
30	use super::*;
31
32	#[rstest]
33	#[case::commit(git2::FileMode::Commit, FileMode::Other)]
34	#[case::commit(git2::FileMode::Tree, FileMode::Other)]
35	#[case::commit(git2::FileMode::Unreadable, FileMode::Other)]
36	#[case::commit(git2::FileMode::Blob, FileMode::Normal)]
37	#[case::commit(git2::FileMode::BlobExecutable, FileMode::Executable)]
38	#[case::commit(git2::FileMode::Link, FileMode::Link)]
39	fn from(#[case] git2_file_mode: git2::FileMode, #[case] expected_file_mode: FileMode) {
40		assert_eq!(FileMode::from(git2_file_mode), expected_file_mode);
41	}
42}