use derive_more::{Display, From, Into};
use serde::Deserialize;
use smart_default::SmartDefault;
use medea_control_api_proto::grpc::api as proto;
#[derive(
Clone, Debug, Deserialize, Display, Eq, Hash, PartialEq, From, Into,
)]
pub struct WebRtcPublishId(String);
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
pub enum P2pMode {
Always,
Never,
IfPossible,
}
impl From<proto::web_rtc_publish_endpoint::P2p> for P2pMode {
fn from(value: proto::web_rtc_publish_endpoint::P2p) -> Self {
use proto::web_rtc_publish_endpoint::P2p;
match value {
P2p::Always => Self::Always,
P2p::IfPossible => Self::IfPossible,
P2p::Never => Self::Never,
}
}
}
impl From<P2pMode> for proto::web_rtc_publish_endpoint::P2p {
#[inline]
fn from(mode: P2pMode) -> Self {
match mode {
P2pMode::Always => Self::Always,
P2pMode::IfPossible => Self::IfPossible,
P2pMode::Never => Self::Never,
}
}
}
#[derive(Clone, Deserialize, Debug)]
pub struct WebRtcPublishEndpoint {
pub p2p: P2pMode,
#[serde(default)]
pub force_relay: bool,
#[serde(default)]
pub audio_settings: AudioSettings,
#[serde(default)]
pub video_settings: VideoSettings,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, SmartDefault)]
pub enum PublishPolicy {
#[default]
Optional,
Required,
Disabled,
}
impl PublishPolicy {
#[inline]
#[must_use]
pub fn required(self) -> bool {
match self {
Self::Optional | Self::Disabled => false,
Self::Required => true,
}
}
}
impl From<proto::web_rtc_publish_endpoint::PublishPolicy> for PublishPolicy {
#[inline]
fn from(from: proto::web_rtc_publish_endpoint::PublishPolicy) -> Self {
use proto::web_rtc_publish_endpoint::PublishPolicy as Proto;
match from {
Proto::Optional => Self::Optional,
Proto::Required => Self::Required,
Proto::Disabled => Self::Disabled,
}
}
}
impl From<PublishPolicy> for proto::web_rtc_publish_endpoint::PublishPolicy {
#[inline]
fn from(from: PublishPolicy) -> Self {
match from {
PublishPolicy::Optional => Self::Optional,
PublishPolicy::Required => Self::Required,
PublishPolicy::Disabled => Self::Disabled,
}
}
}
#[derive(Clone, Copy, Debug, Default, Deserialize)]
pub struct AudioSettings {
#[serde(default)]
pub publish_policy: PublishPolicy,
}
impl From<&proto::web_rtc_publish_endpoint::AudioSettings> for AudioSettings {
fn from(from: &proto::web_rtc_publish_endpoint::AudioSettings) -> Self {
Self {
publish_policy:
proto::web_rtc_publish_endpoint::PublishPolicy::from_i32(
from.publish_policy,
)
.unwrap_or_default()
.into(),
}
}
}
impl From<AudioSettings> for proto::web_rtc_publish_endpoint::AudioSettings {
#[inline]
fn from(from: AudioSettings) -> Self {
use proto::web_rtc_publish_endpoint::PublishPolicy;
Self {
publish_policy: PublishPolicy::from(from.publish_policy).into(),
}
}
}
#[derive(Clone, Copy, Debug, Default, Deserialize)]
pub struct VideoSettings {
#[serde(default)]
pub publish_policy: PublishPolicy,
}
impl From<&proto::web_rtc_publish_endpoint::VideoSettings> for VideoSettings {
fn from(from: &proto::web_rtc_publish_endpoint::VideoSettings) -> Self {
Self {
publish_policy:
proto::web_rtc_publish_endpoint::PublishPolicy::from_i32(
from.publish_policy,
)
.unwrap_or_default()
.into(),
}
}
}
impl From<VideoSettings> for proto::web_rtc_publish_endpoint::VideoSettings {
#[inline]
fn from(from: VideoSettings) -> Self {
use proto::web_rtc_publish_endpoint::PublishPolicy;
Self {
publish_policy: PublishPolicy::from(from.publish_policy).into(),
}
}
}
impl From<&proto::WebRtcPublishEndpoint> for WebRtcPublishEndpoint {
fn from(value: &proto::WebRtcPublishEndpoint) -> Self {
Self {
p2p: P2pMode::from(
proto::web_rtc_publish_endpoint::P2p::from_i32(value.p2p)
.unwrap_or_default(),
),
audio_settings: value
.audio_settings
.as_ref()
.map(AudioSettings::from)
.unwrap_or_default(),
video_settings: value
.video_settings
.as_ref()
.map(VideoSettings::from)
.unwrap_or_default(),
force_relay: value.force_relay,
}
}
}