kraken_async_rs/crypto/
secrets.rs

1use secrecy::{ExposeSecret, SecretString};
2use serde::{Deserialize, Deserializer, Serialize, Serializer};
3use std::fmt::{Debug, Formatter};
4
5#[derive(Clone)]
6pub struct Token(SecretString);
7
8impl Token {
9    pub fn new(token: impl Into<String>) -> Self {
10        let string = token.into();
11        Token(string.into())
12    }
13}
14
15impl Debug for Token {
16    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
17        write!(f, "[REDACTED TOKEN]")
18    }
19}
20
21impl Eq for Token {}
22
23impl PartialEq for Token {
24    fn eq(&self, _: &Self) -> bool {
25        true
26    }
27}
28
29impl<'de> Deserialize<'de> for Token {
30    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
31    where
32        D: Deserializer<'de>,
33    {
34        let token = String::deserialize(deserializer)?;
35        Ok(Token::new(token))
36    }
37}
38
39impl Serialize for Token {
40    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
41    where
42        S: Serializer,
43    {
44        serializer.serialize_str(self.0.expose_secret())
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use crate::crypto::secrets::Token;
51
52    #[test]
53    fn test_secret_debug() {
54        let token = Token::new("shhh");
55
56        let str = format!("{:?}", token);
57
58        assert_eq!("[REDACTED TOKEN]", str);
59    }
60}