diff --git a/src/diff.rs b/src/diff.rs index dd4d612..991664b 100644 --- a/src/diff.rs +++ b/src/diff.rs @@ -1,7 +1,4 @@ -use std::{ - fmt, - io, -}; +use std::fmt; use rustc_hash::{ FxBuildHasher, @@ -14,6 +11,8 @@ use crate::{ Version, }; +const HEADER_STYLE: yansi::Style = yansi::Style::new().bold().underline(); + #[derive(Default)] struct Diff { old: T, @@ -42,10 +41,10 @@ impl fmt::Display for DiffStatus { } pub fn diff<'a>( - writer: &mut dyn io::Write, + writer: &mut dyn fmt::Write, paths_old: impl Iterator, paths_new: impl Iterator, -) -> io::Result<()> { +) -> fmt::Result { let mut paths = FxHashMap::<&str, Diff>>>::with_hasher(FxBuildHasher); @@ -92,7 +91,16 @@ pub fn diff<'a>( a_status.cmp(&b_status).then_with(|| a_name.cmp(b_name)) }); + let mut last_status = None::; + for (name, _versions, status) in diffs { + if last_status != Some(status) { + last_status = Some(status); + HEADER_STYLE.fmt_prefix(writer)?; + writeln!(writer, "{status:?} packages:")?; + HEADER_STYLE.fmt_suffix(writer)?; + } + write!(writer, "{status} {name}")?; writeln!(writer)?; } diff --git a/src/main.rs b/src/main.rs index c573d1b..241dbaa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,8 @@ use std::{ - fmt::Write as _, + fmt::{ + self, + Write as _, + }, io::{ self, Write as _, @@ -21,6 +24,14 @@ use dix::{ }; use yansi::Paint as _; +struct WriteFmt(W); + +impl fmt::Write for WriteFmt { + fn write_str(&mut self, string: &str) -> fmt::Result { + self.0.write_all(string.as_bytes()).map_err(|_| fmt::Error) + } +} + #[derive(clap::Parser, Debug)] #[command(version, about)] struct Cli { @@ -92,7 +103,7 @@ fn real_main() -> Result<()> { drop(connection); - let mut out = io::stdout(); + let mut out = WriteFmt(io::stdout()); #[expect(clippy::pattern_type_mismatch)] diff(