use std::fmt::Write;
pub trait Colored {
fn yellow(&self) -> String;
}
impl Colored for String {
fn yellow(&self) -> String {
format!("\x1b[33;1m{self}\x1b[0m")
}
}
impl Colored for &str {
fn yellow(&self) -> String {
(*self).to_string().yellow()
}
}
pub(crate) fn mark_differences(original: &str, modified: &str) -> String {
let mut result = String::new();
let original_lines: Vec<&str> = original.lines().collect();
let modified_lines: Vec<&str> = modified.lines().collect();
let max_lines = original_lines.len().max(modified_lines.len());
for i in 0..max_lines {
let original_line = original_lines.get(i).unwrap_or(&"");
let modified_line = modified_lines.get(i).unwrap_or(&"");
if original_line == modified_line {
result.push_str(original_line);
} else {
let _ = write!(result, "{}", original_line.yellow());
}
result.push('\n'); }
result
}
pub(crate) fn hamming_distance(vec1: &[u8], vec2: &[u8]) -> Option<usize> {
if vec1.len() != vec2.len() {
return None; }
let mut distance = 0;
for (byte1, byte2) in vec1.iter().zip(vec2.iter()) {
distance += (byte1 ^ byte2).count_ones() as usize;
}
Some(distance)
}