brawl-api 0.1.2

A Rust implementation of the Brawl Stars API (https://developer.brawlstars.com/).
Documentation
use std::result::Result as StdResult;
use serde::de::DeserializeOwned;
use serde_json::{Map as SerdeJsonMap, Value};
use crate::error::{Result, Error};
use crate::http::Client;
use crate::http::routes::Route;
use reqwest::{Error as ReqwestError, StatusCode};
use reqwest::blocking::{
    Response,
};

#[cfg(feature = "async")]
use reqwest::{
    Response as AResponse,
};

pub(crate) fn auto_hashtag(tag: &str) -> String {
    let mut new_tag = tag.to_owned();
    if tag.starts_with('#') {
        new_tag = new_tag.replacen("#", "%23", 1);
    } else if cfg!(feature = "auto-hashtag") && !tag.starts_with("%23") {
        new_tag = format!("%23{}", new_tag);  // automtically add the hashtag if missing
    }
    new_tag
}

pub(crate) type JsonMap = SerdeJsonMap<String, Value>;

/// (Sync) Fetches a deserializable struct/enum/... from some route.
pub(crate) fn fetch_route<T>(client: &Client, route: &Route) -> Result<T>
    where T: DeserializeOwned {
    let request_b = client.build_endpoint_get(&*route.to_url_str())?;
    let response: StdResult<Response, ReqwestError> = request_b.send();
    let response = response.map_err(Error::Request)?;

    let status: StatusCode = response.status();
    if status.is_success() {
        serde_json::from_reader::<Response, T>(response).map_err(Error::Json)
    } else {
        Err(Error::from_response(response, None))
    }
}

/// (Async) Fetches a deserializable struct/enum/... from some route.
#[cfg(feature = "async")]
pub(crate) async fn a_fetch_route<T>(client: &Client, route: &Route) -> Result<T>
    where T: DeserializeOwned {
    let request_b = client.a_build_endpoint_get(&*route.to_url_str())?;
    let response: StdResult<AResponse, ReqwestError> = request_b.send().await;
    let response = response.map_err(Error::Request)?;

    let status: StatusCode = response.status();
    if status.is_success() {
        let full_bytes = response.bytes().await.map_err(Error::Request)?;
        serde_json::from_slice::<T>(&full_bytes).map_err(Error::Json)
    } else {
        Err(Error::a_from_response(response, None).await)
    }
}