aws_smithy_http_server/instrumentation/sensitivity/
sensitive.rs1use std::fmt::{Debug, Display, Error, Formatter};
9
10use crate::instrumentation::MakeFmt;
11
12use super::REDACTED;
13
14pub struct Sensitive<T>(pub T);
34
35impl<T> Debug for Sensitive<T>
36where
37    T: Debug,
38{
39    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
40        if cfg!(feature = "unredacted-logging") {
41            self.0.fmt(f)
42        } else {
43            Debug::fmt(&REDACTED, f)
44        }
45    }
46}
47
48impl<T> Display for Sensitive<T>
49where
50    T: Display,
51{
52    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
53        if cfg!(feature = "unredacted-logging") {
54            self.0.fmt(f)
55        } else {
56            Display::fmt(&REDACTED, f)
57        }
58    }
59}
60
61#[derive(Debug, Clone)]
63pub struct MakeSensitive;
64
65impl<T> MakeFmt<T> for MakeSensitive {
66    type Target = Sensitive<T>;
67
68    fn make(&self, source: T) -> Self::Target {
69        Sensitive(source)
70    }
71}
72
73#[cfg(test)]
74mod tests {
75    use super::*;
76
77    #[test]
78    fn debug() {
79        let inner = "hello world";
80        let sensitive = Sensitive(inner);
81        let actual = format!("{:?}", sensitive);
82        let expected = if cfg!(feature = "unredacted-logging") {
83            format!("{:?}", inner)
84        } else {
85            format!("{:?}", REDACTED)
86        };
87        assert_eq!(actual, expected)
88    }
89
90    #[test]
91    fn display() {
92        let inner = "hello world";
93        let sensitive = Sensitive(inner);
94        let actual = format!("{}", sensitive);
95        let expected = if cfg!(feature = "unredacted-logging") {
96            inner.to_string()
97        } else {
98            REDACTED.to_string()
99        };
100        assert_eq!(actual, expected)
101    }
102}