sS nicelyFormatJsonDiff(O diff) { new StringBuilderWithIndent buf; nicelyFormatJsonDiff(diff, buf); ret str(buf); } svoid nicelyFormatJsonDiff(O diff, StringBuilderWithIndent buf) { if (diff == null) ret with buf.println("No differences"); if (diff cast JsonDiff.Removed) ret with buf.println("DELETE " + diff.a); if (diff cast JsonDiff.Added) ret with buf.println("ADD " + diff.b); if (diff cast JsonDiff.Different) // also covers DifferentType ret with buf.println(diff.a + " -> " + diff.b); if (diff cast Map) { for (O key, O value : diff) { if (!value instanceof JsonDiff.Different || !key instanceof JsonDiff.GatheredKey) if (key cast JsonDiff.GatheredKey) { buf.println(key.key + "=" + key.value); } else buf.println(key); temp buf.indent(); nicelyFormatJsonDiff(value, buf); } ret; } buf.println(sfu(diff)); // something unknown }