#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub enum SessionDiffState {
#[default]
Unknown,
Empty,
Present,
}
#[derive(Clone, PartialEq, Eq, Debug, Default)]
pub struct SessionStats {
pub added_lines: u64,
pub deleted_lines: u64,
pub diff_state: SessionDiffState,
pub input_tokens: u64,
pub output_tokens: u64,
}
impl SessionStats {
pub fn should_show_diff(&self) -> bool {
self.diff_state != SessionDiffState::Empty
}
pub fn line_change_counts(diff: &str) -> (u64, u64) {
diff.lines()
.fold((0_u64, 0_u64), |(added_lines, deleted_lines), line| {
if line.starts_with('+') && !line.starts_with("+++") {
return (added_lines.saturating_add(1), deleted_lines);
}
if line.starts_with('-') && !line.starts_with("---") {
return (added_lines, deleted_lines.saturating_add(1));
}
(added_lines, deleted_lines)
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn should_show_diff_hides_only_known_empty_diffs() {
let unknown = SessionStats::default();
let empty = SessionStats {
diff_state: SessionDiffState::Empty,
..SessionStats::default()
};
let present = SessionStats {
diff_state: SessionDiffState::Present,
..SessionStats::default()
};
assert!(unknown.should_show_diff());
assert!(!empty.should_show_diff());
assert!(present.should_show_diff());
}
}