in guppy-summaries/src/diff.rs [249:306]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
#[derive(Serialize)]
struct Changed<'a> {
// Flatten both fields so that all the details show up in a single map. (This is
// required for TOML.)
#[serde(flatten)]
package: &'a SummaryId,
#[serde(flatten)]
changes: &'a SummaryDiffStatus<'a>,
}
let mut changed: Vec<Changed> = self
.changed
.iter()
.map(|(package, changes)| Changed { package, changes })
.collect();
// The sorting ensures the order added -> modified -> removed.
changed.sort_by_key(|item| changed_sort_key(item.package, item.changes));
let mut state = serializer.serialize_struct("PackageDiff", 2)?;
state.serialize_field("changed", &changed)?;
#[derive(Serialize)]
struct Unchanged<'a> {
// This matches the SummaryId format.
name: &'a str,
version: &'a Version,
#[serde(flatten)]
source: &'a SummarySource,
#[serde(flatten)]
info: &'a PackageInfo,
}
// Trying to print out an empty unchanged can cause a ValueAfterTable issue with the TOML
// output.
if !self.unchanged.is_empty() {
let mut unchanged: Vec<_> = self
.unchanged
.iter()
.flat_map(|(&name, info)| {
info.iter().map(move |(version, source, info)| Unchanged {
name,
version,
source,
info,
})
})
.collect();
// Sort by (name, version, source).
unchanged.sort_by_key(|item| (item.name, item.version, item.source));
state.serialize_field("unchanged", &unchanged)?;
}
state.end()
}