flattenMapKeys function

IValidator flattenMapKeys(
  1. String delimiter,
  2. IValidator child, {
  3. String? message,
})

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',
  );
}