use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Side {
Old,
New,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum LineKind {
Context,
Addition,
Deletion,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DiffLine {
pub kind: LineKind,
pub old_line: Option<u32>,
pub new_line: Option<u32>,
pub text: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Hunk {
pub old_start: u32,
pub old_count: u32,
pub new_start: u32,
pub new_count: u32,
pub section: Option<String>,
pub lines: Vec<DiffLine>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DiffFile {
pub old_path: String,
pub new_path: String,
pub hunks: Vec<Hunk>,
pub is_binary: bool,
}
impl DiffFile {
pub fn display_path(&self) -> &str {
if self.new_path != "/dev/null" && !self.new_path.is_empty() {
&self.new_path
} else {
&self.old_path
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Changeset {
pub files: Vec<DiffFile>,
}
impl Changeset {
pub fn is_empty(&self) -> bool {
self.files.is_empty()
}
}