1use anyhow::Result; 2use chrono::{DateTime, Utc}; 3use serde::{Deserialize, Serialize}; 4 5use crate::keychain::Keychain; 6 7#[derive(Debug, Clone, Serialize, Deserialize)] 8pub struct Session { 9 pub access_jwt: String, 10 pub refresh_jwt: String, 11 pub did: String, 12 pub handle: String, 13 #[serde(default)] 14 pub created_at: DateTime<Utc>, 15} 16 17impl Default for Session { 18 fn default() -> Self { 19 Self { 20 access_jwt: String::new(), 21 refresh_jwt: String::new(), 22 did: String::new(), 23 handle: String::new(), 24 created_at: Utc::now(), 25 } 26 } 27} 28 29pub struct SessionManager { 30 service: String, 31 account: String, 32} 33 34impl Default for SessionManager { 35 fn default() -> Self { 36 Self { service: "tangled-cli".into(), account: "default".into() } 37 } 38} 39 40impl SessionManager { 41 pub fn new(service: &str, account: &str) -> Self { Self { service: service.into(), account: account.into() } } 42 43 pub fn save(&self, session: &Session) -> Result<()> { 44 let keychain = Keychain::new(&self.service, &self.account); 45 let json = serde_json::to_string(session)?; 46 keychain.set_password(&json) 47 } 48 49 pub fn load(&self) -> Result<Option<Session>> { 50 let keychain = Keychain::new(&self.service, &self.account); 51 match keychain.get_password() { 52 Ok(json) => Ok(Some(serde_json::from_str(&json)?)), 53 Err(_) => Ok(None), 54 } 55 } 56 57 pub fn clear(&self) -> Result<()> { 58 let keychain = Keychain::new(&self.service, &self.account); 59 keychain.delete_password() 60 } 61} 62