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