in starlark/src/values/types/record.rs [318:347]
fn equals(&self, other: Value<'v>) -> anyhow::Result<bool> {
fn eq<'v>(
a: &RecordTypeGen<impl ValueLike<'v>, impl AsARef<Option<String>>>,
b: &RecordTypeGen<impl ValueLike<'v>, impl AsARef<Option<String>>>,
) -> anyhow::Result<bool> {
if AsARef::as_aref(&a.typ) != AsARef::as_aref(&b.typ) {
return Ok(false);
};
if a.fields.len() != b.fields.len() {
return Ok(false);
};
for ((k1, t1), (k2, t2)) in a.fields.iter().zip(b.fields.iter()) {
// We require that the types and defaults are both equal.
if k1 != k2
|| !t1.0.typ.equals(t2.0.typ.to_value())?
|| t1.0.default.map(ValueLike::to_value)
!= t2.0.default.map(ValueLike::to_value)
{
return Ok(false);
}
}
Ok(true)
}
match RecordType::from_value(other) {
Some(Either::Left(other)) => eq(self, &*other),
Some(Either::Right(other)) => eq(self, &*other),
_ => Ok(false),
}
}