decodeScene function

Scene decodeScene(
  1. Map<String, dynamic> json
)

Decodes a Scene from a JSON map (already parsed).

Only schemaVersion = 2 is accepted.

Throws SceneJsonFormatException when validation fails.

Implementation

Scene decodeScene(Map<String, dynamic> json) {
  final version = _requireInt(json, 'schemaVersion');
  if (!schemaVersionsRead.contains(version)) {
    throw SceneJsonFormatException(
      'Unsupported schemaVersion: $version. Expected one of: '
      '${schemaVersionsRead.toList()}.',
    );
  }

  final cameraJson = _requireMap(json, 'camera');
  final camera = Camera(
    offset: Offset(
      _requireDouble(cameraJson, 'offsetX'),
      _requireDouble(cameraJson, 'offsetY'),
    ),
  );

  final backgroundJson = _requireMap(json, 'background');
  final gridJson = _requireMap(backgroundJson, 'grid');
  final background = Background(
    color: _parseColor(_requireString(backgroundJson, 'color')),
    grid: GridSettings(
      isEnabled: _requireBool(gridJson, 'enabled'),
      cellSize: _requireDouble(gridJson, 'cellSize'),
      color: _parseColor(_requireString(gridJson, 'color')),
    ),
  );

  final paletteJson = _requireMap(json, 'palette');
  final palette = ScenePalette(
    penColors: _requireList(paletteJson, 'penColors')
        .map((value) => _parseColor(_requireStringValue(value, 'penColors')))
        .toList(),
    backgroundColors: _requireList(paletteJson, 'backgroundColors')
        .map(
          (value) =>
              _parseColor(_requireStringValue(value, 'backgroundColors')),
        )
        .toList(),
    gridSizes: _requireList(
      paletteJson,
      'gridSizes',
    ).map((value) => _requireDoubleValue(value, 'gridSizes')).toList(),
  );

  final layersJson = _requireList(json, 'layers');
  final layers = layersJson.map((layerJson) {
    if (layerJson is! Map<String, dynamic>) {
      throw SceneJsonFormatException('Layer must be an object.');
    }
    return _decodeLayer(layerJson);
  }).toList();

  return Scene(
    layers: layers,
    camera: camera,
    background: background,
    palette: palette,
  );
}