use keyring::{Entry, Result};
const SESSION_TOKEN_NAME: &str = "iggy-cli-session";
const SESSION_KEYRING_SERVICE_NAME: &str = "iggy-cli-session";
pub struct ServerSession {
server_address: String,
}
impl ServerSession {
pub fn new(server_address: String) -> Self {
Self { server_address }
}
pub fn get_server_address(&self) -> &str {
&self.server_address
}
fn get_service_name(&self) -> String {
format!("{SESSION_KEYRING_SERVICE_NAME}:{}", self.server_address)
}
pub fn get_token_name(&self) -> String {
String::from(SESSION_TOKEN_NAME)
}
pub fn is_active(&self) -> bool {
if let Ok(entry) = Entry::new(&self.get_service_name(), &self.get_token_name()) {
return entry.get_password().is_ok();
}
false
}
pub fn store(&self, token: &str) -> Result<()> {
let entry = Entry::new(&self.get_service_name(), &self.get_token_name())?;
entry.set_password(token)?;
Ok(())
}
pub fn get_token(&self) -> Option<String> {
if let Ok(entry) = Entry::new(&self.get_service_name(), &self.get_token_name())
&& let Ok(token) = entry.get_password()
{
return Some(token);
}
None
}
pub fn delete(&self) -> Result<()> {
let entry = Entry::new(&self.get_service_name(), &self.get_token_name())?;
entry.delete_credential()
}
}