use rvoip_sip_core::types::headers::{HeaderName, TypedHeader};
pub trait SipHeaderView {
fn header(&self, name: &HeaderName) -> Option<&TypedHeader>;
fn headers_named<'a>(
&'a self,
name: &HeaderName,
) -> Box<dyn Iterator<Item = &'a TypedHeader> + 'a>;
fn headers<'a>(&'a self) -> Box<dyn Iterator<Item = &'a TypedHeader> + 'a>;
fn header_str(&self, name: &HeaderName) -> Option<String> {
self.header(name).map(|h| h.to_string())
}
fn header_names(&self) -> Vec<HeaderName>;
}
pub(crate) fn header_name_eq(a: &HeaderName, b: &HeaderName) -> bool {
match (a, b) {
(HeaderName::Other(x), HeaderName::Other(y)) => x.eq_ignore_ascii_case(y),
_ => a == b,
}
}
pub(crate) fn header_slice<'a>(
slice: &'a [TypedHeader],
name: &HeaderName,
) -> Option<&'a TypedHeader> {
slice.iter().find(|h| header_name_eq(&h.name(), name))
}
pub(crate) fn headers_named_slice<'a>(
slice: &'a [TypedHeader],
name: &'a HeaderName,
) -> impl Iterator<Item = &'a TypedHeader> + 'a {
slice
.iter()
.filter(move |h| header_name_eq(&h.name(), name))
}
pub(crate) fn header_names_slice(slice: &[TypedHeader]) -> Vec<HeaderName> {
let mut out: Vec<HeaderName> = Vec::with_capacity(slice.len());
for h in slice {
let n = h.name();
if !out.iter().any(|existing| header_name_eq(existing, &n)) {
out.push(n);
}
}
out
}