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 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}