1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
pub mod post_v2_video_list;
pub mod post_v2_video_query;

use crate::error::Error;
use reqwest::RequestBuilder;
use serde::de::DeserializeOwned;

pub async fn execute_api<T>(builder: RequestBuilder) -> Result<T, Error>
where
    T: DeserializeOwned,
{
    let response = builder.send().await?;
    let status_code = response.status();

    if status_code.is_success() {
        Ok(response.json::<T>().await?)
    } else {
        let text = match response.text().await {
            Ok(text) => text,
            Err(err) => return Err(Error::Other(format!("{:?}", err), Some(status_code))),
        };

        let json = match serde_json::from_str::<serde_json::Value>(&text) {
            Ok(json) => json,
            Err(_err) => return Err(Error::Other(text, Some(status_code))),
        };

        match serde_json::from_value::<crate::responses::error::Error>(json["error"].clone()) {
            Ok(err) => Err(Error::Api(err)),
            Err(_) => Err(Error::Other(text, Some(status_code))),
        }
    }
}