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>
impl<T> Sequestered<T>
Sourcepub fn release(sequestered: Self) -> T
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>
impl<T: Clone> Clone for Sequestered<T>
Source§fn clone(&self) -> Sequestered<T>
fn clone(&self) -> Sequestered<T>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<T: Debug> Debug for Sequestered<T>
impl<T: Debug> Debug for Sequestered<T>
Source§impl<T> From<T> for Sequestered<T>
impl<T> From<T> for Sequestered<T>
Source§impl<T: PartialEq> PartialEq for Sequestered<T>
impl<T: PartialEq> PartialEq for Sequestered<T>
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)