use std::{fs::File, path::{Path, PathBuf}};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TokenData {
pub access_token: String,
pub refresh_token: String,
pub expires_in: i64,
#[serde(default)]
pub expires_at: i64,
}
pub struct TokenStore {
path: PathBuf,
}
impl TokenStore {
pub fn new(path: impl Into<PathBuf>) -> Self {
Self {
path: path.into()
}
}
pub fn save(&self, data: &TokenData) -> anyhow::Result<()> {
let file = File::create(&self.path)?;
serde_json::to_writer_pretty(file, data)?;
Ok(())
}
pub async fn load(&self) -> Option<TokenData> {
if !Path::new(&self.path).exists() {
return None;
}
let file = File::open(&self.path).ok()?;
let tokens: TokenData = serde_json::from_reader(file).ok()?;
Some(tokens)
}
}