use crate::{
api::HueAPIError,
command::{merge_commands, HomeKitCommand, MatterCommand},
service::{Bridge, ResourceIdentifier, ResourceType},
};
use serde::Deserialize;
#[derive(Debug)]
pub struct HomeKit<'a> {
bridge: &'a Bridge,
data: HomeKitData,
}
impl<'a> HomeKit<'a> {
pub fn new(bridge: &'a Bridge, data: HomeKitData) -> Self {
HomeKit { bridge, data }
}
pub fn data(&self) -> &HomeKitData {
&self.data
}
pub fn id(&self) -> &str {
&self.data.id
}
pub fn rid(&self) -> ResourceIdentifier {
self.data.rid()
}
pub async fn send(
&self,
commands: &[HomeKitCommand],
) -> Result<Vec<ResourceIdentifier>, HueAPIError> {
let payload = merge_commands(commands);
self.bridge.api.put_homekit(self.id(), &payload).await
}
}
#[derive(Clone, Debug, Deserialize)]
pub struct HomeKitData {
pub id: String,
pub id_v1: Option<String>,
pub status: HomeKitStatus,
}
impl HomeKitData {
pub fn rid(&self) -> ResourceIdentifier {
ResourceIdentifier {
rid: self.id.to_owned(),
rtype: ResourceType::HomeKit,
}
}
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum HomeKitStatus {
Paired,
Pairing,
Unpaired,
}
#[derive(Debug)]
pub struct Matter<'a> {
bridge: &'a Bridge,
data: MatterData,
}
impl<'a> Matter<'a> {
pub fn new(bridge: &'a Bridge, data: MatterData) -> Self {
Matter { bridge, data }
}
pub fn data(&self) -> &MatterData {
&self.data
}
pub fn id(&self) -> &str {
&self.data.id
}
pub fn rid(&self) -> ResourceIdentifier {
self.data.rid()
}
pub async fn send(
&self,
commands: &[MatterCommand],
) -> Result<Vec<ResourceIdentifier>, HueAPIError> {
let payload = merge_commands(commands);
self.bridge.api.put_matter(self.id(), &payload).await
}
}
#[derive(Clone, Debug, Deserialize)]
pub struct MatterData {
pub id: String,
pub id_v1: Option<String>,
pub max_fabrics: usize,
pub has_qr_code: bool,
}
impl MatterData {
pub fn rid(&self) -> ResourceIdentifier {
ResourceIdentifier {
rid: self.id.to_owned(),
rtype: ResourceType::Matter,
}
}
}
#[derive(Debug)]
pub struct MatterFabric {
data: MatterFabricData,
}
impl MatterFabric {
pub fn new(data: MatterFabricData) -> Self {
MatterFabric { data }
}
pub fn data(&self) -> &MatterFabricData {
&self.data
}
pub fn id(&self) -> &str {
&self.data.id
}
pub fn rid(&self) -> ResourceIdentifier {
self.data.rid()
}
}
#[derive(Clone, Debug, Deserialize)]
pub struct MatterFabricData {
pub id: String,
pub id_v1: Option<String>,
pub status: MatterFabricStatus,
pub fabric_data: Option<FabricData>,
pub creation_time: String,
}
impl MatterFabricData {
pub fn rid(&self) -> ResourceIdentifier {
ResourceIdentifier {
rid: self.id.to_owned(),
rtype: ResourceType::MatterFabric,
}
}
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum MatterFabricStatus {
Pending,
#[serde(rename = "timedout")]
TimedOut,
Paired,
}
#[derive(Clone, Debug, Deserialize)]
pub struct FabricData {
pub label: String,
pub vendor_id: usize,
}