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