config_types/
secret.rs

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}