kraken_async_rs/crypto/
secrets.rs1use 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}