use crate::error::{Error, Result};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReferrerPolicy {
NoReferrer,
NoReferrerWhenDowngrade,
Origin,
OriginWhenCrossOrigin,
SameOrigin,
StrictOrigin,
StrictOriginWhenCrossOrigin,
UnsafeUrl,
}
impl ReferrerPolicy {
pub fn as_str(&self) -> &'static str {
match self {
Self::NoReferrer => "no-referrer",
Self::NoReferrerWhenDowngrade => "no-referrer-when-downgrade",
Self::Origin => "origin",
Self::OriginWhenCrossOrigin => "origin-when-cross-origin",
Self::SameOrigin => "same-origin",
Self::StrictOrigin => "strict-origin",
Self::StrictOriginWhenCrossOrigin => "strict-origin-when-cross-origin",
Self::UnsafeUrl => "unsafe-url",
}
}
}
impl std::str::FromStr for ReferrerPolicy {
type Err = Error;
fn from_str(s: &str) -> Result<Self> {
match s.to_lowercase().as_str() {
"no-referrer" => Ok(Self::NoReferrer),
"no-referrer-when-downgrade" => Ok(Self::NoReferrerWhenDowngrade),
"origin" => Ok(Self::Origin),
"origin-when-cross-origin" => Ok(Self::OriginWhenCrossOrigin),
"same-origin" => Ok(Self::SameOrigin),
"strict-origin" => Ok(Self::StrictOrigin),
"strict-origin-when-cross-origin" => Ok(Self::StrictOriginWhenCrossOrigin),
"unsafe-url" => Ok(Self::UnsafeUrl),
_ => Err(Error::InvalidReferrerPolicy(format!(
"Unknown referrer policy: '{}'",
s
))),
}
}
}
impl std::fmt::Display for ReferrerPolicy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::str::FromStr;
#[test]
fn test_as_str() {
assert_eq!(ReferrerPolicy::NoReferrer.as_str(), "no-referrer");
assert_eq!(
ReferrerPolicy::NoReferrerWhenDowngrade.as_str(),
"no-referrer-when-downgrade"
);
assert_eq!(ReferrerPolicy::Origin.as_str(), "origin");
assert_eq!(
ReferrerPolicy::OriginWhenCrossOrigin.as_str(),
"origin-when-cross-origin"
);
assert_eq!(ReferrerPolicy::SameOrigin.as_str(), "same-origin");
assert_eq!(ReferrerPolicy::StrictOrigin.as_str(), "strict-origin");
assert_eq!(
ReferrerPolicy::StrictOriginWhenCrossOrigin.as_str(),
"strict-origin-when-cross-origin"
);
assert_eq!(ReferrerPolicy::UnsafeUrl.as_str(), "unsafe-url");
}
#[test]
fn test_from_str() {
assert_eq!(
ReferrerPolicy::from_str("no-referrer").unwrap(),
ReferrerPolicy::NoReferrer
);
assert_eq!(
ReferrerPolicy::from_str("NO-REFERRER").unwrap(),
ReferrerPolicy::NoReferrer
);
assert_eq!(
ReferrerPolicy::from_str("strict-origin-when-cross-origin").unwrap(),
ReferrerPolicy::StrictOriginWhenCrossOrigin
);
assert!(ReferrerPolicy::from_str("invalid").is_err());
}
#[test]
fn test_display() {
assert_eq!(ReferrerPolicy::NoReferrer.to_string(), "no-referrer");
assert_eq!(
ReferrerPolicy::StrictOriginWhenCrossOrigin.to_string(),
"strict-origin-when-cross-origin"
);
}
}