1use serde::Deserialize;
2
3#[derive(Clone, Default)]
4pub struct SecretConf(String);
5
6impl SecretConf {
7 pub fn new(s: &str) -> Self {
8 SecretConf(s.to_string())
9 }
10
11 fn to_string(&self) -> String {
12 format!("{}", "*".repeat(self.0.len()))
13 }
14}
15
16impl<'de> Deserialize<'de> for SecretConf {
17 fn deserialize<D>(deserializer: D) -> Result<SecretConf, D::Error>
18 where
19 D: serde::Deserializer<'de>,
20 {
21 let s = String::deserialize(deserializer)?;
22 Ok(SecretConf(s))
23 }
24}
25
26impl std::fmt::Display for SecretConf {
27 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
28 write!(f, "{}", self.to_string())
29 }
30}
31
32impl std::fmt::Debug for SecretConf {
33 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
34 write!(f, "{}", self.to_string())
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41
42 #[test]
43 fn test_secret() {
44 let s = SecretConf::new("secret");
45 assert_eq!(s.to_string(), "*".repeat(6));
46 }
47}