strava_wrapper/
auth.rs

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