use crate::error::{Result, TencentCloudError};
use std::env;
#[derive(Debug, Clone)]
pub struct Credential {
pub secret_id: String,
pub secret_key: String,
pub token: Option<String>,
}
impl Credential {
pub fn new<S: Into<String>>(secret_id: S, secret_key: S, token: Option<S>) -> Self {
Self {
secret_id: secret_id.into(),
secret_key: secret_key.into(),
token: token.map(|t| t.into()),
}
}
pub fn from_env() -> Result<Self> {
let secret_id = env::var("TENCENTCLOUD_SECRET_ID")
.or_else(|_| env::var("TC_SECRET_ID"))
.map_err(|_| {
TencentCloudError::auth(
"TENCENTCLOUD_SECRET_ID or TC_SECRET_ID environment variable not found",
)
})?;
let secret_key = env::var("TENCENTCLOUD_SECRET_KEY")
.or_else(|_| env::var("TC_SECRET_KEY"))
.map_err(|_| {
TencentCloudError::auth(
"TENCENTCLOUD_SECRET_KEY or TC_SECRET_KEY environment variable not found",
)
})?;
let token = env::var("TENCENTCLOUD_TOKEN")
.or_else(|_| env::var("TC_TOKEN"))
.ok();
Ok(Self {
secret_id,
secret_key,
token,
})
}
pub fn validate(&self) -> Result<()> {
if self.secret_id.is_empty() {
return Err(TencentCloudError::auth("Secret ID cannot be empty"));
}
if self.secret_key.is_empty() {
return Err(TencentCloudError::auth("Secret Key cannot be empty"));
}
Ok(())
}
pub fn secret_id(&self) -> &str {
&self.secret_id
}
pub fn secret_key(&self) -> &str {
&self.secret_key
}
pub fn token(&self) -> Option<&str> {
self.token.as_deref()
}
pub fn has_token(&self) -> bool {
self.token.is_some()
}
pub fn set_token<S: Into<String>>(&mut self, token: Option<S>) {
self.token = token.map(|t| t.into());
}
}
impl Default for Credential {
fn default() -> Self {
Self {
secret_id: String::new(),
secret_key: String::new(),
token: None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_credential_new() {
let credential = Credential::new("test_id", "test_key", Some("test_token"));
assert_eq!(credential.secret_id, "test_id");
assert_eq!(credential.secret_key, "test_key");
assert_eq!(credential.token, Some("test_token".to_string()));
}
#[test]
fn test_credential_validate() {
let credential = Credential::new("test_id", "test_key", None);
assert!(credential.validate().is_ok());
let invalid_credential = Credential::new("", "test_key", None);
assert!(invalid_credential.validate().is_err());
let invalid_credential = Credential::new("test_id", "", None);
assert!(invalid_credential.validate().is_err());
}
#[test]
fn test_credential_methods() {
let mut credential = Credential::new("test_id", "test_key", None);
assert_eq!(credential.secret_id(), "test_id");
assert_eq!(credential.secret_key(), "test_key");
assert_eq!(credential.token(), None);
assert!(!credential.has_token());
credential.set_token(Some("new_token"));
assert_eq!(credential.token(), Some("new_token"));
assert!(credential.has_token());
}
}