in serde-reflection/src/format.rs [453:497]
fn unify(&mut self, format: ContainerFormat) -> Result<()> {
match (self, format) {
(Self::UnitStruct, Self::UnitStruct) => (),
(Self::NewTypeStruct(format1), Self::NewTypeStruct(format2)) => {
format1.as_mut().unify(*format2)?;
}
(Self::TupleStruct(formats1), Self::TupleStruct(formats2))
if formats1.len() == formats2.len() =>
{
for (format1, format2) in formats1.iter_mut().zip(formats2.into_iter()) {
format1.unify(format2)?;
}
}
(Self::Struct(named_formats1), Self::Struct(named_formats2))
if named_formats1.len() == named_formats2.len() =>
{
for (format1, format2) in named_formats1.iter_mut().zip(named_formats2.into_iter())
{
format1.unify(format2)?;
}
}
(Self::Enum(variants1), Self::Enum(variants2)) => {
for (index2, variant2) in variants2.into_iter() {
match variants1.entry(index2) {
Entry::Vacant(e) => {
// Note that we do not check for name collisions.
e.insert(variant2);
}
Entry::Occupied(mut e) => {
e.get_mut().unify(variant2)?;
}
}
}
}
(format1, format2) => {
return Err(unification_error(format1, format2));
}
}
Ok(())
}