pub struct AttrDataBuilder<P, const F: usize = 0> { /* private fields */ }Expand description
Streaming builder for a single AttrData entry inside the
WriteRequests array.
Field-state values:
0: nothing written yet1:DataVersiondecided2:Pathwritten3:Datawritten (struct can be closed)
Implementations§
Source§impl<P> AttrDataBuilder<P>where
P: TLVBuilderParent,
impl<P> AttrDataBuilder<P>where
P: TLVBuilderParent,
Source§impl<P> AttrDataBuilder<P>where
P: TLVBuilderParent,
impl<P> AttrDataBuilder<P>where
P: TLVBuilderParent,
Sourcepub fn data_version(self, value: u32) -> Result<AttrDataBuilder<P, 1>, Error>
pub fn data_version(self, value: u32) -> Result<AttrDataBuilder<P, 1>, Error>
Write the optional DataVersion field — used for
optimistic-concurrency writes that should fail on stale data.
Omit (don’t call) for unconditional writes; subsequent path*
methods are also available on state 0 and implicitly skip
this field.
Source§impl<P> AttrDataBuilder<P>where
P: TLVBuilderParent,
impl<P> AttrDataBuilder<P>where
P: TLVBuilderParent,
Sourcepub fn path(
self,
endpoint: u16,
cluster: u32,
attr: u32,
) -> Result<AttrDataBuilder<P, 2>, Error>
pub fn path( self, endpoint: u16, cluster: u32, attr: u32, ) -> Result<AttrDataBuilder<P, 2>, Error>
Write the concrete (endpoint, cluster, attribute) path,
implicitly skipping DataVersion.
Sourcepub fn path_from(self, path: &AttrPath) -> Result<AttrDataBuilder<P, 2>, Error>
pub fn path_from(self, path: &AttrPath) -> Result<AttrDataBuilder<P, 2>, Error>
Write the path from an existing crate::im::AttrPath,
implicitly skipping DataVersion. Used by the
snapshot→streaming bridge in ImClient::write.
Source§impl<P> AttrDataBuilder<P, 1>where
P: TLVBuilderParent,
impl<P> AttrDataBuilder<P, 1>where
P: TLVBuilderParent,
Sourcepub fn path(
self,
endpoint: u16,
cluster: u32,
attr: u32,
) -> Result<AttrDataBuilder<P, 2>, Error>
pub fn path( self, endpoint: u16, cluster: u32, attr: u32, ) -> Result<AttrDataBuilder<P, 2>, Error>
Write the concrete (endpoint, cluster, attribute) path. This
is the typical shape for attribute writes; wildcards aren’t
generally meaningful for writes and aren’t exposed here. The
path is encoded as a list (per spec AttributePathIB).
Sourcepub fn path_from(self, path: &AttrPath) -> Result<AttrDataBuilder<P, 2>, Error>
pub fn path_from(self, path: &AttrPath) -> Result<AttrDataBuilder<P, 2>, Error>
Write the path from an existing crate::im::AttrPath. Used
by the snapshot→streaming bridge in ImClient::write so the
pre-built AttrPath (which may carry wildcards or
list_index) is re-emitted faithfully. New call sites should
prefer Self::path.
Source§impl<P> AttrDataBuilder<P, 2>where
P: TLVBuilderParent,
impl<P> AttrDataBuilder<P, 2>where
P: TLVBuilderParent,
Sourcepub fn data<F>(self, f: F) -> Result<AttrDataBuilder<P, 3>, Error>
pub fn data<F>(self, f: F) -> Result<AttrDataBuilder<P, 3>, Error>
Write the attribute value into the Data slot.
Per Matter Core spec AttributeDataIB.Data is “any
TLV value.” The closure receives the parent’s TLVWrite and
must emit exactly one TLV element tagged
TLVTag::Context(2) (i.e. AttrDataTag::Data). The IM-level
builder can’t enforce the inner type because the schema lives
in the attribute the path named, not the IM message; the
closure body is where the caller asserts the schema match
(typically by calling a codegen-emitted typed writer).
Idiomatic call patterns:
// Any `T: ToTLV`:
.data(|w| 60u16.to_tlv(&TLVTag::Context(AttrDataTag::Data as u8), w))?
// A bool, raw:
.data(|w| w.bool(&TLVTag::Context(AttrDataTag::Data as u8), true))?
// A codegen-emitted typed helper that already knows the tag:
.data(|w| on_off::write_on_time_value(60u16, w))?Sourcepub fn data_builder<B>(self) -> Result<B, Error>where
B: TLVBuilder<AttrDataBuilder<P, 3>>,
pub fn data_builder<B>(self) -> Result<B, Error>where
B: TLVBuilder<AttrDataBuilder<P, 3>>,
Open the Data slot as a typed sub-builder.
Closure-free counterpart to data — hand back
the codegen-emitted typed value builder for the attribute,
already opened at AttrDataTag::Data. The caller fills the
value, then calls .end() on the sub-builder; that close
writes Data’s closing tag (for struct/array-valued attrs)
and yields an AttrDataBuilder<P, 3>. The caller then
.end()s once more to close the AttrData entry struct
(the “double-end” pattern of the IM-client glue).
Useful for struct- or array-valued attributes (e.g. ACL
entries). For scalars prefer the closure-based [data].
Soundness of the phantom typestate advance: see
[CmdDataBuilder::data_builder].
Source§impl<P> AttrDataBuilder<P, 3>where
P: TLVBuilderParent,
impl<P> AttrDataBuilder<P, 3>where
P: TLVBuilderParent,
Trait Implementations§
Source§impl<P> TLVBuilder<P> for AttrDataBuilder<P>where
P: TLVBuilderParent,
impl<P> TLVBuilder<P> for AttrDataBuilder<P>where
P: TLVBuilderParent,
Source§impl<P, const F: usize> TLVBuilderParent for AttrDataBuilder<P, F>where
P: TLVBuilderParent,
impl<P, const F: usize> TLVBuilderParent for AttrDataBuilder<P, F>where
P: TLVBuilderParent,
Source§type Write = <P as TLVBuilderParent>::Write
type Write = <P as TLVBuilderParent>::Write
Source§fn writer(&mut self) -> &mut <AttrDataBuilder<P, F> as TLVBuilderParent>::Write
fn writer(&mut self) -> &mut <AttrDataBuilder<P, F> as TLVBuilderParent>::Write
Auto Trait Implementations§
impl<P, const F: usize> Freeze for AttrDataBuilder<P, F>where
P: Freeze,
impl<P, const F: usize> RefUnwindSafe for AttrDataBuilder<P, F>where
P: RefUnwindSafe,
impl<P, const F: usize> Send for AttrDataBuilder<P, F>where
P: Send,
impl<P, const F: usize> Sync for AttrDataBuilder<P, F>where
P: Sync,
impl<P, const F: usize> Unpin for AttrDataBuilder<P, F>where
P: Unpin,
impl<P, const F: usize> UnsafeUnpin for AttrDataBuilder<P, F>where
P: UnsafeUnpin,
impl<P, const F: usize> UnwindSafe for AttrDataBuilder<P, F>where
P: 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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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