1use std::collections::HashMap;
4
5pub struct PathAndQueryParams {
6 pub path: HashMap<String, String>,
7 pub query: HashMap<String, String>,
8}
9
10pub fn build_path_and_query(pattern: &str, params: &PathAndQueryParams) -> String {
11 let mut path = pattern.to_string();
12
13 let param_regex = regex::Regex::new(r":[a-zA-Z]+").expect("Invalid regex pattern");
14 let params_to_replace: Vec<String> = param_regex
15 .find_iter(pattern)
16 .map(|m| m.as_str()[1..].to_string())
17 .collect();
18
19 for key in params_to_replace {
20 if let Some(value) = params.path.get(&key) {
21 let encoded_value = urlencoding::encode(value);
22 path = path.replace(&format!(":{}", key), &encoded_value);
23 }
24 }
25
26 let query_string: String = params
27 .query
28 .iter()
29 .filter(|(_, value)| !value.is_empty())
30 .map(|(key, value)| format!("{}={}", key, urlencoding::encode(value)))
31 .collect::<Vec<_>>()
32 .join("&");
33
34 if query_string.is_empty() {
35 path
36 } else {
37 format!("{}?{}", path, query_string)
38 }
39}