use core::fmt;
use crate::error::Error;
use crate::im::{AttrPath, DataVersionFilter, EventFilter, EventPath};
use crate::tlv::{FromTLV, TLVArray, TLVElement, ToTLV};
#[derive(Clone, PartialEq, Eq, Hash, FromTLV, ToTLV)]
#[tlvargs(lifetime = "'a")]
pub struct ReadReq<'a>(TLVElement<'a>);
impl<'a> ReadReq<'a> {
pub const fn new(element: TLVElement<'a>) -> Self {
Self(element)
}
pub fn attr_requests(&self) -> Result<Option<TLVArray<'a, AttrPath>>, Error> {
Option::from_tlv(&self.0.r#struct()?.find_ctx(0)?)
}
pub fn event_requests(&self) -> Result<Option<TLVArray<'a, EventPath>>, Error> {
Option::from_tlv(&self.0.r#struct()?.find_ctx(1)?)
}
pub fn event_filters(&self) -> Result<Option<TLVArray<'a, EventFilter>>, Error> {
Option::from_tlv(&self.0.r#struct()?.find_ctx(2)?)
}
pub fn fabric_filtered(&self) -> Result<bool, Error> {
self.0.r#struct()?.find_ctx(3)?.bool()
}
pub fn dataver_filters(&self) -> Result<Option<TLVArray<'a, DataVersionFilter>>, Error> {
Option::from_tlv(&self.0.r#struct()?.find_ctx(4)?)
}
}
impl fmt::Debug for ReadReq<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("ReadReqRef")
.field("attr_requests", &self.attr_requests())
.field("event_requests", &self.event_requests())
.field("event_filters", &self.event_filters())
.field("fabric_filtered", &self.fabric_filtered())
.field("dataver_filters", &self.dataver_filters())
.finish()
}
}
#[cfg(feature = "defmt")]
impl defmt::Format for ReadReq<'_> {
fn format(&self, f: defmt::Formatter<'_>) {
defmt::write!(f,
"ReadReqRef {{\n attr_requests: {:?},\n event_requests: {:?},\n event_filters: {:?},\n fabric_filtered: {:?},\n dataver_filters: {:?},\n}}",
self.attr_requests(),
self.event_requests(),
self.event_filters(),
self.fabric_filtered(),
self.dataver_filters(),
)
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[repr(u8)]
pub enum ReadReqTag {
AttrRequests = 0,
EventRequests = 1,
EventFilters = 2,
FabricFiltered = 3,
DataVersionFilters = 4,
}