use derive_builder::Builder;
use indexmap::IndexSet;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
#[serde(tag = "type")]
#[non_exhaustive]
pub enum TouchPortalCommand {
Pair(PairCommand),
CreateState(CreateStateCommand),
CreateNotification(CreateNotificationCommand),
StateUpdate(UpdateStateCommand),
SettingUpdate(UpdateSettingCommand),
ChoiceUpdate(ChoiceUpdateCommand),
TriggerEvent(TriggerEventCommand),
RemoveState(RemoveStateCommand),
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PairCommand {
pub id: String,
}
#[derive(Debug, Clone, Builder, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateStateCommand {
#[builder(setter(into))]
id: String,
#[builder(setter(into))]
#[serde(rename = "desc")]
description: String,
#[builder(setter(into))]
#[serde(rename = "default")]
initial: String,
#[builder(setter(into, strip_option), default)]
#[serde(skip_serializing_if = "Option::is_none")]
parent_group: Option<String>,
#[builder(setter(strip_option), default)]
#[serde(skip_serializing_if = "Option::is_none")]
force_update: Option<bool>,
}
impl CreateStateCommand {
pub fn builder() -> CreateStateCommandBuilder {
CreateStateCommandBuilder::default()
}
}
#[derive(Debug, Clone, Builder, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateNotificationCommand {
#[builder(setter(into))]
notification_id: String,
#[builder(setter(into))]
title: String,
#[builder(setter(into))]
#[serde(rename = "msg")]
message: String,
#[builder(setter(each(name = "option")), default)]
options: Vec<NotificationOption>,
}
impl CreateNotificationCommand {
pub fn builder() -> CreateNotificationCommandBuilder {
CreateNotificationCommandBuilder::default()
}
}
#[derive(Debug, Clone, Builder, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct NotificationOption {
#[builder(setter(into))]
id: String,
#[builder(setter(into))]
title: String,
}
impl NotificationOption {
pub fn builder() -> NotificationOptionBuilder {
NotificationOptionBuilder::default()
}
}
#[derive(Debug, Clone, Builder, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateStateCommand {
#[builder(setter(into))]
#[serde(rename = "id")]
state_id: String,
#[builder(setter(into))]
value: String,
}
impl UpdateStateCommand {
pub fn builder() -> UpdateStateCommandBuilder {
UpdateStateCommandBuilder::default()
}
}
#[derive(Debug, Clone, Builder, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateSettingCommand {
#[builder(setter(into))]
name: String,
#[builder(setter(into))]
value: String,
}
impl UpdateSettingCommand {
pub fn builder() -> UpdateSettingCommandBuilder {
UpdateSettingCommandBuilder::default()
}
}
#[derive(Debug, Clone, Builder, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ChoiceUpdateCommand {
#[builder(setter(into))]
id: String,
#[builder(setter(each(name = "choice", into)))]
#[serde(rename = "value")]
choices: IndexSet<String>,
#[builder(setter(strip_option, into), default)]
#[serde(skip_serializing_if = "Option::is_none")]
instance_id: Option<String>,
}
impl ChoiceUpdateCommand {
pub fn builder() -> ChoiceUpdateCommandBuilder {
ChoiceUpdateCommandBuilder::default()
}
}
#[derive(Debug, Clone, Builder, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TriggerEventCommand {
#[builder(setter(into))]
event_id: String,
#[builder(setter(each(name = "state")), default)]
states: HashMap<String, String>,
}
impl TriggerEventCommand {
pub fn builder() -> TriggerEventCommandBuilder {
TriggerEventCommandBuilder::default()
}
}
#[derive(Debug, Clone, Builder, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RemoveStateCommand {
#[builder(setter(into))]
id: String,
}
impl RemoveStateCommand {
pub fn builder() -> RemoveStateCommandBuilder {
RemoveStateCommandBuilder::default()
}
}