subdivideLayersPerSource function

List<MapLayer> subdivideLayersPerSource({
  1. required List<MapLayer> rawLayers,
})

subdivideLayersPerSource takes a list of MapLayer and returns a list of MapLayer where each layer has only one source.

Implementation

List<MapLayer> subdivideLayersPerSource({required List<MapLayer> rawLayers}) {
  List<MapLayer> layers = [];

  for (MapLayer layer in rawLayers) {
    if (![MapSource.google, MapSource.mapbox, MapSource.here].contains(layer.source)) {
      layers.add(layer);
      continue;
    }

    if (layer.source == MapSource.google) {
      if (layer.googleToken == null) {
        continue;
      }

      if (layer.googleToken!.isEmpty) {
        continue;
      }

      final googleLayers = layer.googleLayers ?? [];
      if (googleLayers.isEmpty) {
        continue;
      }

      for (int i = 0; i < googleLayers.length; i++) {
        GoogleMapLayer googleLayer = googleLayers[i];
        layers.add(
          MapLayer(
            id: '${layer.id}_$googleLayer',
            name: '${googleLayer.description} (${layer.name})',
            source: layer.source,
            googleToken: layer.googleToken,
            googleLayers: [googleLayer],
          ),
        );
      }

      continue;
    }

    if (layer.source == MapSource.mapbox) {
      if (layer.mapboxToken == null) {
        continue;
      }

      if (layer.mapboxToken!.isEmpty) {
        continue;
      }

      final mapboxLayers = layer.mapboxLayers ?? [];
      if (mapboxLayers.isEmpty) {
        continue;
      }

      for (int i = 0; i < mapboxLayers.length; i++) {
        MapboxStyle mapboxLayer = mapboxLayers[i];
        layers.add(
          MapLayer(
            id: '${layer.id}_$mapboxLayer',
            name: '${mapboxLayer.description} (${layer.name})',
            source: layer.source,
            mapboxToken: layer.mapboxToken,
            mapboxLayers: [mapboxLayer],
          ),
        );
      }

      continue;
    }

    if (layer.source == MapSource.here) {
      if (layer.hereToken == null) {
        continue;
      }

      if (layer.hereToken!.isEmpty) {
        continue;
      }

      final hereLayers = layer.hereLayers ?? [];
      if (hereLayers.isEmpty) {
        continue;
      }

      for (int i = 0; i < hereLayers.length; i++) {
        HereStyle hereLayer = hereLayers[i];
        layers.add(
          MapLayer(
            id: '${layer.id}_$hereLayer',
            name: '${hereLayer.description} (${layer.name})',
            source: layer.source,
            hereToken: layer.hereToken,
            hereLayers: [hereLayer],
          ),
        );
      }

      continue;
    }
  }

  return layers;
}