use super::headermap::HeaderMap; use anyhow::{anyhow, bail, Context}; use std::str::FromStr; #[derive(Debug)] pub struct Response { pub code: u16, pub headers: HeaderMap, } impl FromStr for Response { type Err = anyhow::Error; fn from_str(s: &str) -> Result { let mut lines = s.lines(); let statusline = lines.next().ok_or(anyhow!("status line missing"))?; let (sipver, rest) = statusline .split_once(" ") .ok_or(anyhow!("status line malformed"))?; let (code, _status_str) = rest .split_once(" ") .ok_or(anyhow!("status line malformed"))?; let code = u16::from_str(code).context("status code")?; let Some(ver) = sipver.strip_prefix("SIP/") else { bail!("sip version malformed"); }; if ver != "2.0" { bail!("sip version {ver:?} is not supported"); } let mut headers = HeaderMap::new(); for line in lines { // TODO multiline values let (key, value) = line.split_once(":").ok_or(anyhow!("header malformed"))?; headers.insert_raw(key.trim().to_string(), value.trim().to_string()) } Ok(Self { code, headers }) } }