Implement Serialize and Deserialize for SessionDescriptionType.
This commit is contained in:
parent
145221eace
commit
b016a0b48b
@ -2,6 +2,12 @@
|
|||||||
//!
|
//!
|
||||||
//! This module also contains types shared by events in its child namespaces.
|
//! This module also contains types shared by events in its child namespaces.
|
||||||
|
|
||||||
|
use std::fmt::{Display, Formatter, Error as FmtError};
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use serde::{Deserialize, Deserializer, Error as SerdeError, Serialize, Serializer};
|
||||||
|
use serde::de::Visitor;
|
||||||
|
|
||||||
pub mod answer;
|
pub mod answer;
|
||||||
pub mod candidates;
|
pub mod candidates;
|
||||||
pub mod hangup;
|
pub mod hangup;
|
||||||
@ -17,10 +23,88 @@ pub struct SessionDescription {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// The type of VoIP session description.
|
/// The type of VoIP session description.
|
||||||
#[derive(Debug, Deserialize, Serialize)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub enum SessionDescriptionType {
|
pub enum SessionDescriptionType {
|
||||||
/// An answer.
|
/// An answer.
|
||||||
Answer,
|
Answer,
|
||||||
/// An offer.
|
/// An offer.
|
||||||
Offer,
|
Offer,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// An error when attempting to parse an invalid `SessionDescriptionType` from a string.
|
||||||
|
pub struct SessionDescriptionTypeParseError;
|
||||||
|
|
||||||
|
impl Display for SessionDescriptionType {
|
||||||
|
fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> {
|
||||||
|
let session_description_type_str = match *self {
|
||||||
|
SessionDescriptionType::Answer => "answer",
|
||||||
|
SessionDescriptionType::Offer => "offer",
|
||||||
|
};
|
||||||
|
|
||||||
|
write!(f, "{}", session_description_type_str)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for SessionDescriptionType {
|
||||||
|
type Err = SessionDescriptionTypeParseError;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match s {
|
||||||
|
"answer" => Ok(SessionDescriptionType::Answer),
|
||||||
|
"offer" => Ok(SessionDescriptionType::Offer),
|
||||||
|
_ => Err(SessionDescriptionTypeParseError),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serialize for SessionDescriptionType {
|
||||||
|
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error> where S: Serializer {
|
||||||
|
serializer.serialize_str(&self.to_string())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deserialize for SessionDescriptionType {
|
||||||
|
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error> where D: Deserializer {
|
||||||
|
struct SessionDescriptionTypeVisitor;
|
||||||
|
|
||||||
|
impl Visitor for SessionDescriptionTypeVisitor {
|
||||||
|
type Value = SessionDescriptionType;
|
||||||
|
|
||||||
|
fn visit_str<E>(&mut self, v: &str) -> Result<Self::Value, E> where E: SerdeError {
|
||||||
|
v.parse().map_err(|_| {
|
||||||
|
E::invalid_value(v)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deserializer.deserialize_str(SessionDescriptionTypeVisitor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use serde_json::{from_str, to_string};
|
||||||
|
|
||||||
|
use super::SessionDescriptionType;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn session_description_types_serialize_to_display_form() {
|
||||||
|
assert_eq!(
|
||||||
|
to_string(&SessionDescriptionType::Answer).unwrap(),
|
||||||
|
r#""answer""#
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn session_description_types_deserialize_from_display_form() {
|
||||||
|
assert_eq!(
|
||||||
|
from_str::<SessionDescriptionType>(r#""answer""#).unwrap(),
|
||||||
|
SessionDescriptionType::Answer
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn invalid_session_description_types_fail_deserialization() {
|
||||||
|
assert!(from_str::<SessionDescriptionType>(r#""bad""#).is_err());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -227,8 +227,7 @@ impl Deserialize for EventType {
|
|||||||
impl Visitor for EventTypeVisitor {
|
impl Visitor for EventTypeVisitor {
|
||||||
type Value = EventType;
|
type Value = EventType;
|
||||||
|
|
||||||
fn visit_str<E>(&mut self, v: &str) -> Result<Self::Value, E>
|
fn visit_str<E>(&mut self, v: &str) -> Result<Self::Value, E> where E: SerdeError {
|
||||||
where E: SerdeError {
|
|
||||||
Ok(EventType::from(v))
|
Ok(EventType::from(v))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user