tencentcloud_sms/
credential.rs

1use secrecy::SecretString;
2
3#[derive(Clone)]
4pub enum Credential {
5    LongTerm {
6        secret_id: String,
7        secret_key: SecretString,
8    },
9    Temporary {
10        secret_id: String,
11        secret_key: SecretString,
12        token: SecretString,
13    },
14}
15
16// 自定义 Debug 实现,隐藏敏感信息
17impl std::fmt::Debug for Credential {
18    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
19        match self {
20            Self::LongTerm { secret_id, .. } => f
21                .debug_struct("Credential::LongTerm")
22                .field("secret_id", &secret_id)
23                .field("secret_key", &"***")
24                .finish(),
25            Self::Temporary { secret_id, .. } => f
26                .debug_struct("Credential::Temporary")
27                .field("secret_id", &secret_id)
28                .field("secret_key", &"***")
29                .field("token", &"***")
30                .finish(),
31        }
32    }
33}
34
35impl Credential {
36    /// 创建长期凭证
37    ///
38    /// # 参数
39    /// - `secret_id`: SecretId
40    /// - `secret_key`: SecretKey(将被 SecretString 保护)
41    pub fn long_term(secret_id: impl Into<String>, secret_key: impl Into<String>) -> Self {
42        Self::LongTerm {
43            secret_id: secret_id.into(),
44            secret_key: SecretString::new(secret_key.into().into_boxed_str()),
45        }
46    }
47
48    /// 创建临时凭证
49    ///
50    /// # 参数
51    /// - `secret_id`: SecretId
52    /// - `secret_key`: SecretKey(将被 SecretString 保护)
53    /// - `token`: Token(将被 SecretString 保护)
54    pub fn temporary(
55        secret_id: impl Into<String>,
56        secret_key: impl Into<String>,
57        token: impl Into<String>,
58    ) -> Self {
59        Self::Temporary {
60            secret_id: secret_id.into(),
61            secret_key: SecretString::new(secret_key.into().into_boxed_str()),
62            token: SecretString::new(token.into().into_boxed_str()),
63        }
64    }
65
66    /// 获取 SecretId
67    pub fn secret_id(&self) -> &str {
68        match self {
69            Self::LongTerm { secret_id, .. } => secret_id,
70            Self::Temporary { secret_id, .. } => secret_id,
71        }
72    }
73
74    /// 获取 SecretKey(受保护,只在需要时暴露)
75    ///
76    /// # 安全性
77    /// 此方法返回受保护的 SecretString,调用方需要使用 `expose_secret()` 才能访问实际值
78    pub fn secret_key(&self) -> &SecretString {
79        match self {
80            Self::LongTerm { secret_key, .. } => secret_key,
81            Self::Temporary { secret_key, .. } => secret_key,
82        }
83    }
84
85    /// 获取 Token(受保护,只在需要时暴露)
86    ///
87    /// # 安全性
88    /// 此方法返回受保护的 SecretString,调用方需要使用 `expose_secret()` 才能访问实际值
89    pub fn token(&self) -> Option<&SecretString> {
90        match self {
91            Self::LongTerm { .. } => None,
92            Self::Temporary { token, .. } => Some(token),
93        }
94    }
95}