use anyhow::Result;
use serde::{Deserialize, Serialize};
use crate::client::config::ClientConfig;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SessionData {
pub homeserver_url: String,
pub user_id: String,
pub device_id: String,
pub access_token: String,
}
pub async fn save_session(session_data: &SessionData) -> Result<()> {
let config = ClientConfig::default();
let data_dir = config.data_dir();
tokio::fs::create_dir_all(&data_dir).await?;
let session_file = data_dir.join("session.json");
let json = serde_json::to_string_pretty(session_data)?;
tokio::fs::write(&session_file, json).await?;
tracing::info!("Session saved to {:?}", session_file);
Ok(())
}
pub async fn load_session() -> Result<Option<SessionData>> {
let config = ClientConfig::default();
let session_file = config.data_dir().join("session.json");
if !session_file.exists() {
return Ok(None);
}
let json = tokio::fs::read_to_string(&session_file).await?;
let session_data: SessionData = serde_json::from_str(&json)?;
tracing::info!("Session loaded from {:?}", session_file);
Ok(Some(session_data))
}
pub async fn clear_session() -> Result<()> {
let config = ClientConfig::default();
let session_file = config.data_dir().join("session.json");
if session_file.exists() {
tokio::fs::remove_file(&session_file).await?;
tracing::info!("Session cleared");
}
Ok(())
}