use crate::ui::theme::{ThemeEntry, ThemeMap};
use std::io::Write;
use anyhow::Result;
use diffy::{create_patch, Line};
use crate::ui::output_format::get_styled_text;
pub fn print_diff<W: Write>(
original_content: &str,
sanitized_content: &str,
writer: &mut W,
theme_map: &ThemeMap,
enable_colors: bool,
) -> Result<()> {
let diff_header = get_styled_text("\n--- Diff View ---", ThemeEntry::DiffHeader, theme_map, enable_colors);
writeln!(writer, "{}", diff_header)?;
let patch = create_patch(original_content, sanitized_content);
for hunk in patch.hunks() {
for line_change in hunk.lines() {
let content_str = match line_change {
Line::Delete(s) => s,
Line::Insert(s) => s,
Line::Context(s) => s,
};
let s_with_actual_newlines = content_str.replace("\\n", "\n");
for segment in s_with_actual_newlines.lines() {
match line_change {
Line::Delete(_) => {
let styled_line = get_styled_text(
&format!("-{}", segment),
ThemeEntry::DiffRemoved,
theme_map,
enable_colors,
);
writeln!(writer, "{}", styled_line)?;
}
Line::Insert(_) => {
let styled_line = get_styled_text(
&format!("+{}", segment),
ThemeEntry::DiffAdded,
theme_map,
enable_colors,
);
writeln!(writer, "{}", styled_line)?;
}
Line::Context(_) => {
writeln!(writer, " {}", segment)?;
}
}
}
}
}
let diff_footer = get_styled_text("-----------------", ThemeEntry::DiffHeader, theme_map, enable_colors);
writeln!(writer, "{}", diff_footer)?;
Ok(())
}