use std::fmt; /// Information describes the "i=" field which provides textual information /// about the session. pub type Information = String; /// ConnectionInformation defines the representation for the "c=" field /// containing connection data. #[derive(Debug, Default, Clone)] pub struct ConnectionInformation { pub network_type: String, pub address_type: String, pub address: Option
, } impl fmt::Display for ConnectionInformation { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if let Some(address) = &self.address { write!(f, "{} {} {}", self.network_type, self.address_type, address,) } else { write!(f, "{} {}", self.network_type, self.address_type,) } } } /// Address describes a structured address token from within the "c=" field. #[derive(Debug, Default, Clone)] pub struct Address { pub address: String, pub ttl: Option, pub range: Option, } impl fmt::Display for Address { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let mut parts = vec![self.address.to_owned()]; if let Some(t) = &self.ttl { parts.push(t.to_string()); } if let Some(r) = &self.range { parts.push(r.to_string()); } write!(f, "{}", parts.join("/")) } } /// Bandwidth describes an optional field which denotes the proposed bandwidth /// to be used by the session or media. #[derive(Debug, Default, Clone)] pub struct Bandwidth { pub experimental: bool, pub bandwidth_type: String, pub bandwidth: u64, } impl fmt::Display for Bandwidth { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let output = if self.experimental { "X-" } else { "" }; write!(f, "{}{}:{}", output, self.bandwidth_type, self.bandwidth) } } /// EncryptionKey describes the "k=" which conveys encryption key information. pub type EncryptionKey = String; /// Attribute describes the "a=" field which represents the primary means for /// extending SDP. #[derive(Debug, Default, Clone)] pub struct Attribute { pub key: String, pub value: Option, } impl fmt::Display for Attribute { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if let Some(value) = &self.value { write!(f, "{}:{}", self.key, value) } else { write!(f, "{}", self.key) } } } impl Attribute { /// new constructs a new attribute pub fn new(key: String, value: Option) -> Self { Attribute { key, value } } /// is_ice_candidate returns true if the attribute key equals "candidate". pub fn is_ice_candidate(&self) -> bool { self.key.as_str() == "candidate" } }