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>,
}
impl Hunk {
#[allow(dead_code)] pub fn line_range(&self, side: Side) -> (u32, u32) {
match side {
Side::Old => (self.old_start, self.old_start + self.old_count.max(1) - 1),
Side::New => (self.new_start, self.new_start + self.new_count.max(1) - 1),
}
}
}
#[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()
}
}