pub enum Params<'a> {
    Compiled(String),
    Pairs(Vec<(&'a str, &'a str)>),
}
impl<'a> Params<'a> {
    #[must_use]
    pub fn build(self) -> String {
        self.into()
    }
}
impl From<Params<'_>> for String {
    fn from(value: Params) -> String {
        match value {
            Params::Compiled(compiled) => compiled,
            Params::Pairs(pairs) => build_params(&pairs),
        }
    }
}
pub(crate) fn build_params(params: &[(&str, &str)]) -> String {
    if params.is_empty() {
        return String::new();
    }
    let len = params
        .iter()
        .fold(0, |acc, p| acc + 2 + p.0.len() + p.1.len());
    let mut out = String::with_capacity(len);
    let mut params_iter = params.iter();
    let param = params_iter.next().unwrap(); out.push('?');
    out.push_str(param.0);
    out.push('=');
    out.push_str(param.1);
    for param in params_iter {
        out.push('&');
        out.push_str(param.0);
        out.push('=');
        out.push_str(param.1);
    }
    out
}
#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_build_params_raw() {
        let pairs = [("master_id", "3175560"), ("page", "1"), ("per_page", "25")];
        let built = build_params(&pairs);
        assert_eq!(&built, "?master_id=3175560&page=1&per_page=25");
    }
    #[test]
    fn test_build_params() {
        let params =
            Params::Pairs([("master_id", "3175560"), ("page", "1"), ("per_page", "25")].to_vec());
        let built = params.build();
        assert_eq!(&built, "?master_id=3175560&page=1&per_page=25");
    }
}