use facet_core::{FieldError, StructType};
use crate::Peek;
use super::{FieldIter, HasFields};
#[derive(Clone, Copy)]
pub struct PeekStruct<'mem, 'facet> {
pub(crate) value: Peek<'mem, 'facet>,
pub(crate) ty: StructType,
}
impl core::fmt::Debug for PeekStruct<'_, '_> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("PeekStruct").finish_non_exhaustive()
}
}
impl<'mem, 'facet> PeekStruct<'mem, 'facet> {
#[inline(always)]
pub const fn ty(&self) -> &StructType {
&self.ty
}
#[inline(always)]
pub const fn field_count(&self) -> usize {
self.ty.fields.len()
}
#[inline(always)]
pub fn field(&self, index: usize) -> Result<Peek<'mem, 'facet>, FieldError> {
self.ty
.fields
.get(index)
.map(|field| unsafe {
let field_data = self.value.data().field(field.offset);
Peek::unchecked_new(field_data, field.shape())
})
.ok_or(FieldError::IndexOutOfBounds {
index,
bound: self.ty.fields.len(),
})
}
#[inline]
pub fn field_by_name(&self, name: &str) -> Result<Peek<'mem, 'facet>, FieldError> {
for (i, field) in self.ty.fields.iter().enumerate() {
if field.name == name {
return self.field(i);
}
}
Err(FieldError::NoSuchField)
}
}
impl<'mem, 'facet> HasFields<'mem, 'facet> for PeekStruct<'mem, 'facet> {
#[inline]
fn fields(&self) -> FieldIter<'mem, 'facet> {
FieldIter::new_struct(*self)
}
}