obws 0.15.0

The obws (obvious) remote control library for OBS.
Documentation
use anyhow::Result;
use obws::{events::Event, requests::general::CallVendorRequest};
use serde::Serialize;
use serde_json::json;
use test_log::test;

use crate::{common, wait_for};

#[test(tokio::test)]
async fn general() -> Result<()> {
    let (client, server) = common::new_client().await?;
    let mut events = client.events()?;
    let client = client.general();

    server.expect(
        "GetVersion",
        json!(null),
        json!({
            "obsVersion": "31.0.0",
            "obsWebSocketVersion": "5.5.0",
            "rpcVersion": 1,
            "availableRequests": [],
            "supportedImageFormats": [],
            "platform": "mock",
            "platformDescription": "",
        }),
    );

    client.version().await?;

    server.expect(
        "GetStats",
        json!(null),
        json!({
            "cpuUsage": 0.5,
            "memoryUsage": 200,
            "availableDiskSpace": 30_000_000,
            "activeFps": 59.99,
            "averageFrameRenderTime": 5,
            "renderSkippedFrames": 0,
            "renderTotalFrames": 10_000,
            "outputSkippedFrames": 0,
            "outputTotalFrames": 8_000,
            "webSocketSessionIncomingMessages": 10,
            "webSocketSessionOutgoingMessages": 10,
        }),
    );

    client.stats().await?;

    server.expect(
        "BroadcastCustomEvent",
        json!({
            "eventData": {
                "hello": "world!",
            },
        }),
        json!(null),
    );

    client
        .broadcast_custom_event(&CustomEvent { hello: "world!" })
        .await?;

    server.send_event(Event::CustomEvent(json!({"hello": "world!"})));
    wait_for!(events, Event::CustomEvent(_));

    server.expect(
        "CallVendorRequest",
        json!({
            "vendorName": "mock",
            "requestType": "call",
            "requestData": 1,
        }),
        json!({
            "vendorName": "mock",
            "requestType": "call",
            "responseData": true,
        }),
    );

    client
        .call_vendor_request::<_, bool>(CallVendorRequest {
            vendor_name: "mock",
            request_type: "call",
            request_data: &1,
        })
        .await?;

    server.stop().await
}

#[derive(Serialize)]
struct CustomEvent<'a> {
    hello: &'a str,
}