Skip to main content

strava_wrapper/filters/
activities.rs

1use crate::models::{Activity, CreateActivity, DetailedActivity, UpdatableActivity};
2use crate::query::{
3    get_with_query_and_path, post_form, put_json, Endpoint, ErrorWrapper, IncludeAllEfforts,
4    PathQuery, Query, Sendable, ID,
5};
6use async_trait::async_trait;
7use std::collections::HashMap;
8use strava_wrapper_macros::{Endpoint, IncludeAllEfforts, PathQuery, Query, ID};
9
10#[derive(Debug, Clone, Endpoint, Query, PathQuery, ID, IncludeAllEfforts)]
11#[must_use = "this request is not executed until you call .send().await"]
12pub struct GetActivity {
13    url: String,
14    token: String,
15    path: String,
16    query: Vec<(String, String)>,
17    path_params: Vec<(String, String)>,
18}
19
20#[async_trait]
21impl Sendable<Activity> for GetActivity {
22    async fn send(self) -> Result<Activity, ErrorWrapper> {
23        let token = self.token.clone();
24        get_with_query_and_path(self, &token).await
25    }
26}
27
28/// Builder for `POST /activities`. Construct a [`CreateActivity`] body and
29/// call `.send()` to create a manual activity.
30#[must_use = "this request is not executed until you call .send().await"]
31pub struct CreateActivityRequest {
32    url: String,
33    token: String,
34    body: CreateActivity,
35}
36
37impl CreateActivityRequest {
38    pub fn new(url: impl Into<String>, token: impl Into<String>, body: CreateActivity) -> Self {
39        Self {
40            url: url.into(),
41            token: token.into(),
42            body,
43        }
44    }
45}
46
47#[async_trait]
48impl Sendable<DetailedActivity> for CreateActivityRequest {
49    async fn send(self) -> Result<DetailedActivity, ErrorWrapper> {
50        let url = format!("{}/v3/activities", self.url);
51        post_form(&url, &self.token, &self.body).await
52    }
53}
54
55/// Builder for `PUT /activities/{id}`. Takes the activity id and an
56/// [`UpdatableActivity`] body describing the fields to change.
57#[must_use = "this request is not executed until you call .send().await"]
58pub struct UpdateActivityRequest {
59    url: String,
60    token: String,
61    id: u64,
62    body: UpdatableActivity,
63}
64
65impl UpdateActivityRequest {
66    pub fn new(
67        url: impl Into<String>,
68        token: impl Into<String>,
69        id: u64,
70        body: UpdatableActivity,
71    ) -> Self {
72        Self {
73            url: url.into(),
74            token: token.into(),
75            id,
76            body,
77        }
78    }
79}
80
81#[async_trait]
82impl Sendable<DetailedActivity> for UpdateActivityRequest {
83    async fn send(self) -> Result<DetailedActivity, ErrorWrapper> {
84        let url = format!("{}/v3/activities/{}", self.url, self.id);
85        put_json(&url, &self.token, &self.body).await
86    }
87}