strava_wrapper/
auth.rs

1use serde::{Deserialize, Serialize};
2
3const AUTH_URL: &str = "https://www.strava.com/oauth/token";
4pub async fn get_token(
5    client_id: u32,
6    client_secret: &str,
7    code: &str,
8) -> Result<TokenResponse, reqwest::Error> {
9    let client = reqwest::Client::new();
10    let response = client
11        .post(AUTH_URL)
12        .form(&TokenRequest {
13            client_id,
14            client_secret: client_secret.to_string(),
15            code: code.to_string(),
16            grant_type: "authorization_code".into(),
17        })
18        .send()
19        .await?;
20
21    if !response.status().is_success() {
22        // you could map this into your own Error type
23        panic!("Request failed: {}", response.status());
24    }
25
26    response.json::<TokenResponse>().await
27}
28
29#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
30struct TokenRequest {
31    client_id: u32,
32    client_secret: String,
33    code: String,
34    grant_type: String,
35}
36
37#[derive(Debug, Clone, Deserialize)]
38pub struct TokenResponse {
39    pub token_type: String,
40    pub access_token: String,
41    pub expires_at: u64,
42    pub expires_in: u64,
43    pub refresh_token: String,
44}