dfns_sdk_rs/utils/
url.rs

1// @dfns-sdk-rs/src/utils/url.rs
2
3use 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}