use serde::Serialize;
use serde_with::skip_serializing_none;
#[derive(Serialize)]
#[serde(tag = "requestType", content = "requestData")]
pub(crate) enum Request<'a> {
#[serde(rename = "GetPersistentData")]
GetPersistentData {
#[serde(rename = "realm")]
realm: Realm,
#[serde(rename = "slotName")]
slot_name: &'a str,
},
#[serde(rename = "SetPersistentData")]
SetPersistentData(SetPersistentData<'a>),
#[serde(rename = "GetVideoSettings")]
VideoSettings,
#[serde(rename = "SetVideoSettings")]
SetVideoSettings(SetVideoSettings),
#[serde(rename = "GetStreamServiceSettings")]
StreamServiceSettings,
#[serde(rename = "SetStreamServiceSettings")]
SetStreamServiceSettings {
#[serde(rename = "streamServiceType")]
r#type: &'a str,
#[serde(rename = "streamServiceSettings")]
settings: serde_json::Value,
},
#[serde(rename = "GetRecordDirectory")]
RecordDirectory,
#[serde(rename = "SetRecordDirectory")]
SetRecordDirectory {
#[serde(rename = "recordDirectory")]
directory: &'a str,
},
}
impl<'a> From<Request<'a>> for super::RequestType<'a> {
fn from(value: Request<'a>) -> Self {
super::RequestType::Config(value)
}
}
#[derive(Clone, Copy, Serialize)]
#[non_exhaustive]
pub enum Realm {
#[serde(rename = "OBS_WEBSOCKET_DATA_REALM_GLOBAL")]
Global,
#[serde(rename = "OBS_WEBSOCKET_DATA_REALM_PROFILE")]
Profile,
}
#[derive(Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct SetPersistentData<'a> {
#[serde(rename = "realm")]
pub realm: Realm,
#[serde(rename = "slotName")]
pub slot_name: &'a str,
#[serde(rename = "slotValue")]
pub slot_value: &'a serde_json::Value,
}
#[skip_serializing_none]
#[derive(Default, Serialize)]
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct SetVideoSettings {
#[serde(rename = "fpsNumerator")]
pub fps_numerator: Option<u32>,
#[serde(rename = "fpsDenominator")]
pub fps_denominator: Option<u32>,
#[serde(rename = "baseWidth")]
pub base_width: Option<u32>,
#[serde(rename = "baseHeight")]
pub base_height: Option<u32>,
#[serde(rename = "outputWidth")]
pub output_width: Option<u32>,
#[serde(rename = "outputHeight")]
pub output_height: Option<u32>,
}
impl From<crate::responses::config::VideoSettings> for SetVideoSettings {
fn from(v: crate::responses::config::VideoSettings) -> Self {
Self {
fps_numerator: Some(v.fps_numerator),
fps_denominator: Some(v.fps_denominator),
base_width: Some(v.base_width),
base_height: Some(v.base_height),
output_width: Some(v.output_width),
output_height: Some(v.output_height),
}
}
}