use serde::Serialize;
use serde_with::skip_serializing_none;
use time::Duration;
pub use super::ids::InputId;
use super::scenes::SceneId;
use crate::common::{DeinterlaceFieldOrder, DeinterlaceMode, MonitorType};
#[derive(Serialize)]
#[serde(tag = "requestType", content = "requestData")]
pub(crate) enum Request<'a> {
#[serde(rename = "GetInputList")]
List {
#[serde(rename = "inputKind", skip_serializing_if = "Option::is_none")]
kind: Option<&'a str>,
},
#[serde(rename = "GetInputKindList")]
ListKinds {
#[serde(rename = "unversioned")]
unversioned: bool,
},
#[serde(rename = "GetSpecialInputs")]
Specials,
#[serde(rename = "GetInputDefaultSettings")]
DefaultSettings {
#[serde(rename = "inputKind")]
kind: &'a str,
},
#[serde(rename = "GetInputSettings")]
Settings {
#[serde(flatten)]
input: InputId<'a>,
},
#[serde(rename = "SetInputSettings")]
SetSettings(SetSettingsInternal<'a>),
#[serde(rename = "GetInputMute")]
Muted {
#[serde(flatten)]
input: InputId<'a>,
},
#[serde(rename = "SetInputMute")]
SetMuted {
#[serde(flatten)]
input: InputId<'a>,
#[serde(rename = "inputMuted")]
muted: bool,
},
#[serde(rename = "ToggleInputMute")]
ToggleMute {
#[serde(flatten)]
input: InputId<'a>,
},
#[serde(rename = "GetInputVolume")]
Volume {
#[serde(flatten)]
input: InputId<'a>,
},
#[serde(rename = "SetInputVolume")]
SetVolume {
#[serde(flatten)]
input: InputId<'a>,
#[serde(rename = "volume", flatten)]
volume: Volume,
},
#[serde(rename = "SetInputName")]
SetName {
#[serde(flatten)]
input: InputId<'a>,
#[serde(rename = "newInputName")]
new: &'a str,
},
#[serde(rename = "CreateInput")]
Create(CreateInputInternal<'a>),
#[serde(rename = "RemoveInput")]
Remove {
#[serde(flatten)]
input: InputId<'a>,
},
#[serde(rename = "GetInputAudioBalance")]
AudioBalance {
#[serde(flatten)]
input: InputId<'a>,
},
#[serde(rename = "SetInputAudioBalance")]
SetAudioBalance {
#[serde(flatten)]
input: InputId<'a>,
#[serde(rename = "inputAudioBalance")]
balance: f32,
},
#[serde(rename = "GetInputAudioSyncOffset")]
AudioSyncOffset {
#[serde(flatten)]
input: InputId<'a>,
},
#[serde(rename = "SetInputAudioSyncOffset")]
SetAudioSyncOffset {
#[serde(flatten)]
input: InputId<'a>,
#[serde(
rename = "inputAudioSyncOffset",
with = "crate::serde::duration_millis"
)]
offset: Duration,
},
#[serde(rename = "GetInputAudioMonitorType")]
AudioMonitorType {
#[serde(flatten)]
input: InputId<'a>,
},
#[serde(rename = "SetInputAudioMonitorType")]
SetAudioMonitorType {
#[serde(flatten)]
input: InputId<'a>,
#[serde(rename = "monitorType")]
monitor_type: MonitorType,
},
#[serde(rename = "GetInputAudioTracks")]
AudioTracks {
#[serde(flatten)]
input: InputId<'a>,
},
#[serde(rename = "SetInputAudioTracks")]
SetAudioTracks {
#[serde(flatten)]
input: InputId<'a>,
#[serde(
rename = "inputAudioTracks",
with = "crate::serde::audio_tracks::option"
)]
tracks: [Option<bool>; 6],
},
#[serde(rename = "GetInputDeinterlaceMode")]
DeinterlaceMode {
#[serde(flatten)]
input: InputId<'a>,
},
#[serde(rename = "SetInputDeinterlaceMode")]
SetDeinterlaceMode {
#[serde(flatten)]
input: InputId<'a>,
#[serde(rename = "inputDeinterlaceMode")]
mode: DeinterlaceMode,
},
#[serde(rename = "GetInputDeinterlaceFieldOrder")]
DeinterlaceFieldOrder {
#[serde(flatten)]
input: InputId<'a>,
},
#[serde(rename = "SetInputDeinterlaceFieldOrder")]
SetDeinterlaceFieldOrder {
#[serde(flatten)]
input: InputId<'a>,
#[serde(rename = "inputDeinterlaceFieldOrder")]
field_order: DeinterlaceFieldOrder,
},
#[serde(rename = "GetInputPropertiesListPropertyItems")]
PropertiesListPropertyItems {
#[serde(flatten)]
input: InputId<'a>,
#[serde(rename = "propertyName")]
property: &'a str,
},
#[serde(rename = "PressInputPropertiesButton")]
PressPropertiesButton {
#[serde(flatten)]
input: InputId<'a>,
#[serde(rename = "propertyName")]
property: &'a str,
},
}
impl<'a> From<Request<'a>> for super::RequestType<'a> {
fn from(value: Request<'a>) -> Self {
super::RequestType::Inputs(value)
}
}
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct SetSettings<'a, T> {
pub input: InputId<'a>,
pub settings: &'a T,
pub overlay: Option<bool>,
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
pub(crate) struct SetSettingsInternal<'a> {
#[serde(flatten)]
pub input: InputId<'a>,
#[serde(rename = "inputSettings")]
pub settings: serde_json::Value,
#[serde(rename = "overlay")]
pub overlay: Option<bool>,
}
#[derive(Serialize)]
#[non_exhaustive]
pub enum Volume {
#[serde(rename = "inputVolumeMul")]
Mul(f32),
#[serde(rename = "inputVolumeDb")]
Db(f32),
}
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct Create<'a, T> {
pub scene: SceneId<'a>,
pub input: &'a str,
pub kind: &'a str,
pub settings: Option<T>,
pub enabled: Option<bool>,
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
pub(crate) struct CreateInputInternal<'a> {
#[serde(flatten)]
pub scene: SceneId<'a>,
#[serde(rename = "inputName")]
pub input: &'a str,
#[serde(rename = "inputKind")]
pub kind: &'a str,
#[serde(rename = "inputSettings")]
pub settings: Option<serde_json::Value>,
#[serde(rename = "sceneItemEnabled")]
pub enabled: Option<bool>,
}