1use std::collections::HashMap;
2
3pub fn query(url: &str, token: &str, query_str: &str) -> Result<String, String> {
4 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}