use crate::config::RedactionSummaryItem;
use crate::ui::theme::{ThemeEntry, ThemeStyle};
use owo_colors::OwoColorize;
use std::collections::HashMap;
use std::io::Write;
use diffy::{create_patch, Line};
pub fn print_content<W: Write>(writer: &mut W, content: &str) {
let _ = write!(writer, "{}", content);
}
fn get_styled_text(
text: &str,
entry: ThemeEntry,
theme_map: &HashMap<ThemeEntry, ThemeStyle>,
) -> String {
if let Some(style) = theme_map.get(&entry) {
if let Some(color) = &style.fg {
return text.color(color.to_ansi_color()).to_string(); }
}
text.color(owo_colors::AnsiColors::White).to_string() }
pub fn print_success_message<W: Write>(
writer: &mut W,
message: &str,
theme_map: &HashMap<ThemeEntry, ThemeStyle>,
) {
let styled_message = get_styled_text(&format!("✅ {}\n", message), ThemeEntry::Success, theme_map);
let _ = write!(writer, "{}", styled_message);
}
pub fn print_info_message<W: Write>(
writer: &mut W,
message: &str,
theme_map: &HashMap<ThemeEntry, ThemeStyle>,
) {
let styled_message = get_styled_text(&format!("{}\n", message), ThemeEntry::Info, theme_map);
let _ = write!(writer, "{}", styled_message);
}
pub fn print_error_message<W: Write>(
writer: &mut W,
message: &str,
theme_map: &HashMap<ThemeEntry, ThemeStyle>,
) {
let styled_message = get_styled_text(&format!("❌ ERROR: {}\n", message), ThemeEntry::Error, theme_map);
let _ = write!(writer, "{}", styled_message);
}
pub fn print_warn_message<W: Write>(
writer: &mut W,
message: &str,
theme_map: &HashMap<ThemeEntry, ThemeStyle>,
) {
let styled_message = get_styled_text(&format!("⚠️ WARNING: {}\n", message), ThemeEntry::Warn, theme_map);
let _ = write!(writer, "{}", styled_message);
}
pub fn print_redaction_summary<W: Write>(
writer: &mut W,
summary: &[RedactionSummaryItem],
theme_map: &HashMap<ThemeEntry, ThemeStyle>,
) {
if summary.is_empty() {
let _ = write!(writer, "\n{}\n", get_styled_text("No redactions applied.", ThemeEntry::Info, theme_map));
return;
}
let header = get_styled_text("\n--- Redaction Summary ---", ThemeEntry::Header, theme_map);
let _ = writeln!(writer, "{}", header);
for item in summary {
let rule_name_styled = get_styled_text(&item.rule_name, ThemeEntry::SummaryRuleName, theme_map);
let occurrences_styled = get_styled_text(
&format!(" ({} occurrences)", item.occurrences),
ThemeEntry::SummaryOccurrences,
theme_map,
);
let _ = writeln!(writer, "{}{}", rule_name_styled, occurrences_styled);
}
let _ = writeln!(writer, "{}\n", get_styled_text("-------------------------", ThemeEntry::Header, theme_map));
}
pub fn print_diff_view<W: Write>(
writer: &mut W,
original_content: &str,
sanitized_content: &str,
theme_map: &HashMap<ThemeEntry, ThemeStyle>,
) {
let diff_header = get_styled_text("\n--- Diff View ---", ThemeEntry::DiffHeader, theme_map);
let _ = writeln!(writer, "{}", diff_header);
let patch = create_patch(original_content, sanitized_content);
for hunk in patch.hunks() {
for line_change in hunk.lines() { match line_change {
Line::Delete(s) => { let _ = writeln!(writer, "{}{}", "-".red(), s.red());
}
Line::Insert(s) => { let _ = writeln!(writer, "{}{}", "+".green(), s.green());
}
Line::Context(s) => { let _ = writeln!(writer, " {}", s); }
}
}
}
let _ = writeln!(writer, "{}", get_styled_text("-----------------", ThemeEntry::DiffHeader, theme_map));
}