use rama_core::error::BoxErrorExt as _;
use rama_core::error::{BoxError, ErrorExt as _};
use rama_core::extensions::Extension;
use rama_http::headers::ClientHint;
use rama_utils::macros::match_ignore_ascii_case_str;
use std::sync::Arc;
use std::{fmt, ops::Deref, str::FromStr};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Extension)]
#[extension(tags(ua))]
#[non_exhaustive]
pub struct PreserveHeaderUserAgent;
impl PreserveHeaderUserAgent {
#[inline]
#[must_use]
pub fn new() -> Self {
Default::default()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Extension)]
#[extension(tags(ua))]
pub struct RequestClientHints(pub Arc<[ClientHint]>);
impl AsRef<[ClientHint]> for RequestClientHints {
fn as_ref(&self) -> &[ClientHint] {
self.0.deref()
}
}
impl Deref for RequestClientHints {
type Target = [ClientHint];
fn deref(&self) -> &Self::Target {
self.0.deref()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Extension)]
#[extension(tags(ua))]
pub enum RequestInitiator {
Navigate,
Form,
Xhr,
Fetch,
Ws,
}
impl RequestInitiator {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Self::Navigate => "navigate",
Self::Form => "form",
Self::Xhr => "xhr",
Self::Fetch => "fetch",
Self::Ws => "ws",
}
}
}
impl fmt::Display for RequestInitiator {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
use rama_utils::macros::serde_str::impl_serde_str;
impl_serde_str!(as_str RequestInitiator);
impl FromStr for RequestInitiator {
type Err = BoxError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match_ignore_ascii_case_str! {
match (s) {
"navigate" => Ok(Self::Navigate),
"form" => Ok(Self::Form),
"xhr" => Ok(Self::Xhr),
"fetch" => Ok(Self::Fetch),
_ => Err(BoxError::from_static_str("invalid request initiator").context_str_field("str", s)),
}
}
}
}