use std::fmt;
pub enum CommitOrAbort<T, A> {
Commit(T),
Abort(A),
}
impl<T, A> CommitOrAbort<T, A> {
#[inline]
pub fn commit(self) -> Option<T> {
match self {
CommitOrAbort::Commit(data) => Some(data),
CommitOrAbort::Abort(_) => None,
}
}
#[inline]
pub fn abort(self) -> Option<A> {
match self {
CommitOrAbort::Commit(_) => None,
CommitOrAbort::Abort(data) => Some(data),
}
}
#[inline]
pub fn is_abort(&self) -> bool {
matches!(self, CommitOrAbort::Abort(_))
}
#[inline]
#[track_caller]
pub fn unwrap_commit(self) -> T
where
A: fmt::Debug,
{
match self {
CommitOrAbort::Commit(data) => data,
CommitOrAbort::Abort(abort) => {
panic!("called `CommitOrAbort::unwrap_commit()` on an `Abort` value: {abort:?}")
}
}
}
#[inline]
#[track_caller]
pub fn unwrap_abort(self) -> A
where
T: fmt::Debug,
{
match self {
CommitOrAbort::Commit(data) => {
panic!("called `CommitOrAbort::unwrap_abort()` on a `Commit` value: {data:?}")
}
CommitOrAbort::Abort(abort) => abort,
}
}
}
impl<T, E> From<Result<T, E>> for CommitOrAbort<T, E> {
fn from(result: Result<T, E>) -> Self {
match result {
Ok(data) => CommitOrAbort::Commit(data),
Err(error) => CommitOrAbort::Abort(error),
}
}
}
impl<T, E> From<CommitOrAbort<T, E>> for Result<T, E> {
fn from(coa: CommitOrAbort<T, E>) -> Self {
match coa {
CommitOrAbort::Commit(data) => Ok(data),
CommitOrAbort::Abort(abort) => Err(abort),
}
}
}