flattenMapKeys function
Flattens a nested Map structure into a single-level Map using the provided delimiter.
Only flattens nested Maps (non-Map values become leaves). Arrays/lists are left as-is.
Implementation
IValidator flattenMapKeys(String delimiter, IValidator child, {String? message}) {
Map<String, dynamic> walk(Map<String, dynamic> flat, dynamic node, String prefix) {
if (node is Map) {
node.forEach((k, val) {
final newPrefix = prefix.isEmpty ? '$k' : '$prefix$delimiter$k';
if (val is Map) {
walk(flat, val, newPrefix);
} else {
flat[newPrefix] = val;
}
});
} else {
if (prefix.isNotEmpty) flat[prefix] = node;
}
return flat;
}
Map<String, dynamic>? transform(value) {
if (value is! Map) return null;
return walk({}, value, '');
}
return core.pivotValue(
transform,
child: child,
errorMessage: message ?? 'a Map flattable by keys',
);
}