discogs_api/client/
params.rs1pub 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(); 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}