use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(Default, Debug, PartialEq, Eq, Copy, Clone, Serialize, Deserialize)]
pub enum RTCSdpType {
#[default]
Unspecified = 0,
#[serde(rename = "offer")]
Offer,
#[serde(rename = "pranswer")]
Pranswer,
#[serde(rename = "answer")]
Answer,
#[serde(rename = "rollback")]
Rollback,
}
const SDP_TYPE_OFFER_STR: &str = "offer";
const SDP_TYPE_PRANSWER_STR: &str = "pranswer";
const SDP_TYPE_ANSWER_STR: &str = "answer";
const SDP_TYPE_ROLLBACK_STR: &str = "rollback";
impl From<&str> for RTCSdpType {
fn from(raw: &str) -> Self {
match raw {
SDP_TYPE_OFFER_STR => RTCSdpType::Offer,
SDP_TYPE_PRANSWER_STR => RTCSdpType::Pranswer,
SDP_TYPE_ANSWER_STR => RTCSdpType::Answer,
SDP_TYPE_ROLLBACK_STR => RTCSdpType::Rollback,
_ => RTCSdpType::Unspecified,
}
}
}
impl fmt::Display for RTCSdpType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match *self {
RTCSdpType::Offer => write!(f, "{SDP_TYPE_OFFER_STR}"),
RTCSdpType::Pranswer => write!(f, "{SDP_TYPE_PRANSWER_STR}"),
RTCSdpType::Answer => write!(f, "{SDP_TYPE_ANSWER_STR}"),
RTCSdpType::Rollback => write!(f, "{SDP_TYPE_ROLLBACK_STR}"),
_ => write!(f, "{}", crate::UNSPECIFIED_STR),
}
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_new_sdp_type() {
let tests = vec![
("Unspecified", RTCSdpType::Unspecified),
("offer", RTCSdpType::Offer),
("pranswer", RTCSdpType::Pranswer),
("answer", RTCSdpType::Answer),
("rollback", RTCSdpType::Rollback),
];
for (sdp_type_string, expected_sdp_type) in tests {
assert_eq!(RTCSdpType::from(sdp_type_string), expected_sdp_type);
}
}
#[test]
fn test_sdp_type_string() {
let tests = vec![
(RTCSdpType::Unspecified, "Unspecified"),
(RTCSdpType::Offer, "offer"),
(RTCSdpType::Pranswer, "pranswer"),
(RTCSdpType::Answer, "answer"),
(RTCSdpType::Rollback, "rollback"),
];
for (sdp_type, expected_string) in tests {
assert_eq!(sdp_type.to_string(), expected_string);
}
}
}