discogs_api/client/
params.rs

1pub enum Params<'a> {
2    Compiled(String),
3    Pairs(Vec<(&'a str, &'a str)>),
4}
5
6impl<'a> Params<'a> {
7    #[must_use]
8    pub fn build(self) -> String {
9        self.into()
10    }
11}
12
13impl From<Params<'_>> for String {
14    fn from(value: Params) -> String {
15        match value {
16            Params::Compiled(compiled) => compiled,
17            Params::Pairs(pairs) => build_params(&pairs),
18        }
19    }
20}
21
22pub(crate) fn build_params(params: &[(&str, &str)]) -> String {
23    if params.is_empty() {
24        return String::new();
25    }
26
27    let len = params
28        .iter()
29        .fold(0, |acc, p| acc + 2 + p.0.len() + p.1.len());
30    let mut out = String::with_capacity(len);
31
32    let mut params_iter = params.iter();
33    let param = params_iter.next().unwrap(); // fine to unwrap because already checked for empty
34    out.push('?');
35    out.push_str(param.0);
36    out.push('=');
37    out.push_str(param.1);
38
39    for param in params_iter {
40        out.push('&');
41        out.push_str(param.0);
42        out.push('=');
43        out.push_str(param.1);
44    }
45
46    out
47}
48
49#[cfg(test)]
50mod tests {
51    use super::*;
52
53    #[test]
54    fn test_build_params_raw() {
55        let pairs = [("master_id", "3175560"), ("page", "1"), ("per_page", "25")];
56        let built = build_params(&pairs);
57        assert_eq!(&built, "?master_id=3175560&page=1&per_page=25");
58    }
59
60    #[test]
61    fn test_build_params() {
62        let params =
63            Params::Pairs([("master_id", "3175560"), ("page", "1"), ("per_page", "25")].to_vec());
64        let built = params.build();
65        assert_eq!(&built, "?master_id=3175560&page=1&per_page=25");
66    }
67}