1use secrecy::{ExposeSecret as _, SecretString};
4use serde::Serializer;
5
6pub fn expose_secret_string<S: Serializer>(
27 secret: &SecretString,
28 ser: S,
29) -> Result<S::Ok, S::Error> {
30 ser.serialize_str(secret.expose_secret())
31}
32
33#[cfg(test)]
34mod tests {
35 use serde::Serialize;
36
37 use super::*;
38
39 #[test]
40 fn serialize_secret_string() {
41 #[derive(Debug, Serialize)]
42 struct Login {
43 email: String,
44 #[serde(serialize_with = "expose_secret_string")]
45 password: SecretString,
46 }
47
48 let req = Login {
49 email: "foo@example.com".to_owned(),
50 password: SecretString::from("hunter2"),
51 };
52
53 let debug = format!("{req:?}");
54 let json = serde_json::to_string(&req).unwrap();
55
56 assert!(debug.contains("example.com"));
57 assert!(json.contains("example.com"));
58
59 assert!(!debug.contains("hunter2"));
60 assert!(json.contains("hunter2"));
61 }
62}