facet_reflect/peek/
tuple.rs1use core::fmt::Debug;
2use facet_core::TupleType;
3
4use super::Peek;
5
6pub type TupleField<'mem, 'facet_lifetime> = (usize, Peek<'mem, 'facet_lifetime>);
8
9#[derive(Clone, Copy)]
11pub struct PeekTuple<'mem, 'facet_lifetime> {
12 pub(crate) value: Peek<'mem, 'facet_lifetime>,
14 pub(crate) ty: TupleType,
16}
17
18impl Debug for PeekTuple<'_, '_> {
19 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
20 f.debug_struct("PeekTuple")
21 .field("type", &self.ty)
22 .finish_non_exhaustive()
23 }
24}
25
26impl<'mem, 'facet_lifetime> PeekTuple<'mem, 'facet_lifetime> {
27 pub fn len(&self) -> usize {
29 self.ty.fields.len()
30 }
31
32 pub fn is_empty(&self) -> bool {
34 self.len() == 0
35 }
36
37 pub fn field(&self, index: usize) -> Option<Peek<'mem, 'facet_lifetime>> {
39 if index >= self.len() {
40 return None;
41 }
42
43 let field = &self.ty.fields[index];
44 let field_ptr = unsafe { self.value.data().field(field.offset) };
47 let field_peek = unsafe { Peek::unchecked_new(field_ptr, field.shape) };
48
49 Some(field_peek)
50 }
51
52 pub fn fields(
54 &self,
55 ) -> impl DoubleEndedIterator<Item = TupleField<'mem, 'facet_lifetime>> + '_ {
56 (0..self.len()).filter_map(|i| self.field(i).map(|p| (i, p)))
57 }
58
59 pub fn ty(&self) -> TupleType {
61 self.ty
62 }
63
64 pub fn value(&self) -> Peek<'mem, 'facet_lifetime> {
66 self.value
67 }
68}