parseSkinContract function

SkinContract parseSkinContract(
  1. Map<String, dynamic> json
)

Parses decoded contract JSON into a SkinContract.

Implementation

SkinContract parseSkinContract(Map<String, dynamic> json) {
  final version = json['schemaVersion'];
  if (version is! String) {
    throw SkinContractParseException(
      'skin contract: schemaVersion: missing (required string)',
    );
  }
  if (version != SkinContract.schemaVersionV1) {
    throw SkinContractParseException(
      'skin contract: schemaVersion: '
      'unsupported version "$version" '
      '(expected "${SkinContract.schemaVersionV1}")',
    );
  }
  final unknown = json.keys
      .where(
        (k) => k != 'schemaVersion' && !SkinContract.sections.containsKey(k),
      )
      .toList();
  if (unknown.isNotEmpty) {
    throw SkinContractParseException(
      'skin contract: unknown field(s) '
      '${unknown.map((k) => '"$k"').join(', ')}',
    );
  }

  return SkinContract(
    schemaVersion: version,
    routes: [
      for (final row in _rows(json, 'routes'))
        ContractRoute(
          path: _string(row, 'path', 'routes', fields: ContractRoute.fields),
          view: _string(row, 'view', 'routes', fields: ContractRoute.fields),
        ),
    ],
    states: [
      for (final row in _rows(json, 'states'))
        ContractState(
          view: _string(row, 'view', 'states'),
          loading: _bool(row, 'loading', 'states'),
          error: _enum(row, 'error', 'states', ContractState.fields),
          empty: _bool(row, 'empty', 'states'),
        ),
    ],
    platformRows: [
      for (final row in _rows(json, 'platformRows'))
        ContractPlatformRow(
          view: _string(row, 'view', 'platformRows'),
          mobile: _bool(row, 'mobile', 'platformRows'),
          ios: _bool(row, 'ios', 'platformRows'),
          android: _bool(row, 'android', 'platformRows'),
          macos: _bool(row, 'macos', 'platformRows'),
        ),
    ],
    stateRows: [
      for (final row in _rows(json, 'stateRows'))
        ContractStateRow(
          view: _string(row, 'view', 'stateRows'),
          row: _string(row, 'row', 'stateRows'),
          kind: _enum(row, 'kind', 'stateRows', ContractStateRow.fields),
        ),
    ],
  );
}