graphquery_lib/
lib.rs

1use std::collections::HashMap;
2
3pub fn query(url: &str, token: &str, query_str: &str) -> Result<String, String> {
4    // query_str is in GraphQL format, need to translate to json
5    let body = query_to_json(query_str);
6
7    let client = reqwest::blocking::Client::new();
8    let res = client
9        .post(url.to_owned())
10        .header("User-Agent", "graphquery")
11        .header("Authorization", format!("Bearer {}", token.to_owned()))
12        .header("Content-Type", "application/json")
13        .body(body)
14        .send();
15
16    if let Ok(resp) = res {
17        if let Ok(text) = resp.text() {
18            Ok(text)
19        } else {
20            Err("Failed to send request".to_owned())
21        }
22    } else {
23        Err("Failed to send request".to_owned())
24    }
25}
26
27pub fn query_with_args(
28    url: &str,
29    token: &str,
30    query_str: &str,
31    args: &HashMap<String, String>,
32) -> Result<String, String> {
33    match build_query_str(query_str, args) {
34        Ok(new_query_str) => query(url, token, &new_query_str),
35        Err(err) => Err(err),
36    }
37}
38
39pub fn query_file(url: &str, token: &str, file: &str) -> Result<String, String> {
40    match std::fs::read_to_string(file.to_owned()) {
41        Ok(query_str) => query(url, token, &query_str),
42        Err(err) => {
43            log::error!(
44                "Failed to read query string from file({}). err: {}",
45                file.to_owned(),
46                err
47            );
48            Err(err.to_string())
49        }
50    }
51}
52
53pub fn query_file_with_args(
54    url: &str,
55    token: &str,
56    file: &str,
57    args: &HashMap<String, String>,
58) -> Result<String, String> {
59    match std::fs::read_to_string(file.to_owned()) {
60        Ok(query_str) => match build_query_str(&query_str, args) {
61            Ok(new_query_str) => query(url, token, &new_query_str),
62            Err(err) => Err(err),
63        },
64        Err(err) => {
65            log::error!(
66                "Failed to read query string from file({}). err: {}",
67                file.to_owned(),
68                err
69            );
70            Err(err.to_string())
71        }
72    }
73}
74
75fn query_to_json(query: &str) -> String {
76    format!(
77        "{{\"query\": \"{}\"}}",
78        query
79            .replace("\n", "")
80            .replace("\r", "")
81            .replace("\"", "\\\"")
82    )
83}
84
85fn build_query_str(query_str: &str, args: &HashMap<String, String>) -> Result<String, String> {
86    let mut new_query_str = query_str.to_owned();
87    for (k, v) in args {
88        let key_to_be_replaced = format!("$x:{k}");
89        if new_query_str.contains(&key_to_be_replaced) {
90            new_query_str = new_query_str.replace(&key_to_be_replaced, v);
91        } else {
92            log::error!("Extra argument key doesn't exist: {k}");
93            return Err("KEY_NOT_FOUND".to_owned());
94        }
95    }
96    Ok(new_query_str)
97}