use std::ops::Range;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct HunkId(pub u64);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Decision {
#[default]
Pending,
Accepted,
Rejected,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HunkKind {
Replace,
Insert,
Delete,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InlineSpan {
pub side: InlineSide,
pub line_in_hunk: usize,
pub chars: Range<usize>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum InlineSide {
Old,
New,
}
#[derive(Debug, Clone)]
pub struct Hunk {
pub id: HunkId,
pub old_lines: Range<usize>,
pub new_lines: Range<usize>,
pub inline: Vec<InlineSpan>,
pub kind: HunkKind,
}
impl Hunk {
pub(crate) fn classify(old_lines: &Range<usize>, new_lines: &Range<usize>) -> HunkKind {
let old_empty = old_lines.start == old_lines.end;
let new_empty = new_lines.start == new_lines.end;
match (old_empty, new_empty) {
(true, false) => HunkKind::Insert,
(false, true) => HunkKind::Delete,
(false, false) | (true, true) => HunkKind::Replace,
}
}
}