use facet_core::PointerDef;
use super::Poke;
pub struct PokePointer<'mem, 'facet> {
pub(crate) value: Poke<'mem, 'facet>,
pub(crate) def: PointerDef,
}
impl<'mem, 'facet> core::fmt::Debug for PokePointer<'mem, 'facet> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("PokePointer").finish_non_exhaustive()
}
}
impl<'mem, 'facet> PokePointer<'mem, 'facet> {
#[must_use]
#[inline]
pub const fn def(&self) -> &PointerDef {
&self.def
}
#[inline]
pub fn borrow_inner(&self) -> Option<crate::Peek<'_, 'facet>> {
let borrow_fn = self.def.vtable.borrow_fn?;
let pointee_shape = self.def.pointee()?;
let inner_ptr = unsafe { borrow_fn(self.value.data()) };
Some(unsafe { crate::Peek::unchecked_new(inner_ptr, pointee_shape) })
}
#[inline]
pub const fn into_inner(self) -> Poke<'mem, 'facet> {
self.value
}
#[inline]
pub fn as_peek_pointer(&self) -> crate::PeekPointer<'_, 'facet> {
crate::PeekPointer {
value: self.value.as_peek(),
def: self.def,
}
}
}