getCache static method

Creates a provider backed by the given DateTimeZoneSource.

Note that the source will never be consulted for requests for the fixed-offset timezones 'UTC' and 'UTC+/-Offset' (a standard implementation will be returned instead). This is true even if these IDs are advertised by the source.

source: The DateTimeZoneSource for this provider. InvalidDateTimeZoneSourceException: source violates its contract.

Implementation

static Future<DateTimeZoneCache> getCache(DateTimeZoneSource source) async {
  Preconditions.checkNotNull(source, 'source');
  var VersionId = await source.versionId;

  if (VersionId == null) {
    throw InvalidDateTimeZoneSourceError('Source-returned version ID was null');
  }

  var providerIds = await source.getIds();
  if (providerIds == null) {
    throw InvalidDateTimeZoneSourceError('Source-returned ID sequence was null');
  }

  var idList = List<String>.from(providerIds);
  // todo: a gentler 'null' okay sorter?
  // idList.sort((a, b) => (a ?? '').compareTo(b ?? '')); // sort(StringComparer.Ordinal);
  idList.sort();
  var ids = List<String>.from(idList);

  var cache = DateTimeZoneCache._(source, ids, VersionId);
  // Populate the dictionary with null values meaning "the ID is valid, we haven't fetched the zone yet".
  for (String id in ids) {
    cache._timeZoneMap[id] = null;
  }
  return cache;
}