1use serde::{Deserialize, Serialize};
2use std::time;
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct Token {
7 pub token_type: String,
9 pub expires_in: u64,
11 pub access_token: String,
13 pub refresh_token: String,
15}
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
19pub struct TokenWrapper {
20 pub token: Token,
22 pub generate_time: u64,
24}
25
26impl TokenWrapper {
27 fn sec_since_epoch() -> u64 {
29 time::SystemTime::now()
30 .duration_since(time::UNIX_EPOCH)
31 .unwrap()
32 .as_secs()
33 }
34 pub fn new(token: Token) -> Self {
36 TokenWrapper {
37 token,
38 generate_time: Self::sec_since_epoch(),
39 }
40 }
41 pub fn expired(&self) -> bool {
43 let now = Self::sec_since_epoch();
44 now >= self.generate_time + self.token.expires_in
45 }
46
47 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 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}