letMapOrNull<K, V> function
Let's you convert input to a Map type if possible, or returns null if
the conversion cannot be performed.
If filterNulls is true, the returned map will not contain any null keys or
values. If nullFallback is provided, it will be used as a fallback value
for null keys and values.
Implementation
Map<K, V>? letMapOrNull<K, V>(
dynamic input, {
bool filterNulls = false,
dynamic nullFallback,
}) {
dynamic decoded;
try {
if (input is String) {
final trimmed = input.trim();
if (trimmed.isEmpty) return const {};
decoded = const JsonDecoder().convert(trimmed);
} else {
decoded = input;
}
if (decoded is Map) {
final temp = decoded.entries
.map((entry) {
final convertedKey = letOrNull<K>(entry.key);
final convertedValue =
letOrNull<V>(entry.value) ?? letOrNull<V?>(nullFallback);
if (filterNulls) {
if (!isNullable<K>() && convertedKey == null) {
return const _Empty();
}
if (!isNullable<V>() && convertedValue == null) {
return const _Empty();
}
}
return MapEntry(convertedKey as K, convertedValue as V);
})
.where((e) => e != const _Empty())
.map((e) => e as MapEntry<K, V>);
return Map.fromEntries(temp.nonNulls);
}
} catch (_) {}
return null;
}