fromJson static method
A scenario read back off index.json — the exported page's side of
toJson.
Implementation
static ScenarioComparison fromJson(Map<String, Object?> json) {
var items = <ComparedItem>[];
var frames = <String, ({FrameRef? base, FrameRef? head})>{};
// Claimed again on the way in: a file written before ids were unique
// repeats them, and a reader that trusts it walks in circles. One that was
// written since comes through unchanged.
var ids = StepIds();
for (var step in json['steps'] as List? ?? const []) {
var map = (step as Map).cast<String, Object?>();
var item = ComparedItem.fromJson({
...map,
'id': ids.claim(map['id'] as String? ?? ''),
});
items.add(item);
var pair = map['frames'] as Map<String, Object?>?;
if (pair != null) {
frames[item.id] = (
base: FrameRef.fromJson(
(pair['base'] as Map?)?.cast<String, Object?>(),
),
head: FrameRef.fromJson(
(pair['head'] as Map?)?.cast<String, Object?>(),
),
);
}
}
var errors = json['errors'] as Map<String, Object?>? ?? const {};
var ms = json['ms'] as Map<String, Object?>? ?? const {};
var baseMs = ms['base'] as int?;
var headMs = ms['head'] as int?;
var baseErrors = [for (var e in errors['base'] as List? ?? const []) '$e'];
var headErrors = [for (var e in errors['head'] as List? ?? const []) '$e'];
if (json['inconclusive'] case String reason) {
return ScenarioComparison.notCompared(
scenario: json['id'] as String? ?? '',
inconclusive: reason,
package: json['package'] as String?,
baseErrors: baseErrors,
headErrors: headErrors,
baseMs: baseMs,
headMs: headMs,
);
}
return ScenarioComparison(
scenario: json['id'] as String? ?? '',
baseErrors: baseErrors,
headErrors: headErrors,
baseMs: baseMs,
headMs: headMs,
state:
ComparedState.values.asNameMap()[json['state']] ??
ComparedState.skipped,
package: json['package'] as String?,
items: items,
frames: frames,
branches: [
for (var branch in json['branches'] as List? ?? const [])
BranchDelta(
label: (branch as Map)['label'] as String? ?? '',
added: branch['state'] == 'added',
steps: branch['steps'] as int? ?? 0,
path: (branch['path'] as List? ?? const []).cast<String>(),
),
],
);
}