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. Call Self::load_persist at application startup to populate it from KV.

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 async 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. Call once at application startup, before exposing the data model to commissioners, so subsequent reads see the labels written before the last reboot.

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

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