1use serde::{Deserialize, Serialize};
2
3const AUTH_URL: &str = "https://www.strava.com/oauth/token";
4
5pub 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}