mal/auth/
token.rs

1use serde::{Deserialize, Serialize};
2use std::time;
3
4/// An Authorization Token
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct Token {
7    /// Token Type
8    pub token_type: String,
9    /// When the token will expire relative to when it was created in seconds
10    pub expires_in: u64,
11    /// Access token for api requests
12    pub access_token: String,
13    /// Refresh token for refreshing the access token when it expires
14    pub refresh_token: String,
15}
16
17/// Holds token and timestamp
18#[derive(Debug, Clone, Serialize, Deserialize)]
19pub struct TokenWrapper {
20    /// The token
21    pub token: Token,
22    /// The time that the token was generated
23    pub generate_time: u64,
24}
25
26impl TokenWrapper {
27    /// Returns seconds since the unix epoch
28    fn sec_since_epoch() -> u64 {
29        time::SystemTime::now()
30            .duration_since(time::UNIX_EPOCH)
31            .unwrap()
32            .as_secs()
33    }
34    /// Creates a new TokenWrapper
35    pub fn new(token: Token) -> Self {
36        TokenWrapper {
37            token,
38            generate_time: Self::sec_since_epoch(),
39        }
40    }
41    /// Check if the token is expired
42    pub fn expired(&self) -> bool {
43        let now = Self::sec_since_epoch();
44        now >= self.generate_time + self.token.expires_in
45    }
46
47    /// Get seconds until expiry (None if already expired)
48    pub fn expires_in_secs(&self) -> Option<u64> {
49        let now = Self::sec_since_epoch();
50        let expires_in = self.generate_time + self.token.expires_in;
51        if now >= expires_in {
52            None
53        } else {
54            Some(expires_in - now)
55        }
56    }
57    /// Get the time that the token will expire (None if already expired)
58    pub fn expire_time(&self) -> Option<time::SystemTime> {
59        self.expires_in_secs()
60            .map(|secs| time::SystemTime::now() + time::Duration::from_secs(secs))
61    }
62}