use std::fmt::{self, Debug, Formatter};
#[derive(Clone, Eq, PartialEq)]
pub struct AuthHeader {
value: String,
resource: Option<String>,
}
impl AuthHeader {
pub fn new(value: impl Into<String>) -> Self {
Self {
value: value.into(),
resource: None,
}
}
pub fn for_resource(self, resource: impl Into<String>) -> Self {
Self {
resource: Some(resource.into()),
..self
}
}
pub fn as_str(&self) -> &str {
&self.value
}
pub fn resource(&self) -> Option<&str> {
self.resource.as_deref()
}
}
impl From<String> for AuthHeader {
fn from(value: String) -> Self {
Self::new(value)
}
}
impl From<&str> for AuthHeader {
fn from(value: &str) -> Self {
Self::new(value)
}
}
impl Debug for AuthHeader {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
formatter.write_str("AuthHeader([REDACTED])")
}
}
#[cfg(test)]
mod tests {
use super::AuthHeader;
#[test]
fn preserves_authorization_values_and_redacts_debug_output() {
let value = "CustomScheme secret.token ";
let header = AuthHeader::new(value);
assert_eq!(header.as_str(), value);
assert_eq!(header.clone(), header);
assert_eq!(format!("{header:?}"), "AuthHeader([REDACTED])");
assert_eq!(AuthHeader::new("").as_str(), "");
}
}