use std::fmt;
use bitflags::bitflags;
use derive_more::Debug;
use serde::{Deserialize, Serialize};
use crate::error::Error;
#[derive(
Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd, Deserialize, Serialize,
)]
#[non_exhaustive]
pub enum MonitorType {
#[default]
#[serde(rename = "OBS_MONITORING_TYPE_NONE")]
None,
#[serde(rename = "OBS_MONITORING_TYPE_MONITOR_ONLY")]
MonitorOnly,
#[serde(rename = "OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT")]
MonitorAndOutput,
}
#[derive(
Clone, Copy, Default, Eq, Hash, Ord, PartialEq, PartialOrd, Debug, Deserialize, Serialize,
)]
#[serde(try_from = "u8", into = "u8")]
pub struct FontFlags(#[debug("{:?}", FlagsDebug(self))] u8);
bitflags! {
impl FontFlags: u8 {
const BOLD = 1;
const ITALIC = 2;
const UNDERLINE = 4;
const STRIKEOUT = 8;
}
}
impl TryFrom<u8> for FontFlags {
type Error = Error;
fn try_from(value: u8) -> Result<Self, Self::Error> {
Self::from_bits(value).ok_or(Error::UnknownFlags(value))
}
}
impl From<FontFlags> for u8 {
fn from(value: FontFlags) -> Self {
value.bits()
}
}
#[derive(
Clone, Copy, Default, Eq, Hash, Ord, PartialEq, PartialOrd, Debug, Deserialize, Serialize,
)]
#[serde(try_from = "u8", into = "u8")]
pub struct Alignment(#[debug("{:?}", FlagsDebug(self))] u8);
bitflags! {
impl Alignment: u8 {
const CENTER = 0;
const LEFT = 1 << 0;
const RIGHT = 1 << 1;
const TOP = 1 << 2;
const BOTTOM = 1 << 3;
}
}
impl TryFrom<u8> for Alignment {
type Error = Error;
fn try_from(value: u8) -> Result<Self, Self::Error> {
Self::from_bits(value).ok_or(Error::UnknownFlags(value))
}
}
impl From<Alignment> for u8 {
fn from(value: Alignment) -> Self {
value.bits()
}
}
#[derive(
Clone, Copy, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize,
)]
#[non_exhaustive]
pub enum BoundsType {
#[default]
#[serde(rename = "OBS_BOUNDS_NONE")]
None,
#[serde(rename = "OBS_BOUNDS_STRETCH")]
Stretch,
#[serde(rename = "OBS_BOUNDS_SCALE_INNER")]
ScaleInner,
#[serde(rename = "OBS_BOUNDS_SCALE_OUTER")]
ScaleOuter,
#[serde(rename = "OBS_BOUNDS_SCALE_TO_WIDTH")]
ScaleToWidth,
#[serde(rename = "OBS_BOUNDS_SCALE_TO_HEIGHT")]
ScaleToHeight,
#[serde(rename = "OBS_BOUNDS_MAX_ONLY")]
MaxOnly,
}
#[derive(
Clone, Copy, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize,
)]
#[non_exhaustive]
pub enum MediaAction {
#[default]
#[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NONE")]
None,
#[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PLAY")]
Play,
#[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PAUSE")]
Pause,
#[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_STOP")]
Stop,
#[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_RESTART")]
Restart,
#[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NEXT")]
Next,
#[serde(rename = "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PREVIOUS")]
Previous,
}
#[derive(
Clone, Copy, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize,
)]
#[non_exhaustive]
pub enum BlendMode {
#[default]
#[serde(rename = "OBS_BLEND_NORMAL")]
Normal,
#[serde(rename = "OBS_BLEND_ADDITIVE")]
Additive,
#[serde(rename = "OBS_BLEND_SUBTRACT")]
Subtract,
#[serde(rename = "OBS_BLEND_SCREEN")]
Screen,
#[serde(rename = "OBS_BLEND_MULTIPLY")]
Multiply,
#[serde(rename = "OBS_BLEND_LIGHTEN")]
Lighten,
#[serde(rename = "OBS_BLEND_DARKEN")]
Darken,
}
#[derive(
Clone, Copy, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize,
)]
pub enum DeinterlaceMode {
#[default]
#[serde(rename = "OBS_DEINTERLACE_MODE_DISABLE")]
Disable,
#[serde(rename = "OBS_DEINTERLACE_MODE_DISCARD")]
Discard,
#[serde(rename = "OBS_DEINTERLACE_MODE_RETRO")]
Retro,
#[serde(rename = "OBS_DEINTERLACE_MODE_BLEND")]
Blend,
#[serde(rename = "OBS_DEINTERLACE_MODE_BLEND_2X")]
Blend2X,
#[serde(rename = "OBS_DEINTERLACE_MODE_LINEAR")]
Linear,
#[serde(rename = "OBS_DEINTERLACE_MODE_LINEAR_2X")]
Linear2X,
#[serde(rename = "OBS_DEINTERLACE_MODE_YADIF")]
Yadif,
#[serde(rename = "OBS_DEINTERLACE_MODE_YADIF_2X")]
Yadif2X,
}
#[derive(
Clone, Copy, Debug, Default, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize,
)]
pub enum DeinterlaceFieldOrder {
#[default]
#[serde(rename = "OBS_DEINTERLACE_FIELD_ORDER_TOP")]
Top,
#[serde(rename = "OBS_DEINTERLACE_FIELD_ORDER_BOTTOM")]
Bottom,
}
#[expect(
unused,
reason = "only used for improved debug formatting and never constructed directly"
)]
pub(crate) struct FlagsDebug<'a, B>(pub &'a B);
impl<B: bitflags::Flags<Bits: bitflags::parser::WriteHex>> fmt::Debug for FlagsDebug<'_, B> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
bitflags::parser::to_writer(self.0, f)
}
}