use std::collections::HashMap;
pub fn build_query_string(q: &HashMap<String, String>) -> String {
if q.is_empty() {
return String::new();
}
format!("?{}", q.iter().map(|(k, v)| format!("{k}={v}")).collect::<Vec<_>>().join("&"))
}
pub fn error_chain_fmt(
e: &impl std::error::Error,
f: &mut std::fmt::Formatter<'_>
) -> std::fmt::Result {
writeln!(f, "{}\n", e)?;
let mut current = e.source();
while let Some(cause) = current {
writeln!(f, "Caused by:\n\t{}", cause)?;
current = cause.source();
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::testing::must::*;
#[test]
fn build_query_string_empty_returns_empty() {
let q = HashMap::new();
must_eq(build_query_string(&q).as_str(), "");
}
#[test]
fn build_query_string_single_param() {
let mut q = HashMap::new();
q.insert("sys_client".to_string(), "5".to_string());
let result = build_query_string(&q);
must_eq(result.as_str(), "?sys_client=5");
}
#[test]
fn build_query_string_multiple_params() {
let mut q = HashMap::new();
q.insert("a".to_string(), "1".to_string());
q.insert("b".to_string(), "2".to_string());
let result = build_query_string(&q);
must_be_true(result.starts_with('?'));
must_be_true(result.contains("a=1"));
must_be_true(result.contains("b=2"));
}
}