vkapi2/
lib.rs

1mod error;
2use error::VkApiError;
3use reqwest::Client;
4pub mod account;
5pub mod friends;
6pub mod messages;
7mod param_grid;
8pub mod status;
9pub use param_grid::ParamGrid;
10pub mod calls;
11pub mod donut;
12pub mod fave;
13pub mod notes;
14pub mod photos;
15pub mod users;
16pub mod utils;
17pub mod video;
18pub mod gifts;
19pub mod likes;
20pub mod podcasts;
21pub mod translations;
22
23pub mod wall;
24
25pub mod docs;
26
27pub mod groups;
28
29pub mod stories;
30
31pub mod market;
32
33pub mod apps;
34pub mod streaming;
35
36pub mod orders;
37
38pub mod board;
39
40pub enum Api {
41    Service,
42    Group,
43    Flow,
44}
45
46pub struct VkApi {
47    service_key: String,
48    group_key: String,
49    flow_key: String,
50    client: Client,
51    v: f32,
52}
53
54impl VkApi {
55    pub fn new(
56        service_key: Option<String>,
57        group_key: Option<String>,
58        flow_key: Option<String>,
59        v: Option<f32>,
60    ) -> Self {
61        let service_key = match service_key {
62            Some(key) => key.to_string(),
63            None => "".to_string(),
64        };
65        let group_key = match group_key {
66            Some(key) => key.to_string(),
67            None => "".to_string(),
68        };
69        let flow_key = match flow_key {
70            Some(key) => key.to_string(),
71            None => "".to_string(),
72        };
73        let v = v.unwrap_or_else(|| 5.199);
74
75        Self {
76            service_key,
77            group_key,
78            flow_key,
79            client: Client::new(),
80            v,
81        }
82    }
83
84    pub fn get_group_key(self) -> Option<String> {
85        return if self.group_key == "" {
86            None
87        } else {
88            Some(self.group_key)
89        };
90    }
91
92    pub fn get_service_key(self) -> Option<String> {
93        return if self.service_key == "" {
94            None
95        } else {
96            Some(self.service_key)
97        };
98    }
99
100    pub fn get_flow_key(self) -> Option<String> {
101        return if self.flow_key == "" {
102            None
103        } else {
104            Some(self.flow_key)
105        };
106    }
107
108    pub fn get_version(self) -> f32 {
109        return self.v;
110    }
111
112    pub fn set_group_key(mut self, group_key: String) {
113        self.group_key = group_key;
114    }
115
116    pub fn set_service_key(mut self, service_key: String) {
117        self.service_key = service_key;
118    }
119
120    pub fn set_flow_key(mut self, flow_key: String) {
121        self.flow_key = flow_key;
122    }
123
124    pub fn set_version(mut self, v: f32) {
125        self.v = v;
126    }
127}
128
129async fn send_request(
130    client: &Client,
131    params: Option<ParamGrid>,
132    url: &str,
133    key: &str,
134    v: f32,
135) -> Result<String, VkApiError> {
136    let mut params = params.unwrap_or_default();
137
138    params.insert_if_not_exists("v", v);
139
140    let response = client
141        .post(url)
142        .header("Authorization", format!("Bearer {}", key))
143        .form(&params.data)
144        .send()
145        .await?;
146
147    let response_text = response.text().await?;
148
149    Ok(response_text)
150}
151
152#[macro_export]
153macro_rules! insert_params {
154    ($params:expr, $($value:expr),* $(,)?) => {
155        $(
156            $params.insert_if_not_exists(stringify!($value), $value.to_string());
157        )*
158    };
159}
160
161
162#[cfg(test)]
163mod tests {
164    use crate::status::methods::get;
165    use crate::users::methods::get_followers;
166    use crate::users::types::UserGetFollowersOptions;
167    use crate::users::types::{Fields, User};
168    use crate::streaming::methods::{get_settings, get_stem};
169    use crate::utils::methods::get_link_stats;
170    use crate::utils::types::{GetLinkStatsOptions, Interval};
171    use crate::VkApi;
172    use dotenvy::dotenv;
173    use crate::account::methods::get_info;
174    use crate::account::types::GetInfoOptions;
175    use crate::groups::methods::add_address;
176
177    #[tokio::test]
178    async fn my_test() -> Result<(), Box<dyn std::error::Error>> {
179        dotenv().expect(".env file not found");
180
181        //get env keys
182        let service_key = dotenvy::var("SERVICE_KEY").unwrap();
183        let group_key = dotenvy::var("GROUP_KEY").unwrap();
184        let flow_key = dotenvy::var("FLOW_KEY").unwrap();
185
186        //create api with these keys
187        let api = VkApi::new(
188            Some(service_key),
189            Some(group_key),
190            Some(flow_key),
191            Some(5.199),
192        );
193
194
195        // let v2 = get_settings(&api).await?;
196        //
197        // println!("{:?}", v2);
198
199
200
201        //println!("{:?}", v);
202
203
204
205
206
207
208        assert!(true);
209
210        Ok(())
211    }
212}