#[repr(C)]
pub(crate) enum FfiResult<T, E> {
Ok(T),
Err(E)
}
impl<T, E> FfiResult<T, E> {
pub(crate) fn map<F: FnOnce(T) -> U, U>(self, f: F) -> FfiResult<U, E> {
match self {
Self::Ok(value) => FfiResult::Ok(f(value)),
Self::Err(err) => FfiResult::Err(err)
}
}
pub(crate) fn map_err<F: FnOnce(E) -> U, U>(self, f: F) -> FfiResult<T, U> {
match self {
Self::Ok(value) => FfiResult::Ok(value),
Self::Err(err) => FfiResult::Err(f(err))
}
}
pub(crate) fn unwrap_or_else<F: FnOnce(E) -> T>(self, f: F) -> T {
match self {
Self::Ok(value) => value,
Self::Err(err) => f(err)
}
}
pub(crate) fn into_result(self) -> Result<T, E> {
self.into()
}
}
impl<T, E> From<Result<T, E>> for FfiResult<T, E> {
fn from(value: Result<T, E>) -> Self {
value.map(Self::Ok).unwrap_or_else(Self::Err)
}
}
impl<T, E> From<FfiResult<T, E>> for Result<T, E> {
fn from(value: FfiResult<T, E>) -> Self {
value.map(Self::Ok).unwrap_or_else(Self::Err)
}
}