#[derive(Debug, Clone, PartialEq, Eq)]
pub enum MapUnitKind {
Review {
diff_text: String,
},
MetadataOnly {
note: String,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MapUnit {
pub file: String,
pub status: String,
pub kind: MapUnitKind,
pub diff_char_count: usize,
pub chunk_index: usize,
pub chunk_total: usize,
pub hunk_oversized: bool,
}
impl MapUnit {
pub fn is_metadata_only(&self) -> bool {
matches!(self.kind, MapUnitKind::MetadataOnly { .. })
}
pub fn diff_text(&self) -> Option<&str> {
match &self.kind {
MapUnitKind::Review { diff_text } => Some(diff_text.as_str()),
MapUnitKind::MetadataOnly { .. } => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
fn review_unit(file: &str, diff: &str) -> MapUnit {
MapUnit {
file: file.to_string(),
status: "modified".to_string(),
kind: MapUnitKind::Review {
diff_text: diff.to_string(),
},
diff_char_count: diff.len(),
chunk_index: 0,
chunk_total: 1,
hunk_oversized: false,
}
}
fn meta_unit(file: &str, note: &str) -> MapUnit {
MapUnit {
file: file.to_string(),
status: "removed".to_string(),
kind: MapUnitKind::MetadataOnly {
note: note.to_string(),
},
diff_char_count: 0,
chunk_index: 0,
chunk_total: 1,
hunk_oversized: false,
}
}
#[test]
fn map_unit_is_metadata_only() {
let r = review_unit("src/lib.rs", "+fn foo() {}");
assert!(
!r.is_metadata_only(),
"review unit must not be metadata-only"
);
let m = meta_unit("src/old.rs", "deleted file");
assert!(m.is_metadata_only(), "metadata unit must be metadata-only");
}
#[test]
fn map_unit_char_count() {
let diff = "+fn bar() { 42 }";
let u = review_unit("src/bar.rs", diff);
assert_eq!(
u.diff_char_count,
diff.len(),
"diff_char_count must match diff length"
);
}
#[test]
fn map_unit_diff_text_accessor() {
let diff = "+fn baz() {}";
let r = review_unit("src/baz.rs", diff);
assert_eq!(r.diff_text(), Some(diff));
let m = meta_unit("src/gone.rs", "binary file");
assert_eq!(m.diff_text(), None);
}
#[test]
fn map_unit_chunk_defaults() {
let u = review_unit("src/f.rs", "+x");
assert_eq!(u.chunk_index, 0);
assert_eq!(u.chunk_total, 1);
assert!(!u.hunk_oversized);
}
}