use std::collections::{hash_map::Entry, HashMap};
use crate::webserver::single_or_vec::SingleOrVec;
pub type ParamMap = HashMap<String, SingleOrVec>;
pub type SetVariablesMap = HashMap<String, Option<SingleOrVec>>;
pub fn param_map<PAIRS: IntoIterator<Item = (String, String)>>(values: PAIRS) -> ParamMap {
values
.into_iter()
.fold(HashMap::new(), |mut map, (mut k, v)| {
let entry = if k.ends_with("[]") {
k.replace_range(k.len() - 2.., "");
SingleOrVec::Vec(vec![v])
} else {
SingleOrVec::Single(v)
};
match map.entry(k) {
Entry::Occupied(mut s) => {
SingleOrVec::merge(s.get_mut(), entry);
}
Entry::Vacant(v) => {
v.insert(entry);
}
}
map
})
}