use std::fmt;
use std::net::SocketAddr;
#[derive(Clone, PartialEq, Eq)]
pub struct EgressEndpoint {
pub address: SocketAddr,
pub token: String,
}
impl fmt::Debug for EgressEndpoint {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("EgressEndpoint")
.field("address", &self.address)
.field("token", &"<redacted>")
.finish()
}
}
#[cfg(test)]
mod tests {
use super::EgressEndpoint;
const TOKEN: &str = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
fn endpoint(address: &str) -> EgressEndpoint {
EgressEndpoint {
address: address.parse().unwrap(),
token: TOKEN.into(),
}
}
#[test]
fn debug_output_redacts_the_token_but_keeps_the_address() {
let endpoint = endpoint("127.0.0.1:9000");
for debug in [format!("{endpoint:?}"), format!("{endpoint:#?}")] {
assert!(debug.contains("127.0.0.1:9000"), "{debug}");
assert!(debug.contains("token"), "{debug}");
assert!(debug.contains("<redacted>"), "{debug}");
assert!(!debug.contains(TOKEN), "{debug}");
}
}
}