strava_wrapper/filters/
activities.rs

1use crate::models::Activity;
2use crate::query::{
3    get_with_query_and_path, Endpoint, ErrorWrapper, PathQuery, Query, Sendable, ID,
4};
5use async_trait::async_trait;
6use std::collections::HashMap;
7
8#[derive(Debug, Clone)]
9pub struct ActivityFilter {
10    url: String,
11    token: String,
12    path: String,
13    query: Vec<(String, String)>,
14    path_params: Vec<(String, String)>,
15}
16
17impl ActivityFilter {
18    pub fn new(url: impl Into<String>, token: impl Into<String>, path: impl Into<String>) -> Self {
19        Self {
20            url: url.into(),
21            token: token.into(),
22            path: path.into(),
23            query: Vec::new(),
24            path_params: Vec::new(),
25        }
26    }
27}
28
29#[async_trait]
30impl Sendable<ActivityFilter, Activity> for ActivityFilter {
31    async fn send(mut self) -> Result<Activity, ErrorWrapper> {
32        get_with_query_and_path(self.clone(), &self.token).await
33    }
34}
35
36impl Query for ActivityFilter {
37    fn get_query_params(self) -> Vec<(String, String)> {
38        self.query
39    }
40}
41
42impl PathQuery for ActivityFilter {
43    fn get_path_params(&self) -> HashMap<String, String> {
44        self.path_params.iter().cloned().collect()
45    }
46}
47
48impl ID for ActivityFilter {
49    fn id(mut self, id: u64) -> Self {
50        self.path_params.push(("id".to_string(), id.to_string()));
51        self
52    }
53}
54
55impl Endpoint for ActivityFilter {
56    fn endpoint(&self) -> String {
57        format!("{}/{}", self.url, self.path)
58    }
59}
60
61#[derive(Debug, Clone)]
62pub struct GetActivity {
63    token: String,
64    path: String,
65    query: Vec<(String, String)>,
66    path_params: Vec<(String, String)>,
67}
68
69impl GetActivity {
70    pub fn new(token: String, path: String) -> Self {
71        Self {
72            token,
73            path,
74            query: Vec::new(),
75            path_params: Vec::new(),
76        }
77    }
78}