Skip to main content

UserLabels

Struct UserLabels 

Source
pub struct UserLabels<const E: usize, const N: usize = 4> { /* private fields */ }
Expand description

Shared registry of every endpoint’s UserLabel LabelList.

Persisted as a single TLV blob under USER_LABELS_KEY — every successful write to any UserLabelHandler re-serialises the whole registry and stores it. Read paths take the lock briefly to copy labels into the TLV builder.

Const generics:

  • E — max number of endpoints that may have a LabelList. Bound on the in-memory Vec of per-endpoint slots.
  • N — max number of LabelEntry rows per endpoint. Bound on each slot’s inner Vec. Defaults to 4.

Lock holds are bounded — the Mutex<RefCell<_>> is never held across an .await, so the registry is sound under a work-stealing executor.

Implementations§

Source§

impl<const E: usize, const N: usize> UserLabels<E, N>

Source

pub const fn new() -> UserLabels<E, N>

Create an empty registry. It is populated from KV at startup via Self::load_persist, driven by the LifecycleOp::Startup lifecycle operation delivered to the data model.

Prefer Self::init for non-trivial E * N so the registry’s storage can be initialised in-place (typically in a StaticCell) instead of being constructed on the stack and moved. The two paths produce structurally identical instances.

Source

pub fn init() -> impl Init<UserLabels<E, N>>

Return an in-place initialiser for an empty registry. Use this when E * N * size_of::<LabelEntry> is large enough that stack-constructing a Self::new instance and moving it into long-lived storage would overflow the stack or bloat .rodata. Typical usage:

static USER_LABELS: StaticCell<UserLabels<8, 4>> = StaticCell::new();
let user_labels = USER_LABELS.uninit().init_with(UserLabels::init());
Source

pub fn load_persist<S>(&self, store: S, buf: &mut [u8]) -> Result<(), Error>
where S: KvBlobStore,

Re-hydrate the registry from store under USER_LABELS_KEY, so subsequent reads see the labels written before the last reboot.

Called on startup via the LifecycleOp::Startup lifecycle operation delivered to the UserLabelHandler instance(s) borrowing this registry.

Missing key (first boot, or persistence cleared) is not an error — the registry simply stays empty.

Source

pub fn reset_persist<S>(&self, store: S, buf: &mut [u8]) -> Result<(), Error>
where S: KvBlobStore,

Reset the registry to empty and remove its persisted blob from store (under USER_LABELS_KEY).

Called on factory reset via the LifecycleOp::FactoryReset lifecycle operation delivered to the UserLabelHandler instance(s) borrowing this registry.

Trait Implementations§

Source§

impl<const E: usize, const N: usize> Default for UserLabels<E, N>

Source§

fn default() -> UserLabels<E, N>

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<const E: usize, const N: usize = 4> !Freeze for UserLabels<E, N>

§

impl<const E: usize, const N: usize = 4> !RefUnwindSafe for UserLabels<E, N>

§

impl<const E: usize, const N: usize = 4> !Sync for UserLabels<E, N>

§

impl<const E: usize, const N: usize> Send for UserLabels<E, N>

§

impl<const E: usize, const N: usize> Unpin for UserLabels<E, N>

§

impl<const E: usize, const N: usize> UnsafeUnpin for UserLabels<E, N>

§

impl<const E: usize, const N: usize> UnwindSafe for UserLabels<E, N>

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, E> Init<T, E> for T

Source§

unsafe fn __init(self, slot: *mut T) -> Result<(), E>

Initializes slot. Read more
Source§

fn chain<F>(self, f: F) -> ChainInit<Self, F, T, E>
where F: FnOnce(&mut T) -> Result<(), E>,

First initializes the value using self then calls the function f with the initialized value. 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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T, I> IntoFallibleInit<T> for I
where I: Init<T>,

Source§

fn into_fallible<E>(self) -> impl Init<T, E>

Convert the infallible initializer to a fallible one.
Source§

impl<Source, Target> OctetsInto<Target> for Source
where Target: OctetsFrom<Source>,

Source§

type Error = <Target as OctetsFrom<Source>>::Error

Source§

fn try_octets_into( self, ) -> Result<Target, <Source as OctetsInto<Target>>::Error>

Performs the conversion.
Source§

fn octets_into(self) -> Target
where Self::Error: Into<Infallible>,

Performs an infallible conversion.
Source§

impl<T, E> PinInit<T, E> for T

Source§

unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), E>

Initializes slot. Read more
Source§

fn pin_chain<F>(self, f: F) -> ChainPinInit<Self, F, T, E>
where F: FnOnce(Pin<&mut T>) -> Result<(), E>,

First initializes the value using self then calls the function f with the initialized value. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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

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

Source§

fn vzip(self) -> V