1use crate::traits::Request;
2use serde::Serialize;
3use serde_json::Value;
4
5const VERSION: &'static str = "5.199";
6
7#[derive(Clone, Debug)]
8pub struct RequestBuilder {
9 client: reqwest::Client,
10 access_token: String,
11}
12
13macro_rules! request {
14 ($fn1:ident) => {
15 async fn $fn1<T: Serialize + Send, A: Serialize + Send + Sized>(
16 &self,
17 url: &str,
18 method: &str,
19 query: A,
20 body: T,
21 ) -> std::result::Result<Value, reqwest::Error> {
22 let response = self
23 .client
24 .post(&if method.is_empty() {
25 format!("{}?v={}", url, VERSION)
26 } else {
27 format!("{}/{}?v={}", url, method, VERSION)
28 })
29 .query(&query)
30 .bearer_auth(&self.access_token)
31 .json(&body)
32 .send()
33 .await?;
34
35 let json: Value = response.json().await?;
36
37 Ok(json)
38 }
39 };
40}
41
42impl Request for RequestBuilder {
43 fn new(access_token: String) -> Self {
44 let client = reqwest::Client::new();
45 RequestBuilder {
46 client,
47 access_token,
48 }
49 }
50
51 request!(post);
52 request!(get);
53}