parseQueryString function
Parses a query string (or form body) the way PHP's parse_str fills
Laravel's input: a[]=1&a[]=2 is a list, f[status]=x a map, keys nest
up to maxDepth levels, and a repeated plain key keeps its last value.
Maps whose keys are exactly 0..n-1 become lists, as in Laravel's JSON.
Implementation
Map<String, Object?> parseQueryString(String query, {int maxDepth = 32}) {
final pairs = <(String, Object)>[];
for (final pair in query.split('&')) {
if (pair.isEmpty) {
continue;
}
final equals = pair.indexOf('=');
final String key;
final String value;
try {
key = Uri.decodeQueryComponent(
equals == -1 ? pair : pair.substring(0, equals),
);
value = equals == -1
? ''
: Uri.decodeQueryComponent(pair.substring(equals + 1));
} on ArgumentError {
continue; // Malformed percent-encoding: PHP drops it too.
}
pairs.add((key, value));
}
return buildInput(pairs, maxDepth: maxDepth);
}