newsdata-io-api 0.9.1

Rust binding for the api of Newsdata.io
Documentation
use std::collections::HashMap;

use super::NewsdataIO;
use crate::Error;
use crate::{ApiResult, Json};

use log::{debug, error};

pub trait Requests {
    fn get(&self, sub_url: &str, query_params: Option<HashMap<String, String>>) -> ApiResult<Json>;
}

impl Requests for NewsdataIO {
    fn get(&self, sub_url: &str, query_params: Option<HashMap<String, String>>) -> ApiResult<Json> {
        let mut request = self
            .agent
            .get(&(format!("https://newsdata.io/api/1/{}", sub_url)))
            .query("apikey", self.auth.get_api_key().as_str());
        match query_params {
            Some(params) => {
                for (key, value) in params {
                    request = request.query(key.as_str(), value.as_str());
                }
            }
            None => {}
        };
        let response = request.set("Content-Type", "application/json").call();
        deal_response(response, sub_url)
    }
}

fn deal_response(response: Result<ureq::Response, ureq::Error>, sub_url: &str) -> ApiResult<Json> {
    match response {
        Ok(response) => {
            let json = response.into_json::<Json>().unwrap();
            debug!("<== ✔️\n\tDone api: {sub_url}, resp: {json}");
            Ok(json)
        }
        Err(err) => match err {
            ureq::Error::Status(status, response) => {
                let err_msg = response.into_json::<Json>().unwrap();
                error!("<== ❌\n\tError api: {sub_url}, status: {status}, error: {err_msg}");
                return Err(Error::ApiError(format!("{err_msg}")));
            }
            ureq::Error::Transport(e) => {
                error!("<== ❌\n\tError api: {sub_url}, error: {:?}", e.to_string());
                return Err(Error::RequestError(e.to_string()));
            }
        },
    }
}