strava-data 0.7.0-alpha.1

Strava data api bindings
Documentation
use std::sync::Arc;

use log::debug;
use reqwest::{Client, StatusCode};

use crate::configuration::Configuration;
use crate::models::DetailedActivity;

pub struct ActivitiesApi {
    configuration: Arc<Configuration>,
}

impl ActivitiesApi {
    pub fn new(configuration: Arc<Configuration>) -> ActivitiesApi {
        ActivitiesApi { configuration }
    }

    pub async fn get_activity_by_id(
        &self,
        id: i64,
        access_token: &String,
    ) -> Result<Option<DetailedActivity>, Box<dyn std::error::Error + Send + Sync + 'static>> {
        debug!("get_activity_by_id {}", id);
        let url = format!("{}/activities/{id}", self.configuration.base_path, id = id);
        let authorization = format!("Bearer {}", access_token);
        let res = Client::new()
            .get(url.as_str())
            .header("Authorization", authorization)
            .send()
            .await?;

        if res.status() != StatusCode::OK {
            if res.status() == StatusCode::NOT_FOUND {
                log::warn!("activity {} not found", id);
                return Ok(None);
            }
            log::error!("{:?}", res);
            return Err(From::from("Error code not ok"));
        }

        let activity = res.json::<DetailedActivity>().await?;
        Ok(Some(activity))
    }

    pub async fn get_logged_in_athlete_activities(
        &self,
        before: i32,
        after: i32,
        page: i32,
        per_page: i32,
        access_token: &String,
    ) -> Result<Vec<DetailedActivity>, Box<dyn std::error::Error + Send + Sync + 'static>> {
        debug!("get_logged_in_athlete_activities");
        let url = format!(
            "{}/athlete/activities?before={}&after={}&page={}&per_page={}",
            self.configuration.base_path, before, after, page, per_page
        );
        let authorization = format!("Bearer {}", access_token);
        let res = Client::new()
            .get(url.as_str())
            .header("Authorization", authorization)
            .send()
            .await?;

        if res.status() != StatusCode::OK {
            log::error!("{:?}", res);
            return Err(From::from("Error code not ok"));
        }

        let activities = res.json::<Vec<DetailedActivity>>().await?;
        Ok(activities)
    }
}