use log::warn;
use reqwest::blocking::{RequestBuilder, Response};
use serde::de::DeserializeOwned;
use std::collections::HashMap;
const STRAVA_BASE_URL: &str = "https://www.strava.com/api/v3/";
const API_ERROR_MESSAGE: &str = "API returned an error";
pub fn strava_v3(path: String) -> String {
format!("{}{}", STRAVA_BASE_URL, path)
}
fn send_request(request: RequestBuilder) -> Result<Response, Box<dyn std::error::Error>> {
let response = request.send()?;
if response.status().is_client_error() {
warn!("API request returned an error: {:?}", response);
return Err(Box::new(std::io::Error::new(
std::io::ErrorKind::Other,
API_ERROR_MESSAGE,
)));
}
Ok(response)
}
pub fn fetch_from_strava_api(
url: String,
access_token: &str,
) -> Result<Response, Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let request = client.get(url).bearer_auth(access_token);
send_request(request)
}
pub fn put_to_strava_api(
url: String,
access_token: &str,
params: HashMap<&str, &str>,
) -> Result<Response, Box<dyn std::error::Error>> {
let client = reqwest::blocking::Client::new();
let request = client.put(url).bearer_auth(access_token).form(¶ms);
send_request(request)
}
pub fn fetch_strava_data<T: DeserializeOwned>(
api_path: String,
access_token: &str,
) -> Result<T, Box<dyn std::error::Error>> {
let url = strava_v3(api_path.to_string());
let response = fetch_from_strava_api(url, access_token)?;
let data: T = response.json()?;
Ok(data)
}