use axol_http::{
header::TypedHeader, request::RequestPartsRef, typed_headers::AccessControlExposeHeaders,
};
use super::Any;
#[derive(Clone, Default, Debug)]
#[must_use]
pub struct ExposeHeaders(pub Option<String>);
impl ExposeHeaders {
pub fn any() -> Self {
Self(Some("*".to_string()))
}
pub fn list<'a, I: IntoIterator<Item = &'a str>>(methods: I) -> Self {
let raw = methods.into_iter().collect::<Vec<_>>().join(",");
if raw.is_empty() {
return Self(None);
}
Self(Some(raw))
}
pub(super) fn is_wildcard(&self) -> bool {
matches!(self, Self(Some(x)) if x == "*")
}
pub(super) fn to_header(
&self,
_parts: RequestPartsRef<'_>,
) -> Option<AccessControlExposeHeaders> {
self.0
.as_ref()
.map(|x| AccessControlExposeHeaders::decode(x).unwrap())
}
}
impl From<Any> for ExposeHeaders {
fn from(_: Any) -> Self {
Self::any()
}
}
impl<const N: usize> From<[&str; N]> for ExposeHeaders {
fn from(arr: [&str; N]) -> Self {
Self::list(arr)
}
}
impl From<Vec<&str>> for ExposeHeaders {
fn from(vec: Vec<&str>) -> Self {
Self::list(vec)
}
}