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(¶ms.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 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 let api = VkApi::new(
188 Some(service_key),
189 Some(group_key),
190 Some(flow_key),
191 Some(5.199),
192 );
193
194
195 assert!(true);
209
210 Ok(())
211 }
212}