From 35cf3d6c801fd031f356aa85c0ef5d1a5dd598f6 Mon Sep 17 00:00:00 2001 From: Dominik Nakamura Date: Mon, 10 Oct 2022 22:52:00 +0900 Subject: [PATCH] Implement common traits for responses and events --- CHANGELOG.md | 4 ++++ src/common.rs | 22 +++++++++++++----- src/events.rs | 12 +++++----- src/requests/inputs.rs | 5 ++++- src/responses/config.rs | 6 ++--- src/responses/filters.rs | 4 ++-- src/responses/general.rs | 8 +++---- src/responses/inputs.rs | 12 +++++----- src/responses/media_inputs.rs | 9 +++++--- src/responses/mod.rs | 10 ++++++--- src/responses/outputs.rs | 8 +++---- src/responses/profiles.rs | 6 ++--- src/responses/recording.rs | 4 ++-- src/responses/scene_collections.rs | 4 ++-- src/responses/scene_items.rs | 8 +++---- src/responses/scenes.rs | 8 +++---- src/responses/sources.rs | 4 ++-- src/responses/streaming.rs | 4 ++-- src/responses/transitions.rs | 8 +++---- src/responses/ui.rs | 8 +++---- src/serde/audio_tracks.rs | 36 +++++++++++++++++------------- 21 files changed, 110 insertions(+), 80 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f13729..d52dc01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 named different to be more concise. - Thank you to [@715209](https://github.com/715209) and [@Elinvynia](https://github.com/Elinvynia) for testing out these changes pre-release ❤️. Your ideas and bug reports helped a lot! +- All response and event data structures now implement the recommended common traits, where + possible. In addition, `serde::Serialize` and `serde::Deserialize` is implemented for all of + them. That means, they can now be constructred easier, and used in more places, for example, as a + `HashMap` key. ## [0.9.1] - 2022-02-25 diff --git a/src/common.rs b/src/common.rs index acc40ea..8b778f4 100644 --- a/src/common.rs +++ b/src/common.rs @@ -6,9 +6,12 @@ use serde::{Deserialize, Serialize}; use crate::Error; /// Monitoring type for audio outputs. -#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[derive( + Clone, Copy, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, +)] pub enum MonitorType { /// No monitoring. + #[default] #[serde(rename = "OBS_MONITORING_TYPE_NONE")] None, /// Only monitor but don't output any sounds. @@ -54,7 +57,7 @@ bitflags! { /// For example, only using `LEFT` would arrange the target to the left horizontally and /// centered vertically. To align to the top right, the alignments can be combined to /// `LEFT | TOP`. Combining both values for a single axis is invalid, like `LEFT | RIGHT`. - #[derive(Serialize, Deserialize)] + #[derive(Default, Deserialize, Serialize)] #[serde(transparent)] pub struct Alignment: u8 { /// Align to the center. @@ -85,9 +88,12 @@ impl From for u8 { } /// Different kinds of bounds that can be applied to different items on the scene. -#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[derive( + Clone, Copy, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, +)] pub enum BoundsType { /// No bounds. + #[default] #[serde(rename = "OBS_BOUNDS_NONE")] None, /// Stretch to bounds. @@ -111,9 +117,12 @@ pub enum BoundsType { } /// Different kinds of media actions that can be performed (or happen in events). -#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[derive( + Clone, Copy, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, +)] pub enum MediaAction { /// No media action. + #[default] #[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NONE")] None, /// Start media playback. @@ -137,9 +146,12 @@ pub enum MediaAction { } /// Different kinds of scene item blend modes. -#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[derive( + Clone, Copy, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, +)] pub enum BlendMode { /// No blending, overlaying without mixing colors, except for transparency. + #[default] #[serde(rename = "OBS_BLEND_NORMAL")] Normal, /// Add the pixel values to the ones beneath. diff --git a/src/events.rs b/src/events.rs index 7349456..4958f98 100644 --- a/src/events.rs +++ b/src/events.rs @@ -2,7 +2,7 @@ use std::{collections::BTreeMap, path::PathBuf}; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use time::Duration; use crate::{ @@ -11,7 +11,7 @@ use crate::{ }; /// All possible event types that can occur while the user interacts with OBS. -#[derive(Clone, Debug, Deserialize)] +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] #[serde(tag = "eventType", content = "eventData")] pub enum Event { // -------------------------------- @@ -545,7 +545,7 @@ pub enum Event { } /// Volume meter information for a single input, describing the current volume level. -#[derive(Clone, Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)] pub struct InputVolumeMeter { /// Name of this input. #[serde(rename = "inputName")] @@ -556,7 +556,7 @@ pub struct InputVolumeMeter { } /// The output state describes the current status of any output (like recording, virtual-cam, ...). -#[derive(Clone, Copy, Debug, Deserialize)] +#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub enum OutputState { /// A request to start the output has been issued. #[serde(rename = "OBS_WEBSOCKET_OUTPUT_STARTING")] @@ -582,7 +582,7 @@ pub enum OutputState { } /// A basic scene item, only describing identifier and position. -#[derive(Clone, Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct BasicSceneItem { /// Identifier of this scene item. #[serde(rename = "sceneItemId")] @@ -593,7 +593,7 @@ pub struct BasicSceneItem { } /// The scene describes basic details about a single scene setup in OBS. -#[derive(Clone, Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct Scene { /// Name of this scene. #[serde(rename = "sceneName")] diff --git a/src/requests/inputs.rs b/src/requests/inputs.rs index f523679..f9c44b4 100644 --- a/src/requests/inputs.rs +++ b/src/requests/inputs.rs @@ -150,7 +150,10 @@ pub(crate) enum Request<'a> { #[serde(rename = "inputName")] name: &'a str, /// Track settings to apply. - #[serde(rename = "inputAudioTracks", with = "crate::serde::audio_tracks")] + #[serde( + rename = "inputAudioTracks", + with = "crate::serde::audio_tracks::option" + )] tracks: [Option; 6], }, #[serde(rename = "GetInputPropertiesListPropertyItems")] diff --git a/src/responses/config.rs b/src/responses/config.rs index b73e042..c72a62f 100644 --- a/src/responses/config.rs +++ b/src/responses/config.rs @@ -1,9 +1,9 @@ //! Responses related to the OBS configuration. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; /// Response value for [`crate::client::Config::video_settings`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct VideoSettings { /// Numerator of the fractional FPS value. #[serde(rename = "fpsNumerator")] @@ -26,7 +26,7 @@ pub struct VideoSettings { } /// Response value for [`crate::client::Config::stream_service_settings`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct StreamServiceSettings { /// Stream service type, like `rtmp_custom` or `rtmp_common`. #[serde(rename = "streamServiceType")] diff --git a/src/responses/filters.rs b/src/responses/filters.rs index 7c65661..ad653e9 100644 --- a/src/responses/filters.rs +++ b/src/responses/filters.rs @@ -1,6 +1,6 @@ //! Responses related to filters. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; /// Response value for [`crate::client::Filters::get_source_filter_list`]. #[derive(Debug, Deserialize)] @@ -11,7 +11,7 @@ pub(crate) struct Filters { } /// Response value for [`crate::client::Filters::list`] and [`crate::client::Filters::get`]. -#[derive(Clone, Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] pub struct SourceFilter { /// Whether the filter is enabled. #[serde(rename = "filterEnabled")] diff --git a/src/responses/general.rs b/src/responses/general.rs index 185b355..e968010 100644 --- a/src/responses/general.rs +++ b/src/responses/general.rs @@ -1,9 +1,9 @@ //! General responses, not fitting into any category. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; /// Response value for [`crate::client::General::version`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct Version { /// Current OBS Studio version. #[serde(rename = "obsVersion")] @@ -30,7 +30,7 @@ pub struct Version { } /// Response value for [`crate::client::General::stats`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)] pub struct Stats { /// Current CPU usage in percent. #[serde(rename = "cpuUsage")] @@ -68,7 +68,7 @@ pub struct Stats { } /// Response value for [`crate::client::General::call_vendor_request`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct VendorResponse { /// Name of the vendor. #[serde(rename = "vendorName")] diff --git a/src/responses/inputs.rs b/src/responses/inputs.rs index 96c3618..3106a0f 100644 --- a/src/responses/inputs.rs +++ b/src/responses/inputs.rs @@ -1,6 +1,6 @@ //! Responses related to inputs. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use time::Duration; use crate::common::MonitorType; @@ -14,7 +14,7 @@ pub(crate) struct Inputs { } /// Response value for [`crate::client::Inputs::list`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct Input { /// Name of the input source. #[serde(rename = "inputName")] @@ -36,7 +36,7 @@ pub(crate) struct InputKinds { } /// Response value for [`crate::client::Inputs::specials`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct SpecialInputs { /// Name of the Desktop Audio input. #[serde(rename = "desktop1")] @@ -68,7 +68,7 @@ pub(crate) struct DefaultInputSettings { } /// Response value for [`crate::client::Inputs::settings`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct InputSettings { /// Object of settings for the input. #[serde(rename = "inputSettings")] @@ -88,7 +88,7 @@ pub(crate) struct InputMuted { } /// Response value for [`crate::client::Inputs::volume`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)] pub struct InputVolume { /// Volume setting in mul. #[serde(rename = "inputVolumeMul")] @@ -141,7 +141,7 @@ pub(crate) struct ListPropertyItems { } /// Response value for [`crate::client::Inputs::properties_list_property_items`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] pub struct ListPropertyItem { /// Name of the item. #[serde(rename = "itemName")] diff --git a/src/responses/media_inputs.rs b/src/responses/media_inputs.rs index fb3c923..c364bc6 100644 --- a/src/responses/media_inputs.rs +++ b/src/responses/media_inputs.rs @@ -1,10 +1,10 @@ //! Responses related to media inputs. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use time::Duration; /// Response value for [`crate::client::MediaInputs::status`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct MediaStatus { /// State of the media input. #[serde(rename = "mediaState")] @@ -21,9 +21,12 @@ pub struct MediaStatus { } /// Response value for [`crate::client::MediaInputs::status`] as part of [`MediaStatus`]. -#[derive(Copy, Clone, Debug, Deserialize)] +#[derive( + Clone, Copy, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, +)] pub enum MediaState { /// No state. + #[default] #[serde(rename = "OBS_MEDIA_STATE_NONE")] None, /// Media is playing. diff --git a/src/responses/mod.rs b/src/responses/mod.rs index d4be611..84d365f 100644 --- a/src/responses/mod.rs +++ b/src/responses/mod.rs @@ -20,7 +20,7 @@ pub mod ui; pub(crate) mod virtual_cam; use serde::{de, Deserialize, Deserializer}; -use serde_repr::Deserialize_repr; +use serde_repr::{Deserialize_repr, Serialize_repr}; #[derive(Debug)] pub(crate) enum ServerMessage { @@ -168,7 +168,9 @@ pub(crate) struct Status { /// The status code gives information about the result of a request. It gives further insight into /// what went wrong, if a request failed. -#[derive(Debug, Deserialize_repr)] +#[derive( + Clone, Copy, Debug, Deserialize_repr, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize_repr, +)] #[repr(u16)] pub enum StatusCode { /// Unknown status, should never be used. @@ -263,7 +265,9 @@ pub enum StatusCode { /// Additional close codes, defined by `obs-websocket`. These can be used to further pin down the /// details of why the web-socket connection was closed. -#[derive(Debug)] +#[derive( + Clone, Copy, Debug, Deserialize_repr, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize_repr, +)] #[repr(u16)] pub enum WebSocketCloseCode { /// Unknown reason, should never be used. diff --git a/src/responses/outputs.rs b/src/responses/outputs.rs index 3ef33e9..e33c3ba 100644 --- a/src/responses/outputs.rs +++ b/src/responses/outputs.rs @@ -1,6 +1,6 @@ //! Responses related to outputs. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use time::Duration; #[derive(Debug, Deserialize)] @@ -9,7 +9,7 @@ pub(crate) struct OutputList { } /// Response value for [`crate::client::Outputs::list`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct Output { /// Name of this output. #[serde(rename = "outputName")] @@ -32,7 +32,7 @@ pub struct Output { } /// Response value for [`crate::client::Outputs::list`] as part of [`Output`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct OutputFlags { /// Output supports audio. #[serde(rename = "OBS_OUTPUT_AUDIO")] @@ -52,7 +52,7 @@ pub struct OutputFlags { } /// Response value for [`crate::client::Outputs::status`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)] pub struct OutputStatus { /// Whether the output is active. #[serde(rename = "outputActive")] diff --git a/src/responses/profiles.rs b/src/responses/profiles.rs index f3689a2..1d50e99 100644 --- a/src/responses/profiles.rs +++ b/src/responses/profiles.rs @@ -1,9 +1,9 @@ //! Responses related to profiles. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; /// Response value for [`crate::client::Profiles::list`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct Profiles { /// The name of the current profile. #[serde(rename = "currentProfileName")] @@ -13,7 +13,7 @@ pub struct Profiles { } /// Response value for [`crate::client::Profiles::parameter`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct ProfileParameter { /// Value associated with the parameter. #[serde(rename = "parameterValue")] diff --git a/src/responses/recording.rs b/src/responses/recording.rs index 3bf051c..79f8a92 100644 --- a/src/responses/recording.rs +++ b/src/responses/recording.rs @@ -1,10 +1,10 @@ //! Responses related to recording. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use time::Duration; /// Response value for [`crate::client::Recording::status`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct RecordStatus { /// Whether the output is active. #[serde(rename = "outputActive")] diff --git a/src/responses/scene_collections.rs b/src/responses/scene_collections.rs index 37c6b9b..395b011 100644 --- a/src/responses/scene_collections.rs +++ b/src/responses/scene_collections.rs @@ -1,9 +1,9 @@ //! Responses related to scene collections. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; /// Response value for [`crate::client::SceneCollections::list`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct SceneCollections { /// The name of the current scene collection. #[serde(rename = "currentSceneCollectionName")] diff --git a/src/responses/scene_items.rs b/src/responses/scene_items.rs index 68b1e49..ff07279 100644 --- a/src/responses/scene_items.rs +++ b/src/responses/scene_items.rs @@ -1,6 +1,6 @@ //! Responses related to scene items. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use crate::common::{Alignment, BlendMode, BoundsType}; @@ -22,7 +22,7 @@ pub(crate) struct SceneItemList { /// Response value for [`crate::client::SceneItems::list`] and /// [`crate::client::SceneItems::list_group`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct SceneItem { /// Identifier of the scene item. #[serde(rename = "sceneItemId")] @@ -45,7 +45,7 @@ pub struct SceneItem { } /// Kind of source that is represented by a [`SceneItem`]. -#[derive(Copy, Clone, Debug, Deserialize)] +#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub enum SourceType { /// Input source from outside of OBS. #[serde(rename = "OBS_SOURCE_TYPE_INPUT")] @@ -70,7 +70,7 @@ pub(crate) struct GetSceneItemTransform { } /// Response value for [`crate::client::SceneItems::transform`]. -#[derive(Clone, Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)] pub struct SceneItemTransform { /// Base width (without scaling) of the source. #[serde(rename = "sourceWidth")] diff --git a/src/responses/scenes.rs b/src/responses/scenes.rs index e5865f7..f18afd3 100644 --- a/src/responses/scenes.rs +++ b/src/responses/scenes.rs @@ -1,10 +1,10 @@ //! Responses related to scenes. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use time::Duration; /// Response value for [`crate::client::Scenes::list`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct Scenes { /// Current program scene. #[serde(rename = "currentProgramSceneName")] @@ -18,7 +18,7 @@ pub struct Scenes { } /// Response value for [`crate::client::Scenes::list`] as part of [`Scenes`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct Scene { /// Name of the scene. #[serde(rename = "sceneName")] @@ -55,7 +55,7 @@ pub(crate) struct CurrentPreviewScene { } /// Response value for [`crate::client::Scenes::transition_override`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct SceneTransitionOverride { /// Name of the overridden scene transition. #[serde(rename = "transitionName")] diff --git a/src/responses/sources.rs b/src/responses/sources.rs index 6fe3eaf..54fc2bc 100644 --- a/src/responses/sources.rs +++ b/src/responses/sources.rs @@ -1,9 +1,9 @@ //! Responses related to sources. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; /// Response value for [`crate::client::Sources::active`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct SourceActive { /// Whether the source is showing in program. #[serde(rename = "videoActive")] diff --git a/src/responses/streaming.rs b/src/responses/streaming.rs index 03ad38e..783db6b 100644 --- a/src/responses/streaming.rs +++ b/src/responses/streaming.rs @@ -1,10 +1,10 @@ //! Responses related to streaming. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use time::Duration; /// Response value for [`crate::client::Streaming::status`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)] pub struct StreamStatus { /// Whether the output is active. #[serde(rename = "outputActive")] diff --git a/src/responses/transitions.rs b/src/responses/transitions.rs index 2b64170..b81f446 100644 --- a/src/responses/transitions.rs +++ b/src/responses/transitions.rs @@ -1,6 +1,6 @@ //! Responses related to transitions. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use time::Duration; /// Response value for @@ -13,7 +13,7 @@ pub(crate) struct TransitionKinds { } /// Response value for [`crate::client::Transitions::list`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct SceneTransitionList { /// Name of the current scene transition. #[serde(rename = "currentSceneTransitionName")] @@ -27,7 +27,7 @@ pub struct SceneTransitionList { } /// Response value for [`crate::client::Transitions::list`] as part of [`SceneTransitionList`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct Transition { /// Name of the transition. #[serde(rename = "transitionName")] @@ -44,7 +44,7 @@ pub struct Transition { } /// Response value for [`crate::client::Transitions::current`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] pub struct CurrentSceneTransition { /// Name of the transition. #[serde(rename = "transitionName")] diff --git a/src/responses/ui.rs b/src/responses/ui.rs index cf9642a..5d8db0d 100644 --- a/src/responses/ui.rs +++ b/src/responses/ui.rs @@ -1,6 +1,6 @@ //! Responses related to the user interface. -use serde::Deserialize; +use serde::{Deserialize, Serialize}; /// Response value for [`crate::client::Ui::get_studio_mode_enabled`]. #[derive(Debug, Deserialize)] @@ -18,7 +18,7 @@ pub(crate) struct MonitorList { } /// Response value for [`crate::client::Ui::list_monitors`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct Monitor { /// Name of this monitor. #[serde(rename = "monitorName")] @@ -35,7 +35,7 @@ pub struct Monitor { } /// Response value for [`crate::client::Ui::list_monitors`] as part of [`Monitor`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct MonitorSize { /// Pixel width. #[serde(rename = "monitorWidth")] @@ -46,7 +46,7 @@ pub struct MonitorSize { } /// Response value for [`crate::client::Ui::list_monitors`] as part of [`Monitor`]. -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] pub struct MonitorPosition { /// Horizontal position on the screen. #[serde(rename = "monitorPositionX")] diff --git a/src/serde/audio_tracks.rs b/src/serde/audio_tracks.rs index ba1f675..908d364 100644 --- a/src/serde/audio_tracks.rs +++ b/src/serde/audio_tracks.rs @@ -11,21 +11,6 @@ enum Error<'a> { OutOfRange(&'a str), } -pub fn serialize(value: &[Option; 6], serializer: S) -> Result -where - S: Serializer, -{ - let mut map = serializer.serialize_map(Some(value.iter().copied().flatten().count()))?; - for (k, v) in ["1", "2", "3", "4", "5", "6"] - .into_iter() - .zip(value) - .filter_map(|(k, v)| v.map(|v| (k, v))) - { - map.serialize_entry(k, &v)?; - } - map.end() -} - pub fn deserialize<'de, D>(deserializer: D) -> Result<[bool; 6], D::Error> where D: Deserializer<'de>, @@ -61,6 +46,25 @@ impl<'de> Visitor<'de> for AudioTracksVisitor { } } +pub mod option { + use super::*; + + pub fn serialize(value: &[Option; 6], serializer: S) -> Result + where + S: Serializer, + { + let mut map = serializer.serialize_map(Some(value.iter().copied().flatten().count()))?; + for (k, v) in ["1", "2", "3", "4", "5", "6"] + .into_iter() + .zip(value) + .filter_map(|(k, v)| v.map(|v| (k, v))) + { + map.serialize_entry(k, &v)?; + } + map.end() + } +} + #[cfg(test)] mod tests { use serde::{Deserialize, Serialize}; @@ -68,7 +72,7 @@ mod tests { #[derive(Debug, PartialEq, Serialize)] struct SimpleTracksSer { - #[serde(with = "super")] + #[serde(with = "super::option")] value: [Option; 6], }