obws 0.15.0

The obws (obvious) remote control library for OBS.
Documentation
//! General requests, not fitting into any category.

use serde::Serialize;

#[allow(clippy::enum_variant_names)]
#[derive(Serialize)]
#[serde(tag = "requestType", content = "requestData")]
pub(crate) enum Request<'a> {
    #[serde(rename = "GetVersion")]
    Version,
    #[serde(rename = "GetStats")]
    Stats,
    #[serde(rename = "BroadcastCustomEvent")]
    BroadcastCustomEvent {
        /// Data payload to emit to all receivers.
        #[serde(rename = "eventData")]
        event_data: serde_json::Value,
    },
    #[serde(rename = "CallVendorRequest")]
    CallVendorRequest(CallVendorRequestInternal<'a>),
    // TODO: Sleep
}

impl<'a> From<Request<'a>> for super::RequestType<'a> {
    fn from(value: Request<'a>) -> Self {
        super::RequestType::General(value)
    }
}

/// Request information for [`crate::client::General::call_vendor_request`].
#[cfg_attr(feature = "builder", derive(bon::Builder))]
pub struct CallVendorRequest<'a, T> {
    /// Name of the vendor to use.
    pub vendor_name: &'a str,
    /// The request type to call.
    pub request_type: &'a str,
    /// Object containing appropriate request data.
    pub request_data: &'a T,
}

/// Request information for [`crate::client::General::call_vendor_request`].
#[derive(Default, Serialize)]
pub(crate) struct CallVendorRequestInternal<'a> {
    /// Name of the vendor to use.
    #[serde(rename = "vendorName")]
    pub vendor_name: &'a str,
    /// The request type to call.
    #[serde(rename = "requestType")]
    pub request_type: &'a str,
    /// Object containing appropriate request data.
    #[serde(rename = "requestData")]
    pub request_data: serde_json::Value,
}