diffOf method
A payload-only delta between two entity versions — the schema-driven
implementation of DatumEntity.diff, mirroring datum_generator's
datumDiff: core sync fields are excluded from the comparison, and
when anything changed the new modifiedAt/version are stamped in.
Returns null when nothing changed. Requires getters on every field.
@override
Map<String, dynamic>? diff(covariant DatumEntityInterface oldVersion) =>
taskSchema.diffOf(oldVersion as Task, this);
Implementation
Map<String, dynamic>? diffOf(E oldVersion, E newVersion) {
const deepEquals = DeepCollectionEquality();
final delta = <String, dynamic>{};
for (final field in fields) {
if (field.coreRole != null) continue;
final encoded = field as DatumFieldSpec<E, Object?>;
final before = encoded.encode(_valueOf(field, oldVersion));
final after = encoded.encode(_valueOf(field, newVersion));
if (!deepEquals.equals(before, after)) delta[field.name] = after;
}
if (delta.isEmpty) return null;
for (final field in fields) {
if (field.coreRole == DatumCoreRole.modifiedAt || field.coreRole == DatumCoreRole.version) {
delta[field.name] = (field as DatumFieldSpec<E, Object?>).encode(_valueOf(field, newVersion));
}
}
return delta;
}