1use std::fmt::{self, Debug, Formatter};
4
5#[derive(Clone, Eq, PartialEq)]
15pub struct AuthHeader {
16 value: String,
17 resource: Option<String>,
18}
19
20impl AuthHeader {
21 pub fn new(value: impl Into<String>) -> Self {
23 Self {
24 value: value.into(),
25 resource: None,
26 }
27 }
28
29 pub fn for_resource(self, resource: impl Into<String>) -> Self {
31 Self {
32 resource: Some(resource.into()),
33 ..self
34 }
35 }
36
37 pub fn as_str(&self) -> &str {
39 &self.value
40 }
41
42 pub fn resource(&self) -> Option<&str> {
44 self.resource.as_deref()
45 }
46}
47
48impl From<String> for AuthHeader {
49 fn from(value: String) -> Self {
50 Self::new(value)
51 }
52}
53
54impl From<&str> for AuthHeader {
55 fn from(value: &str) -> Self {
56 Self::new(value)
57 }
58}
59
60impl Debug for AuthHeader {
61 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
62 formatter.write_str("AuthHeader([REDACTED])")
63 }
64}
65
66#[cfg(test)]
67mod tests {
68 use super::AuthHeader;
69
70 #[test]
71 fn preserves_authorization_values_and_redacts_debug_output() {
72 let value = "CustomScheme secret.token ";
73 let header = AuthHeader::new(value);
74 assert_eq!(header.as_str(), value);
75 assert_eq!(header.clone(), header);
76 assert_eq!(format!("{header:?}"), "AuthHeader([REDACTED])");
77 assert_eq!(AuthHeader::new("").as_str(), "");
78 }
79}