use std::collections::HashMap;
use url::form_urlencoded;
/// Parses and decodes a complete URL query string into a HashMap.
/// Handles multi-value parameters by grouping them into a vector.
fn parse_and_decode_query(query_string: &str) -> HashMap<String, Vec<String>> {
// Remove leading '?' if present
let clean_query = query_string.strip_prefix('?').unwrap_or(query_string);
let mut result: HashMap<String, Vec<String>> = HashMap::new();
// form_urlencoded::parse parses and decodes keys and values automatically
for (key, value) in form_urlencoded::parse(clean_query.as_bytes()) {
result.entry(key.into_owned())
.or_default()
.push(value.into_owned());
}
result
}
fn main() {
let full_query = "search=rust+tutorial&category=programming&tag=beginner&tag=async";
println!("--- Full Query String Parsing ---");
println!("Original Query: {}", full_query);
let decoded_map = parse_and_decode_query(full_query);
println!("Decoded Map Result:");
for (key, values) in &decoded_map {
println!(" {} -> {:?}", key, values);
}
}
/*
run:
--- Full Query String Parsing ---
Original Query: search=rust+tutorial&category=programming&tag=beginner&tag=async
Decoded Map Result:
tag -> ["beginner", "async"]
search -> ["rust tutorial"]
category -> ["programming"]
*/