in serde-reflection/src/format.rs [243:297]
fn unify(&mut self, format: VariantFormat) -> Result<()> {
match (self, format) {
(format1, Self::Variable(variable2)) => {
if let Some(format2) = variable2.borrow_mut().deref_mut() {
format1.unify(std::mem::take(format2))?;
}
*variable2.borrow_mut() = Some(format1.clone());
}
(Self::Variable(variable1), format2) => {
let inner_variable = match variable1.borrow_mut().deref_mut() {
value1 @ None => {
*value1 = Some(format2);
None
}
Some(format1) => {
format1.unify(format2)?;
match format1 {
Self::Variable(variable) => Some(variable.clone()),
_ => None,
}
}
};
// Reduce multiple indirections to a single one.
if let Some(variable) = inner_variable {
*variable1 = variable;
}
}
(Self::Unit, Self::Unit) => (),
(Self::NewType(format1), Self::NewType(format2)) => {
format1.as_mut().unify(*format2)?;
}
(Self::Tuple(formats1), Self::Tuple(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)?;
}
}
(format1, format2) => {
return Err(unification_error(format1, format2));
}
}
Ok(())
}