synpad 0.1.0

A full-featured Matrix chat client built with Dioxus
use anyhow::Result;
use serde::{Deserialize, Serialize};

use crate::client::config::ClientConfig;

/// Serializable session data for persistence.
///
/// We store our own session type rather than matrix-sdk's internal types,
/// so that session persistence is stable across SDK upgrades.
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SessionData {
    pub homeserver_url: String,
    pub user_id: String,
    pub device_id: String,
    pub access_token: String,
}

/// Save session data to disk.
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(())
}

/// Load session data from disk.
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))
}

/// Clear saved 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(())
}