gosuto 0.11.1

Gōsuto (ゴースト) — a cyberpunk terminal Matrix client with vim motions
use tracing::warn;

fn service_name() -> String {
    match crate::config::active_profile() {
        Some(name) => format!("gosuto-{name}"),
        None => "gosuto".to_owned(),
    }
}

pub struct SavedCredentials {
    pub homeserver: String,
    pub username: String,
    pub password: String,
}

pub fn save_credentials(homeserver: &str, username: &str, password: &str) {
    for (key, value) in [
        ("homeserver", homeserver),
        ("username", username),
        ("password", password),
    ] {
        if let Err(e) =
            keyring::Entry::new(&service_name(), key).and_then(|entry| entry.set_password(value))
        {
            warn!("Failed to save {key} to keyring: {e}");
            return;
        }
    }
}

pub fn load_credentials() -> Option<SavedCredentials> {
    let get = |key: &str| -> Option<String> {
        keyring::Entry::new(&service_name(), key)
            .and_then(|entry| entry.get_password())
            .ok()
    };

    Some(SavedCredentials {
        homeserver: get("homeserver")?,
        username: get("username")?,
        password: get("password")?,
    })
}

pub fn delete_credentials() {
    for key in ["homeserver", "username", "password"] {
        if let Ok(entry) = keyring::Entry::new(&service_name(), key)
            && let Err(e) = entry.delete_credential()
        {
            tracing::warn!("Failed to delete keyring credential '{key}': {e}");
        }
    }
}