use crate::{internal, Error};
#[must_use = "A transaction needs to be committed."]
pub struct Transaction(pub(crate) internal::transaction::Impl);
impl Transaction {
pub async fn commit(self) -> Result<(), Error> {
internal::transaction::commit(self).await
}
pub async fn rollback(self) -> Result<(), Error> {
internal::transaction::rollback(self).await
}
}
#[must_use = "The potentially owned transaction needs to be committed."]
pub enum TransactionGuard<'tr> {
Owned(Transaction),
Borrowed(&'tr mut Transaction),
}
impl TransactionGuard<'_> {
pub fn get_transaction(&mut self) -> &mut Transaction {
match self {
TransactionGuard::Owned(tr) => tr,
TransactionGuard::Borrowed(tr) => tr,
}
}
pub async fn commit(self) -> Result<(), Error> {
if let TransactionGuard::Owned(tr) = self {
tr.commit().await
} else {
Ok(())
}
}
}