pub struct Sequestered<T>(/* private fields */);
Expand description

Isolates data such that it is inaccessible without explicitly releasing it.

Sequestered data cannot be directly read nor written while contained (though it can be trivially replaced). This is useful for data that must be “ferried” through a system but should not generally be examined nor inspected, in particular when inspection of the data would otherwise seem innocuous but implicitly violates a design contract or introduces an unwanted data dependency.

This type cannot completely prevent reads and writes. Rather, it makes reads and writes very explicit and more obvious in order to avoid mistakes in data APIs.

Sequestering data is trivial and is done via the core From and Into traits. Releasing data is intentionally more explicit and requires the use of fully-qualified syntax that names the Sequestered type.

As sequestered data is considered a “black box”, Sequestered only implements the Clone and Debug traits (so long as the type T provides implementations). Note that Copy is not implemented, because releasing data would not be strictly affine and data could be implicitly copied out of fields via release. This is not only implicit, but can be counterintuitive in some contexts, because release moves a copy of the Sequestered.

Sequestered also implements PartialEq largely for testing. See https://fxbug.dev/42067751.

Implementations§

source§

impl<T> Sequestered<T>

source

pub fn release(sequestered: Self) -> T

Releases the sequestered data.

Releasing should be performed sparingly, carefully, and typically at API boundaries where there is no longer a need to prevent reads of the data. Releases, which are explicit, should be given extra scrutiny, somewhat like unsafe code.

This function does not use a receiver and so requires fully-qualified syntax in order to make releases more explicit and obvious.

§Examples
// Sequester data.
let text: Sequestered<&'static str> = "lorem ipsum".into();
// Release data. The fully-qualified syntax is required.
let text = Sequestered::release(text);

Trait Implementations§

source§

impl<T: Clone> Clone for Sequestered<T>

source§

fn clone(&self) -> Sequestered<T>

Returns a copy 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<T: Debug> Debug for Sequestered<T>

source§

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

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

impl<T> From<T> for Sequestered<T>

source§

fn from(inner: T) -> Self

Converts to this type from the input type.
source§

impl<T: PartialEq> PartialEq for Sequestered<T>

source§

fn eq(&self, other: &Sequestered<T>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

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

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<T> StructuralPartialEq for Sequestered<T>

Auto Trait Implementations§

§

impl<T> Freeze for Sequestered<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for Sequestered<T>
where T: RefUnwindSafe,

§

impl<T> Send for Sequestered<T>
where T: Send,

§

impl<T> Sync for Sequestered<T>
where T: Sync,

§

impl<T> Unpin for Sequestered<T>
where T: Unpin,

§

impl<T> UnwindSafe for Sequestered<T>
where T: UnwindSafe,

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
§

impl<T> Encode<Ambiguous1> for T

§

unsafe fn encode( self, _encoder: &mut Encoder<'_>, _offset: usize, _depth: Depth ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
§

impl<T> Encode<Ambiguous2> for T

§

unsafe fn encode( self, _encoder: &mut Encoder<'_>, _offset: usize, _depth: Depth ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
source§

impl<T> From<!> for T

source§

fn from(t: !) -> T

Converts to this type from the input type.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> OptionalField for T
where T: ?Sized,

source§

const PRESENT: Presence<Self> = _

source§

const ABSENT: Presence<Self> = _

§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

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

§

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, U> TryFrom<U> for T
where U: Into<T>,

§

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>,

§

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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more