inferEnumValuesForField<M> function
List<Enum>
inferEnumValuesForField<
M>({ - required ArtifactAccessor accessor,
- required M instance,
- required ArtifactFieldMirror field,
- bool collectionElement = false,
- 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,
);
}