Skip to main content

Peek

Struct Peek 

Source
pub struct Peek<'mem, 'facet> { /* private fields */ }
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 with respect to '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: Facet<'facet> + ?Sized>(t: &'mem T) -> Self

Returns a read-only view over a T value.

Source

pub unsafe fn unchecked_new(data: PtrConst, shape: &'static Shape) -> Self

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 with respect to 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 and bivariant types: if data is valid for 'static, it’s also valid for any shorter lifetime 'shorter.

From the Rust Reference:

  • Covariant types can shrink lifetimes ('static'a)
  • Bivariant types can go either direction (no lifetime constraints)
§Panics

Panics if the type cannot shrink lifetimes (i.e., if it’s contravariant or invariant).

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 can shrink lifetimes (covariant or bivariant), or None if the type is invariant or contravariant.

See Variance::can_shrink for details.

Source

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

Grows the 'facet lifetime parameter.

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

From the Rust Reference:

  • Contravariant types can grow lifetimes ('a'static)
  • Bivariant types can go either direction (no lifetime constraints)
§Panics

Panics if the type cannot grow lifetimes (i.e., if it’s covariant or invariant).

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 can grow lifetimes (contravariant or bivariant), or None if the type is invariant or covariant.

See Variance::can_grow for details.

Source

pub const 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: Hasher>(&self, hasher: &mut H)

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

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: Facet<'facet> + ?Sized>(&self) -> Result<&'mem T, ReflectError>

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 const fn into_struct(self) -> Result<PeekStruct<'mem, 'facet>, ReflectError>

Tries to identify this value as a struct

Source

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

Tries to identify this value as an enum

Source

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

Tries to identify this value as a map

Source

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

Tries to identify this value as a set

Source

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

Tries to identify this value as a list

Source

pub const 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 const fn into_pointer( self, ) -> Result<PeekPointer<'mem, 'facet>, ReflectError>

Tries to identify this value as a pointer

Source

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

Tries to identify this value as an option

Source

pub const 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 const 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) -> Self

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>

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_with_proxy( &self, proxy_def: &'static ProxyDef, ) -> Result<OwnedPeek<'mem>, ReflectError>

Performs custom serialization using a specific proxy definition.

This is a lower-level method that takes a ProxyDef directly, useful when the caller has already resolved which proxy to use (e.g., via effective_proxy()).

Source

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

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.

Source

pub fn custom_serialization_from_shape_with_format( &self, format_namespace: Option<&str>, ) -> Result<Option<OwnedPeek<'mem>>, ReflectError>

Returns an OwnedPeek using the shape’s container-level proxy for serialization, with support for format-specific proxies.

If format_namespace is provided (e.g., Some("xml")), looks for a format-specific proxy first, falling back to the format-agnostic proxy.

Returns None if no applicable proxy is found.

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

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

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

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

Source§

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

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: &Self) -> 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: &Self) -> 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.