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}