Peek

Struct Peek 

Source
pub struct Peek<'mem, 'facet> { /* private fields */ }
Available on crate feature reflect only.
Expand description

A read-only view into a value with runtime type information.

Peek provides reflection capabilities for reading values at runtime. If the value is a struct, you can read its fields; if it’s an enum, you can determine which variant is selected; if it’s a scalar, you can extract a concrete value.

§Lifetime Parameters

  • 'mem: The memory lifetime - how long the underlying data is valid
  • 'facet: The type’s lifetime parameter (for types like &'a str)

§Variance and Soundness

Peek is invariant over 'facet. This is required for soundness: if Peek were covariant, it would be possible to launder lifetimes through reflection, leading to use-after-free bugs with types like fn(&'a str). See issue #1168.

The underlying type’s variance is tracked in Shape::variance, which can be used for future variance-aware APIs.

Implementations§

Source§

impl<'mem, 'facet> Peek<'mem, 'facet>

Source

pub fn new<T>(t: &'mem T) -> Peek<'mem, 'facet>
where T: Facet<'facet> + ?Sized,

Returns a read-only view over a T value.

Source

pub unsafe fn unchecked_new( data: PtrConst, shape: &'static Shape, ) -> Peek<'mem, 'facet>

Returns a read-only view over a value (given its shape), trusting you that those two match.

§Safety

This function is unsafe because it doesn’t check if the provided data and shape are compatible. The caller must ensure that the data is valid for the given shape.

Source

pub fn variance(&self) -> Variance

Returns the computed variance of the underlying type.

This walks the type’s fields to determine if the type is covariant, contravariant, or invariant over its lifetime parameter.

Source

pub fn shrink_lifetime<'shorter>(self) -> Peek<'mem, 'shorter>
where 'facet: 'shorter,

Shrinks the 'facet lifetime parameter.

This is safe for covariant types: if data is valid for 'static, it’s also valid for any shorter lifetime 'shorter.

§Panics

Panics if the type is not covariant (i.e., if shrinking would be unsound).

Source

pub fn try_shrink_lifetime<'shorter>(self) -> Option<Peek<'mem, 'shorter>>
where 'facet: 'shorter,

Tries to shrink the 'facet lifetime parameter.

Returns Some if the type is covariant (shrinking is safe), or None if the type is invariant or contravariant.

Source

pub fn grow_lifetime<'longer>(self) -> Peek<'mem, 'longer>
where 'longer: 'facet,

Grows the 'facet lifetime parameter.

This is safe for contravariant types: if a function accepts 'short, it can also accept 'longer (a longer lifetime is more restrictive).

§Panics

Panics if the type is not contravariant (i.e., if growing would be unsound).

Source

pub fn try_grow_lifetime<'longer>(self) -> Option<Peek<'mem, 'longer>>
where 'longer: 'facet,

Tries to grow the 'facet lifetime parameter.

Returns Some if the type is contravariant (growing is safe), or None if the type is invariant or covariant.

Source

pub fn vtable(&self) -> VTableErased

Returns the vtable

Source

pub fn id(&self) -> ValueId

Returns a unique identifier for this value, usable for cycle detection

Source

pub fn ptr_eq(&self, other: &Peek<'_, '_>) -> bool

Returns true if the two values are pointer-equal

Source

pub fn partial_eq(&self, other: &Peek<'_, '_>) -> Result<bool, ReflectError>

Returns true if this scalar is equal to the other scalar

§Returns

false if equality comparison is not supported for this scalar type

Source

pub fn partial_cmp( &self, other: &Peek<'_, '_>, ) -> Result<Option<Ordering>, ReflectError>

Compares this scalar with another and returns their ordering

§Returns

None if comparison is not supported for this scalar type

Source

pub fn hash(&self, hasher: &mut dyn Hasher) -> Result<(), ReflectError>

Hashes this scalar using the vtable hash function.

§Returns

Err if hashing is not supported for this scalar type, Ok otherwise

Source

pub fn structural_hash<H>(&self, hasher: &mut H)
where H: Hasher,

Computes a structural hash of this value.

Unlike hash, this method recursively traverses the structure and hashes each component, making it work for types that don’t implement Hash.

For scalars with a vtable hash function, it uses that. For compound types (structs, enums, lists, etc.), it recursively hashes the structure.

This is useful for Merkle-tree style hashing where you want to compare subtrees for equality based on their structural content.

Source

pub fn type_name( &self, f: &mut Formatter<'_>, opts: TypeNameOpts, ) -> Result<(), Error>

Returns the type name of this scalar

§Arguments
  • f - A mutable reference to a core::fmt::Formatter
  • opts - The TypeNameOpts to use for formatting
§Returns

The result of the type name formatting

Source

pub const fn shape(&self) -> &'static Shape

Returns the shape

Source

pub const fn data(&self) -> PtrConst

Returns the data

Source

pub fn scalar_type(&self) -> Option<ScalarType>

Get the scalar type if set.

Source

pub fn get<T>(&self) -> Result<&'mem T, ReflectError>
where T: Facet<'facet> + ?Sized,

Read the value from memory into a Rust value.

§Panics

Panics if the shape doesn’t match the type T.

Source

pub fn as_str(&self) -> Option<&'mem str>

Try to get the value as a string if it’s a string type Returns None if the value is not a string or couldn’t be extracted

Source

pub fn as_bytes(&self) -> Option<&'mem [u8]>

Try to get the value as a byte slice if it’s a &u8 type Returns None if the value is not a byte slice or couldn’t be extracted

Source

pub fn into_struct(self) -> Result<PeekStruct<'mem, 'facet>, ReflectError>

Tries to identify this value as a struct

Source

pub fn into_enum(self) -> Result<PeekEnum<'mem, 'facet>, ReflectError>

Tries to identify this value as an enum

Source

pub fn into_map(self) -> Result<PeekMap<'mem, 'facet>, ReflectError>

Tries to identify this value as a map

Source

pub fn into_set(self) -> Result<PeekSet<'mem, 'facet>, ReflectError>

Tries to identify this value as a set

Source

pub fn into_list(self) -> Result<PeekList<'mem, 'facet>, ReflectError>

Tries to identify this value as a list

Source

pub fn into_ndarray(self) -> Result<PeekNdArray<'mem, 'facet>, ReflectError>

Tries to identify this value as a ndarray

Source

pub fn into_list_like(self) -> Result<PeekListLike<'mem, 'facet>, ReflectError>

Tries to identify this value as a list, array or slice

Source

pub fn into_pointer(self) -> Result<PeekPointer<'mem, 'facet>, ReflectError>

Tries to identify this value as a pointer

Source

pub fn into_option(self) -> Result<PeekOption<'mem, 'facet>, ReflectError>

Tries to identify this value as an option

Source

pub fn into_result(self) -> Result<PeekResult<'mem, 'facet>, ReflectError>

Tries to identify this value as a result

Source

pub fn into_tuple(self) -> Result<PeekTuple<'mem, 'facet>, ReflectError>

Tries to identify this value as a tuple

Source

pub fn into_dynamic_value( self, ) -> Result<PeekDynamicValue<'mem, 'facet>, ReflectError>

Tries to identify this value as a dynamic value (like facet_value::Value)

Source

pub fn innermost_peek(self) -> Peek<'mem, 'facet>

Tries to return the innermost value — useful for serialization. For example, we serialize a NonZero<u8> the same as a u8. Similarly, we serialize a Utf8PathBuf the same as a `String.

Returns a Peek to the innermost value, unwrapping transparent wrappers recursively. For example, this will peel through newtype wrappers or smart pointers that have an inner.

Source

pub fn custom_serialization( &self, field: Field, ) -> Result<OwnedPeek<'mem>, ReflectError>

Available on crate feature alloc only.

Performs custom serialization of the current peek using the provided field’s metadata.

Returns an OwnedPeek that points to the final type that should be serialized in place of the current peek.

Source

pub fn custom_serialization_from_shape( &self, ) -> Result<Option<OwnedPeek<'mem>>, ReflectError>

Available on crate feature alloc only.

Returns an OwnedPeek using the shape’s container-level proxy for serialization.

This is used when a type has #[facet(proxy = ProxyType)] at the container level. Unlike field-level proxies which are checked via custom_serialization(field), this method checks the Shape itself for a proxy definition.

Returns None if the shape has no container-level proxy.

Trait Implementations§

Source§

impl<'mem, 'facet> Clone for Peek<'mem, 'facet>

Source§

fn clone(&self) -> Peek<'mem, 'facet>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'mem, 'facet> Debug for Peek<'mem, 'facet>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<'mem, 'facet> Display for Peek<'mem, 'facet>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<'mem, 'facet> Hash for Peek<'mem, 'facet>

Source§

fn hash<H>(&self, hasher: &mut H)
where H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<'mem, 'facet> PartialEq for Peek<'mem, 'facet>

Source§

fn eq(&self, other: &Peek<'mem, 'facet>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<'mem, 'facet> PartialOrd for Peek<'mem, 'facet>

Source§

fn partial_cmp(&self, other: &Peek<'mem, 'facet>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl<'mem, 'facet> Copy for Peek<'mem, 'facet>

Auto Trait Implementations§

§

impl<'mem, 'facet> Freeze for Peek<'mem, 'facet>

§

impl<'mem, 'facet> RefUnwindSafe for Peek<'mem, 'facet>

§

impl<'mem, 'facet> !Send for Peek<'mem, 'facet>

§

impl<'mem, 'facet> !Sync for Peek<'mem, 'facet>

§

impl<'mem, 'facet> Unpin for Peek<'mem, 'facet>

§

impl<'mem, 'facet> UnwindSafe for Peek<'mem, 'facet>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.