instagram_web_api/endpoints/
utils.rs

1use percent_encoding::{percent_encode, AsciiSet, NON_ALPHANUMERIC};
2use serde_json::{Map, Value};
3
4use crate::endpoints::URL_BASE;
5
6pub const GRAPHQL_QUERY_URL_PERCENT_ENCODE_ASCII_SET: &AsciiSet =
7    &NON_ALPHANUMERIC.remove(b'_').remove(b'-');
8
9pub fn gen_graphql_query_url(
10    query_hash: impl AsRef<str>,
11    variables: Map<String, Value>,
12) -> Result<String, String> {
13    let mut query_pairs = vec![("query_hash", query_hash.as_ref().to_owned())];
14
15    let variables = serde_json::to_string(&Value::Object(variables))
16        .map_err(|err| format!("to variables failed {}", err))?;
17    query_pairs.push((
18        "variables",
19        percent_encode(
20            variables.as_bytes(),
21            GRAPHQL_QUERY_URL_PERCENT_ENCODE_ASCII_SET,
22        )
23        .to_string(),
24    ));
25
26    Ok(format!(
27        "{}/graphql/query/?{}",
28        URL_BASE,
29        query_pairs
30            .into_iter()
31            .map(|x| format!("{}={}", x.0, x.1))
32            .collect::<Vec<String>>()
33            .join("&"),
34    ))
35}