1fn to_url_with_query<K, V>(
2 u: &str,
3 query: std::collections::HashMap<K, V>,
4) -> crate::Result<url::Url>
5where
6 K: Into<String> + AsRef<str> + Ord,
7 V: Into<String> + AsRef<str>,
8{
9 let mut params: Vec<(_, _)> = query.iter().collect();
10 params.sort_by(|(a, _), (b, _)| a.cmp(b));
11
12 url::Url::parse_with_params(crate::url(u).as_str(), ¶ms)
13 .map_err(crate::Error::UrlParseError)
14}
15
16pub fn page<T, K, V>(
17 url: &str,
18 query: std::collections::HashMap<K, V>,
19 tid: Option<String>,
20) -> crate::Result<T>
21where
22 T: serde::de::DeserializeOwned,
23 K: Into<String> + AsRef<str> + Ord,
24 V: Into<String> + AsRef<str>,
25{
26 let url = to_url_with_query(url, query)?;
27
28 if crate::is_test() {
29 return crate::mock(tid, serde_json::json! ({"url": url.as_str()}));
30 }
31
32 crate::handle(crate::client(url.as_str(), reqwest::Method::GET))
33}