inferEnumValuesForField<M> function

List<Enum> inferEnumValuesForField<M>({
  1. required ArtifactAccessor accessor,
  2. required M instance,
  3. required ArtifactFieldMirror field,
  4. bool collectionElement = false,
  5. int maxProbeCount = 64,
})

Implementation

List<Enum> inferEnumValuesForField<M>({
  required ArtifactAccessor accessor,
  required M instance,
  required ArtifactFieldMirror field,
  bool collectionElement = false,
  int maxProbeCount = 64,
}) {
  if (!_shouldProbeEnumValues(
    field: field,
    value: field.value,
    collectionElement: collectionElement,
  )) {
    return const <Enum>[];
  }

  List<Enum> options = <Enum>[];
  Set<String> seen = <String>{};

  Map<String, dynamic> baseMap;
  try {
    baseMap = Map<String, dynamic>.from(
      accessor.artifactToMap(instance as Object),
    );
  } catch (_) {
    return _enumFallbackValues(
      fieldValue: field.value,
      collectionElement: collectionElement,
    );
  }

  for (int i = 0; i < maxProbeCount; i++) {
    Map<String, dynamic> candidate = Map<String, dynamic>.from(baseMap);
    candidate[field.name] = collectionElement ? <dynamic>[i] : i;

    try {
      M mapped = accessor.artifactFromMap<M>(candidate);
      Object? mappedValue = ArtifactFieldMirror(
        field.field,
        mapped as Object,
      ).value;
      Enum? option = _extractEnumOption(
        value: mappedValue,
        collectionElement: collectionElement,
      );
      if (option == null) {
        if (options.isNotEmpty) {
          break;
        }
        continue;
      }

      String key = '${option.runtimeType}:${option.name}';
      if (seen.add(key)) {
        options.add(option);
      }
    } catch (_) {
      if (options.isNotEmpty) {
        break;
      }
    }
  }

  if (options.isNotEmpty) {
    return options;
  }

  return _enumFallbackValues(
    fieldValue: field.value,
    collectionElement: collectionElement,
  );
}