use rand::{distributions::Alphanumeric, Rng};
use super::{SecretManager, SecretManagerError};
const SECRET_LENGTH: usize = 64;
pub struct AutoSecretManager {
secret: String,
}
impl Default for AutoSecretManager {
fn default() -> Self {
AutoSecretManager {
secret: generate_random_secret(),
}
}
}
impl SecretManager for AutoSecretManager {
fn secret(&self) -> Result<String, SecretManagerError> {
Ok(self.secret.to_owned())
}
fn update_secret(&mut self) -> Result<(), SecretManagerError> {
self.secret = generate_random_secret();
Ok(())
}
}
fn generate_random_secret() -> String {
let mut rng = rand::thread_rng();
std::iter::repeat(())
.map(|()| rng.sample(Alphanumeric))
.map(char::from)
.take(SECRET_LENGTH)
.collect()
}