use facet_core::{ResultDef, ResultVTable};
#[derive(Clone, Copy)]
pub struct PeekResult<'mem, 'facet> {
pub(crate) value: crate::Peek<'mem, 'facet>,
pub(crate) def: ResultDef,
}
impl<'mem, 'facet> PeekResult<'mem, 'facet> {
#[inline(always)]
pub const fn def(self) -> ResultDef {
self.def
}
#[inline(always)]
pub const fn vtable(self) -> &'static ResultVTable {
self.def.vtable
}
#[inline]
pub fn is_ok(self) -> bool {
unsafe { (self.vtable().is_ok)(self.value.data()) }
}
#[inline]
pub fn is_err(self) -> bool {
!self.is_ok()
}
#[inline]
pub fn ok(self) -> Option<crate::Peek<'mem, 'facet>> {
unsafe {
let inner_data = (self.vtable().get_ok)(self.value.data());
if inner_data.is_null() {
None
} else {
Some(crate::Peek::unchecked_new(
facet_core::PtrConst::new_sized(inner_data),
self.def.t(),
))
}
}
}
#[inline]
pub fn err(self) -> Option<crate::Peek<'mem, 'facet>> {
unsafe {
let inner_data = (self.vtable().get_err)(self.value.data());
if inner_data.is_null() {
None
} else {
Some(crate::Peek::unchecked_new(
facet_core::PtrConst::new_sized(inner_data),
self.def.e(),
))
}
}
}
}