pub const DIFF_REMOVED_MARKER: &str = " - ";
pub const DIFF_ADDED_MARKER: &str = " + ";
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DiffLineKind {
Context,
Removed,
Added,
}
pub fn parse_diff_line(line: &str) -> DiffLineKind {
let trimmed = line.trim_start();
let after_num = trimmed.trim_start_matches(|c: char| c.is_ascii_digit());
if after_num.starts_with(DIFF_REMOVED_MARKER) {
DiffLineKind::Removed
} else if after_num.starts_with(DIFF_ADDED_MARKER) {
DiffLineKind::Added
} else {
DiffLineKind::Context
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_added_line() {
let line = format!(" 5{}fn main() {{", DIFF_ADDED_MARKER);
assert_eq!(parse_diff_line(&line), DiffLineKind::Added);
}
#[test]
fn parses_removed_line() {
let line = format!(" 12{}old = true;", DIFF_REMOVED_MARKER);
assert_eq!(parse_diff_line(&line), DiffLineKind::Removed);
}
#[test]
fn parses_context_line() {
let line = " 7 existing line";
assert_eq!(parse_diff_line(line), DiffLineKind::Context);
}
#[test]
fn malformed_falls_through_to_context() {
assert_eq!(parse_diff_line("no number at start"), DiffLineKind::Context);
assert_eq!(parse_diff_line(""), DiffLineKind::Context);
}
}