use serde::Serialize;
use serde_with::skip_serializing_none;
use super::{ids::DestinationSceneId, scenes::SceneId, sources::SourceId};
use crate::common::{Alignment, BlendMode, BoundsType};
#[derive(Serialize)]
#[serde(tag = "requestType", content = "requestData")]
pub(crate) enum Request<'a> {
#[serde(rename = "GetSceneItemList")]
List {
#[serde(flatten)]
scene: SceneId<'a>,
},
#[serde(rename = "GetGroupSceneItemList")]
ListGroup {
#[serde(flatten)]
scene: SceneId<'a>,
},
#[serde(rename = "GetSceneItemId")]
Id(Id<'a>),
#[serde(rename = "GetSceneItemSource")]
Source(Source<'a>),
#[serde(rename = "CreateSceneItem")]
Create(CreateSceneItem<'a>),
#[serde(rename = "RemoveSceneItem")]
Remove {
#[serde(flatten)]
scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
item_id: i64,
},
#[serde(rename = "DuplicateSceneItem")]
Duplicate(Duplicate<'a>),
#[serde(rename = "GetSceneItemTransform")]
Transform {
#[serde(flatten)]
scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
item_id: i64,
},
#[serde(rename = "SetSceneItemTransform")]
SetTransform(SetTransform<'a>),
#[serde(rename = "GetSceneItemEnabled")]
Enabled {
#[serde(flatten)]
scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
item_id: i64,
},
#[serde(rename = "SetSceneItemEnabled")]
SetEnabled(SetEnabled<'a>),
#[serde(rename = "GetSceneItemLocked")]
Locked {
#[serde(flatten)]
scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
item_id: i64,
},
#[serde(rename = "SetSceneItemLocked")]
SetLocked(SetLocked<'a>),
#[serde(rename = "GetSceneItemIndex")]
Index {
#[serde(flatten)]
scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
item_id: i64,
},
#[serde(rename = "SetSceneItemIndex")]
SetIndex(SetIndex<'a>),
#[serde(rename = "GetSceneItemBlendMode")]
BlendMode {
#[serde(flatten)]
scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
item_id: i64,
},
#[serde(rename = "SetSceneItemBlendMode")]
SetBlendMode(SetBlendMode<'a>),
#[serde(rename = "GetSceneItemPrivateSettings")]
PrivateSettings {
#[serde(flatten)]
scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
item_id: i64,
},
#[serde(rename = "SetSceneItemPrivateSettings")]
SetPrivateSettings(SetPrivateSettingsInternal<'a>),
}
impl<'a> From<Request<'a>> for super::RequestType<'a> {
fn from(value: Request<'a>) -> Self {
super::RequestType::SceneItems(value)
}
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct Id<'a> {
#[serde(flatten)]
pub scene: SceneId<'a>,
#[serde(rename = "sourceName")]
pub source: &'a str,
#[serde(rename = "searchOffset")]
pub search_offset: Option<i32>,
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct Source<'a> {
#[serde(flatten)]
pub scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
pub item_id: i64,
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct CreateSceneItem<'a> {
#[serde(flatten)]
pub scene: SceneId<'a>,
#[serde(flatten)]
pub source: SourceId<'a>,
#[serde(rename = "sceneItemEnabled")]
pub enabled: Option<bool>,
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct Duplicate<'a> {
#[serde(flatten)]
pub scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
pub item_id: i64,
#[serde(flatten)]
pub destination: Option<DestinationSceneId<'a>>,
}
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct SetTransform<'a> {
#[serde(flatten)]
pub scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
pub item_id: i64,
#[serde(rename = "sceneItemTransform")]
pub transform: SceneItemTransform,
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct SceneItemTransform {
#[serde(rename = "position", flatten)]
pub position: Option<Position>,
#[serde(rename = "rotation")]
pub rotation: Option<f32>,
#[serde(rename = "scale", flatten)]
pub scale: Option<Scale>,
#[serde(rename = "alignment")]
pub alignment: Option<Alignment>,
#[serde(rename = "bounds", flatten)]
pub bounds: Option<Bounds>,
#[serde(rename = "crop", flatten)]
pub crop: Option<Crop>,
}
impl From<crate::responses::scene_items::SceneItemTransform> for SceneItemTransform {
fn from(t: crate::responses::scene_items::SceneItemTransform) -> Self {
Self {
position: Some(Position {
x: Some(t.position_x),
y: Some(t.position_y),
}),
rotation: Some(t.rotation),
scale: Some(Scale {
x: Some(t.scale_x),
y: Some(t.scale_y),
}),
alignment: Some(t.alignment),
bounds: Some(Bounds {
r#type: Some(t.bounds_type),
alignment: Some(t.bounds_alignment),
width: Some(t.bounds_width),
height: Some(t.bounds_height),
}),
crop: Some(Crop {
left: Some(t.crop_left),
right: Some(t.crop_right),
top: Some(t.crop_top),
bottom: Some(t.crop_bottom),
}),
}
}
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct Position {
#[serde(rename = "positionX")]
pub x: Option<f32>,
#[serde(rename = "positionY")]
pub y: Option<f32>,
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct Scale {
#[serde(rename = "scaleX")]
pub x: Option<f32>,
#[serde(rename = "scaleY")]
pub y: Option<f32>,
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct Bounds {
#[serde(rename = "boundsType")]
pub r#type: Option<BoundsType>,
#[serde(rename = "boundsAlignment")]
pub alignment: Option<Alignment>,
#[serde(rename = "boundsWidth")]
pub width: Option<f32>,
#[serde(rename = "boundsHeight")]
pub height: Option<f32>,
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct Crop {
#[serde(rename = "cropLeft")]
pub left: Option<u32>,
#[serde(rename = "cropRight")]
pub right: Option<u32>,
#[serde(rename = "cropTop")]
pub top: Option<u32>,
#[serde(rename = "cropBottom")]
pub bottom: Option<u32>,
}
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct SetEnabled<'a> {
#[serde(flatten)]
pub scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
pub item_id: i64,
#[serde(rename = "sceneItemEnabled")]
pub enabled: bool,
}
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct SetLocked<'a> {
#[serde(flatten)]
pub scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
pub item_id: i64,
#[serde(rename = "sceneItemLocked")]
pub locked: bool,
}
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct SetIndex<'a> {
#[serde(flatten)]
pub scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
pub item_id: i64,
#[serde(rename = "sceneItemIndex")]
pub index: u32,
}
#[derive(Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct SetBlendMode<'a> {
#[serde(flatten)]
pub scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
pub item_id: i64,
#[serde(rename = "sceneItemBlendMode")]
pub mode: BlendMode,
}
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct SetPrivateSettings<'a, T> {
pub scene: SceneId<'a>,
pub item_id: i64,
pub settings: &'a T,
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
pub(crate) struct SetPrivateSettingsInternal<'a> {
#[serde(flatten)]
pub scene: SceneId<'a>,
#[serde(rename = "sceneItemId")]
pub item_id: i64,
#[serde(rename = "sceneItemSettings")]
pub settings: serde_json::Value,
}