1use serde::{Deserialize, Serialize};
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 Serialize for SecretConf {
27 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
28 where
29 S: serde::Serializer,
30 {
31 self.to_string().serialize(serializer)
32 }
33}
34
35impl std::fmt::Display for SecretConf {
36 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
37 write!(f, "{}", self.to_string())
38 }
39}
40
41impl std::fmt::Debug for SecretConf {
42 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
43 write!(f, "{}", self.to_string())
44 }
45}
46
47#[cfg(test)]
48mod tests {
49 use super::*;
50
51 #[test]
52 fn test_secret() {
53 let s = SecretConf::new("secret");
54 assert_eq!(s.to_string(), "*".repeat(6));
55 }
56}