git/
origin.rs

1#[derive(Debug, Copy, Clone, PartialEq, Eq)]
2#[allow(clippy::exhaustive_enums)]
3/// The origin of a diff line
4pub enum Origin {
5	/// A diff line that has been added
6	Addition,
7	/// A binary file line
8	Binary,
9	/// A diff line that provides context
10	Context,
11	/// A diff line that has been deleted
12	Deletion,
13	/// Diff line header content
14	Header,
15}
16
17impl From<git2::DiffLineType> for Origin {
18	#[inline]
19	fn from(diff_line_type: git2::DiffLineType) -> Self {
20		match diff_line_type {
21			git2::DiffLineType::Context | git2::DiffLineType::ContextEOFNL => Self::Context,
22			git2::DiffLineType::Addition | git2::DiffLineType::AddEOFNL => Self::Addition,
23			git2::DiffLineType::Deletion | git2::DiffLineType::DeleteEOFNL => Self::Deletion,
24			git2::DiffLineType::FileHeader | git2::DiffLineType::HunkHeader => Self::Header,
25			git2::DiffLineType::Binary => Self::Binary,
26		}
27	}
28}
29
30#[cfg(test)]
31mod tests {
32	use rstest::rstest;
33
34	use super::*;
35
36	#[rstest]
37	#[case::context(git2::DiffLineType::Context, Origin::Context)]
38	#[case::context_eof(git2::DiffLineType::ContextEOFNL, Origin::Context)]
39	#[case::addition(git2::DiffLineType::Addition, Origin::Addition)]
40	#[case::addition_eof(git2::DiffLineType::AddEOFNL, Origin::Addition)]
41	#[case::deletion(git2::DiffLineType::Deletion, Origin::Deletion)]
42	#[case::deletion_eof(git2::DiffLineType::DeleteEOFNL, Origin::Deletion)]
43	#[case::file_header(git2::DiffLineType::FileHeader, Origin::Header)]
44	#[case::hunk_header(git2::DiffLineType::HunkHeader, Origin::Header)]
45	#[case::binary(git2::DiffLineType::Binary, Origin::Binary)]
46	fn from_char(#[case] input: git2::DiffLineType, #[case] expected: Origin) {
47		assert_eq!(Origin::from(input), expected);
48	}
49}