use facet_core::{OptionDef, OptionVTable};
#[derive(Clone, Copy)]
pub struct PeekOption<'mem, 'facet> {
pub(crate) value: crate::Peek<'mem, 'facet>,
pub(crate) def: OptionDef,
}
impl<'mem, 'facet> PeekOption<'mem, 'facet> {
#[inline(always)]
pub const fn def(self) -> OptionDef {
self.def
}
#[inline(always)]
pub const fn vtable(self) -> &'static OptionVTable {
self.def.vtable
}
#[inline]
pub fn is_some(self) -> bool {
unsafe { (self.vtable().is_some)(self.value.data()) }
}
#[inline]
pub fn is_none(self) -> bool {
!self.is_some()
}
#[inline]
pub fn value(self) -> Option<crate::Peek<'mem, 'facet>> {
unsafe {
let inner_data = (self.vtable().get_value)(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(),
))
}
}
}
}