use reqwest::Error as ReqwestError;
use reqwest::{Client, Url};
use serde_json::json;
use crate::{
structs::govee::{
ApiResponseGoveeAppliances, ApiResponseGoveeDeviceState, ApiResponseGoveeDevices,
PayloadBody,
},
GoveeClient, GOVEE_ROOT_URL,
};
impl GoveeClient {
pub async fn control_device(&self, payload: PayloadBody) -> Result<(), ReqwestError> {
let client = Client::new();
let payload_json = json!(payload);
let endpoint = format!("{}/v1/devices/control", &self.govee_root_url);
let result = client
.put(endpoint)
.header("Govee-API-Key", &self.govee_api_key.to_string())
.json(&payload_json)
.send()
.await;
match result {
Ok(res) => res,
Err(err) => return Err(err),
};
Ok(())
}
}
impl GoveeClient {
pub async fn bulk_control_devices(
&self,
payloads: Vec<PayloadBody>,
) -> Result<(), ReqwestError> {
let client = Client::new();
let endpoint = format!("{}/v1/devices/control", &self.govee_root_url);
let requests = payloads
.iter()
.map(|payload| {
let payload_json = json!(payload);
let endpoint = endpoint.clone();
let govee_api_key = self.govee_api_key.to_string();
let client = client.clone();
async move {
client
.put(&endpoint)
.header("Govee-API-Key", &govee_api_key)
.json(&payload_json)
.send()
.await
}
})
.collect::<Vec<_>>();
let results = futures::future::join_all(requests).await;
for result in results {
match result {
Ok(_) => (),
Err(err) => return Err(err),
}
}
Ok(())
}
}
impl GoveeClient {
pub async fn control_appliance(&self, payload: PayloadBody) -> Result<(), ReqwestError> {
let client = Client::new();
let payload_json = json!(payload);
let endpoint = format!("{}/v1/appliance/devices/control", GOVEE_ROOT_URL);
let result = client
.put(endpoint)
.header("Govee-API-Key", &self.govee_api_key)
.json(&payload_json)
.send()
.await;
match result {
Ok(res) => res,
Err(err) => return Err(err),
};
Ok(())
}
}
impl GoveeClient {
pub async fn get_devices(&self) -> Result<ApiResponseGoveeDevices, ReqwestError> {
let client = Client::new();
let endpoint = format!("{}/v1/devices", GOVEE_ROOT_URL);
let response = client
.get(endpoint)
.header("Govee-API-Key", &self.govee_api_key)
.send()
.await?;
let response_json = response.json::<ApiResponseGoveeDevices>().await?;
Ok(response_json)
}
}
impl GoveeClient {
pub async fn get_appliances(&self) -> Result<ApiResponseGoveeAppliances, ReqwestError> {
let client = Client::new();
let endpoint = format!("{}/v1/appliance/devices", GOVEE_ROOT_URL);
let response = client
.get(endpoint)
.header("Govee-API-Key", &self.govee_api_key)
.send()
.await?;
let response_json = response.json::<ApiResponseGoveeAppliances>().await?;
Ok(response_json)
}
}
impl GoveeClient {
pub async fn get_device_state(
&self,
device: &str,
model: &str,
) -> Result<ApiResponseGoveeDeviceState, ReqwestError> {
let client = Client::new();
let params = [("device", device), ("model", model)];
let endpoint = format!("{}/v1/devices/state", GOVEE_ROOT_URL);
let url = Url::parse_with_params(&endpoint, ¶ms).unwrap();
let response = client
.get(url)
.header("Govee-API-Key", &self.govee_api_key)
.send()
.await?;
let response_json = response
.json::<ApiResponseGoveeDeviceState>()
.await
.unwrap();
Ok(response_json)
}
}