use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum RTCIceComponent {
#[default]
#[serde(rename = "rtp")]
Rtp,
#[serde(rename = "rtcp")]
Rtcp,
}
const ICE_COMPONENT_RTP_STR: &str = "rtp";
const ICE_COMPONENT_RTCP_STR: &str = "rtcp";
impl From<&str> for RTCIceComponent {
fn from(raw: &str) -> Self {
match raw {
ICE_COMPONENT_RTP_STR => RTCIceComponent::Rtp,
ICE_COMPONENT_RTCP_STR => RTCIceComponent::Rtcp,
_ => RTCIceComponent::Rtp,
}
}
}
impl fmt::Display for RTCIceComponent {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match *self {
RTCIceComponent::Rtp => ICE_COMPONENT_RTP_STR,
RTCIceComponent::Rtcp => ICE_COMPONENT_RTCP_STR,
};
write!(f, "{s}")
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_ice_component_string_round_trip() {
for component in [RTCIceComponent::Rtp, RTCIceComponent::Rtcp] {
assert_eq!(
RTCIceComponent::from(component.to_string().as_str()),
component
);
}
}
#[test]
fn test_ice_component_default_is_rtp() {
assert_eq!(RTCIceComponent::default(), RTCIceComponent::Rtp);
assert_eq!(
RTCIceComponent::from("not a component"),
RTCIceComponent::Rtp
);
}
}