defaultMapKeyValue function

dynamic defaultMapKeyValue({
  1. required MapTypeInfo mapType,
  2. required Map currentEntries,
  3. List<Enum> keyEnumValues = const <Enum>[],
})

Implementation

dynamic defaultMapKeyValue({
  required MapTypeInfo mapType,
  required Map<dynamic, dynamic> currentEntries,
  List<Enum> keyEnumValues = const <Enum>[],
}) {
  dynamic candidate = defaultValueFromTypeDescriptor(
    descriptor: mapType.keyTypeDescriptor,
    enumValues: keyEnumValues,
  );
  if (identical(candidate, unsupportedTypeDefaultValue)) {
    return unsupportedMapDefaultValue;
  }

  PrimitiveKind? primitiveKind = primitiveKindFromDescriptor(
    mapType.keyTypeDescriptor,
  );
  if (candidate == null && mapType.nullableKey) {
    if (primitiveKind != null) {
      candidate = defaultPrimitiveValue(primitiveKind);
    } else if (keyEnumValues.isNotEmpty) {
      candidate = keyEnumValues.first;
    } else {
      ListTypeInfo? nestedCollection = parseCollectionTypeDescriptor(
        mapType.keyTypeDescriptor,
      );
      if (nestedCollection != null) {
        candidate = materializeCollectionValue(
          nestedCollection,
          const <dynamic>[],
        );
      } else {
        MapTypeInfo? nestedMap = parseMapTypeDescriptor(
          mapType.keyTypeDescriptor,
        );
        if (nestedMap != null) {
          candidate = materializeMapValue(
            nestedMap,
            const <MapEntry<dynamic, dynamic>>[],
          );
        } else {
          $AClass? artifactClass = resolveArtifactTypeFromDescriptor(
            mapType.keyTypeDescriptor,
          );
          if (artifactClass != null) {
            candidate = artifactClass.construct();
          }
        }
      }
    }
  }

  if (primitiveKind == PrimitiveKind.string &&
      (candidate == null ||
          (candidate is String && candidate.trim().isEmpty))) {
    candidate = 'key1';
  }

  bool contains(dynamic key) {
    try {
      return currentEntries.containsKey(key);
    } catch (_) {
      return currentEntries.keys.any((existing) => existing == key);
    }
  }

  if (!contains(candidate)) {
    return candidate;
  }

  if (primitiveKind == PrimitiveKind.string) {
    String seed = candidate is String ? candidate.trim() : '';
    String base = seed.replaceFirst(RegExp(r'\d+$'), '');
    if (base.isEmpty) {
      base = 'key';
    }

    for (int i = 1; i < 100000; i++) {
      String next = '$base$i';
      if (!contains(next)) {
        return next;
      }
    }
    return unsupportedMapDefaultValue;
  }

  if (primitiveKind == PrimitiveKind.intType) {
    int next = candidate is int ? candidate : 0;
    for (int i = 0; i < 100000; i++) {
      if (!contains(next)) {
        return next;
      }
      next++;
    }
    return unsupportedMapDefaultValue;
  }

  if (primitiveKind == PrimitiveKind.doubleType) {
    double next = candidate is double ? candidate : 0.0;
    for (int i = 0; i < 100000; i++) {
      if (!contains(next)) {
        return next;
      }
      next += 1.0;
    }
    return unsupportedMapDefaultValue;
  }

  if (primitiveKind == PrimitiveKind.boolType) {
    if (!contains(false)) {
      return false;
    }
    if (!contains(true)) {
      return true;
    }
    return unsupportedMapDefaultValue;
  }

  if (primitiveKind == PrimitiveKind.dateTime) {
    DateTime next = candidate is DateTime ? candidate : DateTime.now();
    for (int i = 0; i < 100000; i++) {
      if (!contains(next)) {
        return next;
      }
      next = next.add(const Duration(milliseconds: 1));
    }
    return unsupportedMapDefaultValue;
  }

  if (keyEnumValues.isNotEmpty) {
    for (Enum option in keyEnumValues) {
      if (!contains(option)) {
        return option;
      }
    }
  }

  for (int i = 0; i < 16; i++) {
    dynamic generated = defaultValueFromTypeDescriptor(
      descriptor: mapType.keyTypeDescriptor,
      enumValues: keyEnumValues,
    );
    if (!identical(generated, unsupportedTypeDefaultValue) &&
        !contains(generated)) {
      return generated;
    }
  }

  return unsupportedMapDefaultValue;
}