use log::trace;
use thiserror::Error;
use crate::{entry::KeyringEntry, io::KeyringIo};
#[derive(Clone, Debug, Error)]
pub enum DeleteSecretError {
#[error("Invalid argument: expected {0}, got {1:?}")]
InvalidArgument(&'static str, KeyringIo),
#[error("Entry not ready")]
NotReady,
}
#[derive(Clone, Debug)]
pub enum DeleteSecretResult {
Ok(()),
Io(KeyringIo),
Err(DeleteSecretError),
}
#[derive(Clone, Debug)]
pub struct DeleteSecret {
entry: Option<KeyringEntry>,
}
impl DeleteSecret {
pub fn new(entry: KeyringEntry) -> Self {
Self { entry: Some(entry) }
}
pub fn resume(&mut self, arg: Option<KeyringIo>) -> DeleteSecretResult {
let Some(arg) = arg else {
let Some(entry) = self.entry.take() else {
return DeleteSecretResult::Err(DeleteSecretError::NotReady);
};
trace!("break: need I/O to delete secret from keyring entry");
return DeleteSecretResult::Io(KeyringIo::Delete(Err(entry)));
};
let KeyringIo::Delete(io) = arg else {
let err = DeleteSecretError::InvalidArgument("delete output", arg);
return DeleteSecretResult::Err(err);
};
if let Err(entry) = io {
return DeleteSecretResult::Io(KeyringIo::Delete(Err(entry)));
}
trace!("resume after deleting secret from keyring entry");
DeleteSecretResult::Ok(())
}
}