use serde_json::json;
use crate::error::Result;
use crate::types::AqaraValueResponse;
use crate::types::positions::{
CreatePositionParams, DeletePositionParams, ListPositionsParams, PositionDetailParams,
SetPositionTimeZoneParams, UpdatePositionParams,
};
#[cfg(feature = "async")]
use crate::Client;
#[cfg(feature = "blocking")]
use crate::BlockingClient;
#[cfg(feature = "async")]
#[derive(Clone)]
pub struct PositionService {
client: Client,
}
#[cfg(feature = "async")]
impl PositionService {
pub(crate) fn new(client: Client) -> Self {
Self { client }
}
pub async fn create(&self, params: CreatePositionParams) -> Result<AqaraValueResponse> {
let mut data = json!({
"positionName": params.position_name,
});
if let Some(description) = params.description {
data["description"] = json!(description);
}
if let Some(parent_position_id) = params.parent_position_id {
data["parentPositionId"] = json!(parent_position_id);
}
self.client
.call_json("config.position.create", data, true, false)
.await
}
pub async fn update(&self, params: UpdatePositionParams) -> Result<AqaraValueResponse> {
let mut data = json!({
"positionId": params.position_id,
"positionName": params.position_name,
});
if let Some(description) = params.description {
data["description"] = json!(description);
}
self.client
.call_json("config.position.update", data, true, false)
.await
}
pub async fn delete(&self, params: DeletePositionParams) -> Result<AqaraValueResponse> {
let data = json!({ "positionId": params.position_id });
self.client
.call_json("config.position.delete", data, true, false)
.await
}
pub async fn set_time_zone(
&self,
params: SetPositionTimeZoneParams,
) -> Result<AqaraValueResponse> {
let mut data = json!({ "positionId": params.position_id });
if let Some(time_zone) = params.time_zone {
data["timeZone"] = json!(time_zone);
}
self.client
.call_json("config.position.timeZone", data, true, false)
.await
}
pub async fn list(&self, params: ListPositionsParams) -> Result<AqaraValueResponse> {
let data = json!({
"parentPositionId": params.parent_position_id.unwrap_or_default(),
"pageNum": params.page_num,
"pageSize": params.page_size,
});
self.client
.call_json("query.position.info", data, true, true)
.await
}
pub async fn detail(&self, params: PositionDetailParams) -> Result<AqaraValueResponse> {
let data = json!({ "positionIds": params.position_ids });
self.client
.call_json("query.position.detail", data, true, true)
.await
}
}
#[cfg(feature = "blocking")]
#[derive(Clone)]
pub struct BlockingPositionService {
client: BlockingClient,
}
#[cfg(feature = "blocking")]
impl BlockingPositionService {
pub(crate) fn new(client: BlockingClient) -> Self {
Self { client }
}
pub fn create(&self, params: CreatePositionParams) -> Result<AqaraValueResponse> {
let mut data = json!({
"positionName": params.position_name,
});
if let Some(description) = params.description {
data["description"] = json!(description);
}
if let Some(parent_position_id) = params.parent_position_id {
data["parentPositionId"] = json!(parent_position_id);
}
self.client
.call_json("config.position.create", data, true, false)
}
pub fn update(&self, params: UpdatePositionParams) -> Result<AqaraValueResponse> {
let mut data = json!({
"positionId": params.position_id,
"positionName": params.position_name,
});
if let Some(description) = params.description {
data["description"] = json!(description);
}
self.client
.call_json("config.position.update", data, true, false)
}
pub fn delete(&self, params: DeletePositionParams) -> Result<AqaraValueResponse> {
let data = json!({ "positionId": params.position_id });
self.client
.call_json("config.position.delete", data, true, false)
}
pub fn set_time_zone(&self, params: SetPositionTimeZoneParams) -> Result<AqaraValueResponse> {
let mut data = json!({ "positionId": params.position_id });
if let Some(time_zone) = params.time_zone {
data["timeZone"] = json!(time_zone);
}
self.client
.call_json("config.position.timeZone", data, true, false)
}
pub fn list(&self, params: ListPositionsParams) -> Result<AqaraValueResponse> {
let data = json!({
"parentPositionId": params.parent_position_id.unwrap_or_default(),
"pageNum": params.page_num,
"pageSize": params.page_size,
});
self.client
.call_json("query.position.info", data, true, true)
}
pub fn detail(&self, params: PositionDetailParams) -> Result<AqaraValueResponse> {
let data = json!({ "positionIds": params.position_ids });
self.client
.call_json("query.position.detail", data, true, true)
}
}