safe_vk/
reqwest_ext.rs

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}