diffOf method

Map<String, dynamic>? diffOf(
  1. E oldVersion,
  2. E newVersion
)

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;
}