config_types/
secret.rs

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}