fromJson static method

ScenarioComparison fromJson(
  1. Map<String, Object?> json
)

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>(),
        ),
    ],
  );
}