use zb_core::GroupId;
use zb_core::destination::Device;
use zb_core::types::{String, Uint16};
use zb_zcl::groups::{AddGroup, GetGroupMembership, GetGroupMembershipResponse, RemoveGroup};
use crate::{Error, StatusExt, Zcl, ZclResponse};
pub trait Groups {
fn list(
&self,
device: Device,
) -> impl Future<Output = Result<ZclResponse<GetGroupMembershipResponse>, Error>> + Send;
fn add(
&self,
device: Device,
group_id: GroupId,
name: Option<String>,
) -> impl Future<Output = Result<Uint16, Error>> + Send;
fn remove(
&self,
device: Device,
group_id: GroupId,
) -> impl Future<Output = Result<Uint16, Error>> + Send;
}
impl<T> Groups for T
where
T: Zcl + Sync,
{
async fn list(&self, device: Device) -> Result<ZclResponse<GetGroupMembershipResponse>, Error> {
self.communicate(device, GetGroupMembership::default())
.await
}
async fn add(
&self,
device: Device,
group_id: GroupId,
name: Option<String>,
) -> Result<Uint16, Error> {
let response = self
.communicate(device, AddGroup::new(group_id, name.unwrap_or_default()))
.await?
.await?;
response
.status()
.ensure_success()
.map(|()| response.group_id())
}
async fn remove(&self, device: Device, group_id: GroupId) -> Result<Uint16, Error> {
let response = self
.communicate(device, RemoveGroup::new(group_id))
.await?
.await?;
response
.status()
.ensure_success()
.map(|()| response.group_id())
}
}