Skip to main content

CmdDataBuilder

Struct CmdDataBuilder 

Source
pub struct CmdDataBuilder<P, const F: usize = 0> { /* private fields */ }
Expand description

Streaming builder for one CmdData entry inside the InvokeRequests array.

Field-state values:

  • 0: nothing written yet
  • 1: past Path
  • 2: past Data (struct can be closed)
  • 3: past CommandRef

Implementations§

Source§

impl<P> CmdDataBuilder<P>

Source

pub fn new(p: P, tag: &TLVTag) -> Result<CmdDataBuilder<P>, Error>

Begin a new CmdData entry — opens a struct at the given tag. Use &TLVTag::Anonymous when pushed into an InvokeRequests array (the typical case).

Source§

impl<P> CmdDataBuilder<P>

Source

pub fn path( self, endpoint: u16, cluster: u32, cmd: u32, ) -> Result<CmdDataBuilder<P, 1>, Error>

Write the concrete (endpoint, cluster, command) path. Wildcards aren’t meaningful for invokes — every send targets a concrete (endpoint, cluster, command) triple. The path is encoded as a list per spec CommandPathIB.

Source

pub fn path_from(self, path: &CmdPath) -> Result<CmdDataBuilder<P, 1>, Error>

Write the path from an existing crate::im::CmdPath. Used by the snapshot→streaming bridge in ImClient::invoke.

Source§

impl<P> CmdDataBuilder<P, 1>

Source

pub fn data<F>(self, f: F) -> Result<CmdDataBuilder<P, 2>, Error>
where F: FnOnce(&mut <P as TLVBuilderParent>::Write) -> Result<(), Error>,

Write the command request body into the Data slot.

Per Matter Core spec CommandDataIB.Data is the command’s request payload — any TLV element tagged TLVTag::Context(1) (= CmdDataTag::Data). For commands with no request fields (e.g. OnOff::On, OnOff::Toggle) the data slot is still required: write an empty struct.

Idiomatic call patterns:

// No-payload command (e.g. OnOff::Toggle):
.data(|w| {
    w.start_struct(&TLVTag::Context(CmdDataTag::Data as u8))?;
    w.end_container()
})?

// Any `T: ToTLV` request body:
.data(|w| req.to_tlv(&TLVTag::Context(CmdDataTag::Data as u8), w))?

// Via a codegen-emitted typed request builder:
.data(|w| MoveToHueRequestBuilder::new(w, ...)?
            .hue(180)? .direction(...)? .end())?
Source

pub fn data_builder<B>(self) -> Result<B, Error>
where B: TLVBuilder<CmdDataBuilder<P, 2>>,

Open the Data slot as a typed sub-builder.

Closure-free counterpart to data — hand back the codegen-emitted request builder for the command, already opened at CmdDataTag::Data. The caller fills the request fields, then calls .end() on the sub-builder; that close writes Data’s closing tag and yields a CmdDataBuilder<P, 2>. The caller then .end()s once more to close the CmdData entry struct itself (the “double-end” pattern of the IM-client glue).

Soundness of the phantom typestate advance: B::new is contractually required (by TLVBuilder) to open exactly one container at the supplied tag, and B’s terminal .end() closes it. So by the time the caller observes the returned CmdDataBuilder<P, 2>, the Data field has been fully written and the typestate matches the wire state.

Source§

impl<P> CmdDataBuilder<P, 2>

Source

pub fn command_ref(self, value: u16) -> Result<CmdDataBuilder<P, 3>, Error>

Write the optional CommandRef field. Mandatory when the InvokeRequests array carries more than one entry (per spec - the server echoes this back so the client can correlate responses to requests). For single-command invokes, omit (go straight to .end()).

Source§

impl<P> CmdDataBuilder<P, 2>

Source

pub fn end(self) -> Result<P, Error>

Close the CmdData struct, implicitly skipping CommandRef. Returns the array builder so the caller can .push() another entry or .end() the array.

Source§

impl<P> CmdDataBuilder<P, 3>

Source

pub fn end(self) -> Result<P, Error>

Close the CmdData struct and return the array builder.

Trait Implementations§

Source§

impl<P, const F: usize> Debug for CmdDataBuilder<P, F>
where P: Debug,

Source§

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

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

impl<P> TLVBuilder<P> for CmdDataBuilder<P>

Source§

fn new(parent: P, tag: &TLVTag) -> Result<CmdDataBuilder<P>, Error>

Create a new TLV builder for the given parent and tag.
Source§

fn unchecked_into_parent(self) -> P

Convert itself into a writer. Read more
Source§

fn with<F>(self, f: F) -> Result<P, Error>
where F: FnOnce(Self) -> Result<P, Error>,

Call a closure with the builder and return the result.
Source§

impl<P, const F: usize> TLVBuilderParent for CmdDataBuilder<P, F>

Source§

type Write = <P as TLVBuilderParent>::Write

The type of the writer.
Source§

fn writer(&mut self) -> &mut <CmdDataBuilder<P, F> as TLVBuilderParent>::Write

Return a mutable reference to the writer.

Auto Trait Implementations§

§

impl<P, const F: usize> Freeze for CmdDataBuilder<P, F>
where P: Freeze,

§

impl<P, const F: usize> RefUnwindSafe for CmdDataBuilder<P, F>
where P: RefUnwindSafe,

§

impl<P, const F: usize> Send for CmdDataBuilder<P, F>
where P: Send,

§

impl<P, const F: usize> Sync for CmdDataBuilder<P, F>
where P: Sync,

§

impl<P, const F: usize> Unpin for CmdDataBuilder<P, F>
where P: Unpin,

§

impl<P, const F: usize> UnsafeUnpin for CmdDataBuilder<P, F>
where P: UnsafeUnpin,

§

impl<P, const F: usize> UnwindSafe for CmdDataBuilder<P, F>
where P: 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
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