use std::ops::Range;
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub enum BinaryMode {
#[default]
Auto,
Text,
Binary,
}
#[derive(Debug, Eq, PartialEq)]
pub enum ContentDiff<'a> {
Unchanged,
Binary {
old: &'a [u8],
new: &'a [u8],
},
Text(TextDiff<'a>),
}
#[derive(Debug, Eq, PartialEq)]
pub struct TextDiff<'a> {
pub(super) old: &'a [u8],
pub(super) new: &'a [u8],
pub(super) edits: Vec<ContentEdit>,
}
impl<'a> TextDiff<'a> {
pub fn old_bytes(&self) -> &'a [u8] {
self.old
}
pub fn new_bytes(&self) -> &'a [u8] {
self.new
}
pub fn edits(&self) -> &[ContentEdit] {
&self.edits
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ContentEdit {
pub old_lines: Range<usize>,
pub new_lines: Range<usize>,
pub old_bytes: Range<usize>,
pub new_bytes: Range<usize>,
}
#[derive(Clone, Copy, Debug)]
pub struct DiffLimits {
pub max_input_bytes: usize,
pub max_lines: usize,
pub max_trace: usize,
pub max_work: usize,
}
impl Default for DiffLimits {
fn default() -> Self {
Self {
max_input_bytes: 64 * 1024 * 1024,
max_lines: 1_000_000,
max_trace: 1_000_000,
max_work: 64 * 1024 * 1024,
}
}
}
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum DiffError {
#[error("content diff limit exceeded: {0}")]
Limit(&'static str),
#[error("content diff cancelled")]
Cancelled,
}