use anyhow::Result;
use serde::Deserialize;
use crate::{Hub2Status, IOThermoHygrometerStatus, SwitchBot};
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct Device {
#[serde(rename = "deviceId")]
pub id: String,
#[serde(rename = "deviceName")]
pub name: String,
#[serde(rename = "deviceType")]
pub typ: Dev,
#[serde(rename = "hubDeviceId")]
pub hub: String,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct Devices {
#[serde(rename = "deviceList")]
pub devices: Vec<Device>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
#[serde(field_identifier)]
pub enum Dev {
#[serde(rename = "Hub 2")]
Hub2,
#[serde(rename = "WoIOSensor")]
IOThermoHygrometer,
Other(String),
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub enum DevStatus {
Hub2(Hub2Status),
IOThermoHygrometer(IOThermoHygrometerStatus),
Other,
}
impl SwitchBot {
pub async fn get_devices(&self) -> Result<Vec<Device>> {
Ok(self.get::<Devices>("v1.1/devices").await?.devices)
}
pub async fn get_status(&self, dev: &Device) -> Result<DevStatus> {
match dev.typ {
Dev::Hub2 => Ok(DevStatus::Hub2(self.get_hub2_status(&dev.id).await?)),
Dev::IOThermoHygrometer => Ok(DevStatus::IOThermoHygrometer(
self.get_io_thermo_hygrometer_status(&dev.id).await?,
)),
Dev::Other(_) => Ok(DevStatus::Other),
}
}
}