use core::fmt::Debug;
use facet_core::Field;
use super::{FieldIter, Peek};
#[derive(Clone, Copy, Debug)]
pub struct TupleType {
pub fields: &'static [Field],
}
pub type TupleField<'mem, 'facet> = (usize, Peek<'mem, 'facet>);
#[derive(Clone, Copy)]
pub struct PeekTuple<'mem, 'facet> {
pub(crate) value: Peek<'mem, 'facet>,
pub(crate) ty: TupleType,
}
impl Debug for PeekTuple<'_, '_> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("PeekTuple")
.field("type", &self.ty)
.finish_non_exhaustive()
}
}
impl<'mem, 'facet> PeekTuple<'mem, 'facet> {
#[inline]
pub const fn len(&self) -> usize {
self.ty.fields.len()
}
#[inline]
pub const fn is_empty(&self) -> bool {
self.len() == 0
}
#[inline]
pub fn field(&self, index: usize) -> Option<Peek<'mem, 'facet>> {
if index >= self.len() {
return None;
}
let field = &self.ty.fields[index];
let field_ptr = unsafe { self.value.data().field(field.offset) };
let field_peek = unsafe { Peek::unchecked_new(field_ptr, field.shape()) };
Some(field_peek)
}
#[inline]
pub const fn fields(&self) -> FieldIter<'mem, 'facet> {
FieldIter::new_tuple(*self)
}
#[inline]
pub const fn ty(&self) -> TupleType {
self.ty
}
#[inline]
pub const fn value(&self) -> Peek<'mem, 'facet> {
self.value
}
}