1pub mod get_v2_user_info;
2pub mod post_v2_video_list;
3pub mod post_v2_video_query;
4
5use crate::error::Error;
6use reqwest::RequestBuilder;
7use serde::de::DeserializeOwned;
8
9pub async fn execute_api<T>(builder: RequestBuilder) -> Result<T, Error>
10where
11 T: DeserializeOwned,
12{
13 let response = builder.send().await?;
14 let status_code = response.status();
15
16 if status_code.is_success() {
17 Ok(response.json::<T>().await?)
18 } else {
19 let text = match response.text().await {
20 Ok(text) => text,
21 Err(err) => return Err(Error::Other(format!("{:?}", err), status_code)),
22 };
23
24 let json = match serde_json::from_str::<serde_json::Value>(&text) {
25 Ok(json) => json,
26 Err(_err) => return Err(Error::Other(text, status_code)),
27 };
28
29 match serde_json::from_value::<crate::responses::error::Error>(json["error"].clone()) {
30 Ok(err) => Err(Error::Api(err, status_code)),
31 Err(_) => Err(Error::Other(text, status_code)),
32 }
33 }
34}