use std::path::Path;
use super::error::CliError;
use super::pds::{PdsClient, PdsError};
use super::session::{self, SessionFile};
#[derive(Debug, PartialEq, Eq)]
pub enum LogoutOutcome {
NotLoggedIn,
RevokedAndRemoved,
RemovedLocalOnlyPdsFailed,
}
pub async fn logout(session_path: &Path) -> Result<LogoutOutcome, CliError> {
let session = match SessionFile::load(session_path)? {
Some(s) => s,
None => return Ok(LogoutOutcome::NotLoggedIn),
};
let pds_ok = match PdsClient::new(&session.pds_url) {
Ok(client) => try_revoke(&client, &session).await,
Err(_) => false,
};
session::delete(session_path)?;
if pds_ok {
Ok(LogoutOutcome::RevokedAndRemoved)
} else {
Ok(LogoutOutcome::RemovedLocalOnlyPdsFailed)
}
}
async fn try_revoke(pds: &PdsClient, session: &SessionFile) -> bool {
match pds.delete_session(&session.refresh_jwt).await {
Ok(()) => true,
Err(e) => {
emit_pds_warning(&session.pds_url, &e);
false
}
}
}
fn emit_pds_warning(pds_url: &str, err: &PdsError) {
tracing::warn!(
pds = %pds_url,
error = %err,
"PDS deleteSession failed; local session file will be removed regardless"
);
}