use anyhow::{anyhow, bail}; use std::str::FromStr; pub struct SessionDescription { version: String, originator: String, session_name: String, session_information: Option, description_uri: Option, email_address: Option, phone_number: Option, connection_information: Vec, bandwidth: Vec, time_descriptions: Vec, time_zone_adjustments: Option, encryption_key: Option, session_attribute: Vec, media_descriptions: Vec, } pub struct TimeDescription { time: String, repeat_times: Vec, } pub struct MediaDescription { name: String, title: String, connection_information: String, } impl FromStr for SessionDescription { type Err = anyhow::Error; fn from_str(s: &str) -> Result { let mut version = None; let mut originator = None; let mut session_name = None; let mut session_information = None; let mut description_uri = None; let mut email_address = None; let mut phone_number = None; let mut connection_information = Vec::new(); let mut bandwidth = Vec::new(); for line in s.lines() { let (r#type, value) = line.split_once("=").ok_or(anyhow!("sdp line invalid"))?; match r#type { "v" => version = Some(value.to_string()), "o" => originator = Some(value.to_string()), "s" => session_name = Some(value.to_string()), "s" => session_name = Some(value.to_string()), x => bail!("unknown sdp type ({x:?})"), } } Ok(Self {}) } }