use serde::Serialize;
use serde_with::skip_serializing_none;
use time::Duration;
pub use super::ids::SceneId;
#[skip_serializing_none]
#[derive(Serialize)]
#[serde(tag = "requestType", content = "requestData")]
pub(crate) enum Request<'a> {
#[serde(rename = "GetSceneList")]
List,
#[serde(rename = "GetGroupList")]
ListGroups,
#[serde(rename = "GetCurrentProgramScene")]
CurrentProgramScene,
#[serde(rename = "SetCurrentProgramScene")]
SetCurrentProgramScene {
#[serde(flatten)]
scene: SceneId<'a>,
},
#[serde(rename = "GetCurrentPreviewScene")]
CurrentPreviewScene,
#[serde(rename = "SetCurrentPreviewScene")]
SetCurrentPreviewScene {
#[serde(flatten)]
scene: SceneId<'a>,
},
#[serde(rename = "SetSceneName")]
SetName {
#[serde(flatten)]
scene: SceneId<'a>,
#[serde(rename = "newSceneName")]
new_name: &'a str,
},
#[serde(rename = "CreateScene")]
Create {
#[serde(rename = "sceneName")]
name: &'a str,
},
#[serde(rename = "RemoveScene")]
Remove {
#[serde(flatten)]
scene: SceneId<'a>,
},
#[serde(rename = "GetSceneSceneTransitionOverride")]
TransitionOverride {
#[serde(flatten)]
scene: SceneId<'a>,
},
#[serde(rename = "SetSceneSceneTransitionOverride")]
SetTransitionOverride(SetTransitionOverride<'a>),
}
impl<'a> From<Request<'a>> for super::RequestType<'a> {
fn from(value: Request<'a>) -> Self {
super::RequestType::Scenes(value)
}
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
pub struct SetTransitionOverride<'a> {
#[serde(flatten)]
pub scene: SceneId<'a>,
#[serde(rename = "transitionName")]
pub transition: Option<&'a str>,
#[serde(
rename = "transitionDuration",
with = "crate::serde::duration_millis::option"
)]
pub duration: Option<Duration>,
}