const MIN_LINES: usize = 30;
const RUN_MIN: usize = 3;
const MIN_SAVED_LINES: usize = 8;
pub fn compress_output(output: &str) -> Option<String> {
if disabled() {
return None;
}
let lines: Vec<&str> = output.split('\n').collect();
if lines.len() < MIN_LINES {
return None;
}
let mut out: Vec<String> = Vec::with_capacity(lines.len());
let mut saved = 0usize;
let mut i = 0;
while i < lines.len() {
let line = lines[i];
let mut j = i + 1;
while j < lines.len() && lines[j] == line {
j += 1;
}
let run = j - i;
if line.trim().is_empty() {
out.push(String::new());
saved += run - 1;
} else if run >= RUN_MIN {
out.push(format!("{line} [winx: ×{run}]"));
saved += run - 1;
} else {
for keep in &lines[i..j] {
out.push((*keep).to_string());
}
}
i = j;
}
if saved < MIN_SAVED_LINES {
return None;
}
let compressed_count = out.len();
out.push(format!(
"[winx: collapsed {saved} repeated lines ({} → {compressed_count}); \
set WINX_NO_COMPRESS=1 to see raw output]",
lines.len()
));
Some(out.join("\n"))
}
fn disabled() -> bool {
std::env::var("WINX_NO_COMPRESS").is_ok_and(|value| {
let value = value.trim();
!value.is_empty() && value != "0" && !value.eq_ignore_ascii_case("false")
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn short_output_is_left_alone() {
let out = "line\n".repeat(5);
assert!(compress_output(&out).is_none());
}
#[test]
fn collapses_identical_run_but_keeps_count() -> Result<(), String> {
let mut text = String::from("start\n");
for _ in 0..50 {
text.push_str("retrying connection...\n");
}
text.push_str("done\n");
let compressed = compress_output(&text).ok_or("should compress")?;
assert!(compressed.contains("retrying connection... [winx: ×50]"));
assert!(compressed.contains("start"));
assert!(compressed.contains("done"));
assert!(compressed.lines().count() < 10);
Ok(())
}
#[test]
fn keeps_distinct_lines_that_only_differ_by_number() {
use std::fmt::Write as _;
let mut text = String::new();
for n in 0..40 {
let _ = writeln!(text, "Test {n} passed");
}
assert!(compress_output(&text).is_none());
}
#[test]
fn disabled_via_env_returns_none() {
let text = "spam\n".repeat(40);
if !disabled() {
assert!(compress_output(&text).is_some());
}
}
}