use crate::error::Error;
use crate::im::{
AttrPath, AttrPathArrayBuilder, DataVersionFilter, EventFilter, EventPath, SubscribeReqTag,
IM_REVISION,
};
use crate::tlv::{TLVBuilder, TLVBuilderParent, TLVTag, TLVWrite, ToTLV};
pub struct SubscribeReqBuilder<P, const F: usize = 0> {
p: P,
}
impl<P> SubscribeReqBuilder<P, 0>
where
P: TLVBuilderParent,
{
pub fn new(mut p: P, tag: &TLVTag) -> Result<Self, Error> {
p.writer().start_struct(tag)?;
Ok(Self { p })
}
}
impl<P> TLVBuilder<P> for SubscribeReqBuilder<P, 0>
where
P: TLVBuilderParent,
{
fn new(parent: P, tag: &TLVTag) -> Result<Self, Error> {
Self::new(parent, tag)
}
fn unchecked_into_parent(self) -> P {
self.p
}
}
impl<P> SubscribeReqBuilder<P, 0>
where
P: TLVBuilderParent,
{
pub fn keep_subs(mut self, value: bool) -> Result<SubscribeReqBuilder<P, 1>, Error> {
self.p
.writer()
.bool(&TLVTag::Context(SubscribeReqTag::KeepSubs as u8), value)?;
Ok(SubscribeReqBuilder { p: self.p })
}
}
impl<P> SubscribeReqBuilder<P, 1>
where
P: TLVBuilderParent,
{
pub fn min_int_floor(mut self, value: u16) -> Result<SubscribeReqBuilder<P, 2>, Error> {
self.p
.writer()
.u16(&TLVTag::Context(SubscribeReqTag::MinIntFloor as u8), value)?;
Ok(SubscribeReqBuilder { p: self.p })
}
}
impl<P> SubscribeReqBuilder<P, 2>
where
P: TLVBuilderParent,
{
pub fn max_int_ceil(mut self, value: u16) -> Result<SubscribeReqBuilder<P, 3>, Error> {
self.p
.writer()
.u16(&TLVTag::Context(SubscribeReqTag::MaxIntCeil as u8), value)?;
Ok(SubscribeReqBuilder { p: self.p })
}
}
impl<P> SubscribeReqBuilder<P, 3>
where
P: TLVBuilderParent,
{
pub fn attr_requests(self) -> Result<AttrPathArrayBuilder<SubscribeReqBuilder<P, 4>>, Error> {
AttrPathArrayBuilder::new(
SubscribeReqBuilder { p: self.p },
&TLVTag::Context(SubscribeReqTag::AttrRequests as u8),
)
}
pub fn attr_requests_from(
mut self,
paths: &[AttrPath],
) -> Result<SubscribeReqBuilder<P, 4>, Error> {
let w = self.p.writer();
w.start_array(&TLVTag::Context(SubscribeReqTag::AttrRequests as u8))?;
for p in paths {
p.to_tlv(&TLVTag::Anonymous, &mut *w)?;
}
w.end_container()?;
Ok(SubscribeReqBuilder { p: self.p })
}
}
impl<P> SubscribeReqBuilder<P, 3>
where
P: TLVBuilderParent,
{
pub fn event_requests_from(
self,
paths: &[EventPath],
) -> Result<SubscribeReqBuilder<P, 5>, Error> {
SubscribeReqBuilder::<P, 4> { p: self.p }.event_requests_from(paths)
}
}
impl<P> SubscribeReqBuilder<P, 4>
where
P: TLVBuilderParent,
{
pub fn event_requests_from(
mut self,
paths: &[EventPath],
) -> Result<SubscribeReqBuilder<P, 5>, Error> {
let w = self.p.writer();
w.start_array(&TLVTag::Context(SubscribeReqTag::EventRequests as u8))?;
for p in paths {
p.to_tlv(&TLVTag::Anonymous, &mut *w)?;
}
w.end_container()?;
Ok(SubscribeReqBuilder { p: self.p })
}
}
impl<P> SubscribeReqBuilder<P, 3>
where
P: TLVBuilderParent,
{
pub fn event_filters_from(
self,
filters: &[EventFilter],
) -> Result<SubscribeReqBuilder<P, 6>, Error> {
SubscribeReqBuilder::<P, 5> { p: self.p }.event_filters_from(filters)
}
}
impl<P> SubscribeReqBuilder<P, 4>
where
P: TLVBuilderParent,
{
pub fn event_filters_from(
self,
filters: &[EventFilter],
) -> Result<SubscribeReqBuilder<P, 6>, Error> {
SubscribeReqBuilder::<P, 5> { p: self.p }.event_filters_from(filters)
}
}
impl<P> SubscribeReqBuilder<P, 5>
where
P: TLVBuilderParent,
{
pub fn event_filters_from(
mut self,
filters: &[EventFilter],
) -> Result<SubscribeReqBuilder<P, 6>, Error> {
let w = self.p.writer();
w.start_array(&TLVTag::Context(SubscribeReqTag::EventFilters as u8))?;
for ef in filters {
ef.to_tlv(&TLVTag::Anonymous, &mut *w)?;
}
w.end_container()?;
Ok(SubscribeReqBuilder { p: self.p })
}
}
impl<P> SubscribeReqBuilder<P, 3>
where
P: TLVBuilderParent,
{
pub fn fabric_filtered(self, value: bool) -> Result<SubscribeReqBuilder<P, 7>, Error> {
SubscribeReqBuilder::<P, 6> { p: self.p }.fabric_filtered(value)
}
}
impl<P> SubscribeReqBuilder<P, 4>
where
P: TLVBuilderParent,
{
pub fn fabric_filtered(self, value: bool) -> Result<SubscribeReqBuilder<P, 7>, Error> {
SubscribeReqBuilder::<P, 6> { p: self.p }.fabric_filtered(value)
}
}
impl<P> SubscribeReqBuilder<P, 5>
where
P: TLVBuilderParent,
{
pub fn fabric_filtered(self, value: bool) -> Result<SubscribeReqBuilder<P, 7>, Error> {
SubscribeReqBuilder::<P, 6> { p: self.p }.fabric_filtered(value)
}
}
impl<P> SubscribeReqBuilder<P, 6>
where
P: TLVBuilderParent,
{
pub fn fabric_filtered(mut self, value: bool) -> Result<SubscribeReqBuilder<P, 7>, Error> {
self.p.writer().bool(
&TLVTag::Context(SubscribeReqTag::FabricFiltered as u8),
value,
)?;
Ok(SubscribeReqBuilder { p: self.p })
}
}
impl<P> SubscribeReqBuilder<P, 7>
where
P: TLVBuilderParent,
{
pub fn dataver_filters_from(
mut self,
filters: &[DataVersionFilter],
) -> Result<SubscribeReqBuilder<P, 8>, Error> {
let w = self.p.writer();
w.start_array(&TLVTag::Context(SubscribeReqTag::DataVersionFilters as u8))?;
for f in filters {
f.to_tlv(&TLVTag::Anonymous, &mut *w)?;
}
w.end_container()?;
Ok(SubscribeReqBuilder { p: self.p })
}
}
impl<P> SubscribeReqBuilder<P, 7>
where
P: TLVBuilderParent,
{
pub fn end(self) -> Result<P, Error> {
SubscribeReqBuilder::<P, 8> { p: self.p }.end()
}
}
impl<P> SubscribeReqBuilder<P, 7>
where
P: TLVBuilderParent,
{
pub fn interaction_model_revision(self, value: u8) -> Result<SubscribeReqBuilder<P, 9>, Error> {
SubscribeReqBuilder::<P, 8> { p: self.p }.interaction_model_revision(value)
}
}
impl<P> SubscribeReqBuilder<P, 8>
where
P: TLVBuilderParent,
{
pub fn interaction_model_revision(
mut self,
value: u8,
) -> Result<SubscribeReqBuilder<P, 9>, Error> {
self.p.writer().u8(
&TLVTag::Context(crate::im::encoding::IM_REVISION_TAG),
value,
)?;
Ok(SubscribeReqBuilder { p: self.p })
}
pub fn end(self) -> Result<P, Error> {
self.interaction_model_revision(IM_REVISION)?.end()
}
}
impl<P> SubscribeReqBuilder<P, 9>
where
P: TLVBuilderParent,
{
pub fn end(mut self) -> Result<P, Error> {
self.p.writer().end_container()?;
Ok(self.p)
}
}
impl<P, const F: usize> TLVBuilderParent for SubscribeReqBuilder<P, F>
where
P: TLVBuilderParent,
{
type Write = P::Write;
fn writer(&mut self) -> &mut Self::Write {
self.p.writer()
}
}
impl<P, const F: usize> core::fmt::Debug for SubscribeReqBuilder<P, F>
where
P: core::fmt::Debug,
{
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{:?}::SubscribeRequestMessage<{}>", self.p, F)
}
}
#[cfg(feature = "defmt")]
impl<P, const F: usize> defmt::Format for SubscribeReqBuilder<P, F>
where
P: defmt::Format,
{
fn format(&self, fmt: defmt::Formatter<'_>) {
defmt::write!(fmt, "{:?}::SubscribeRequestMessage<{}>", self.p, F);
}
}