use std::sync::Arc;
use bytes::Bytes;
use crate::Result;
#[async_trait::async_trait]
pub trait SecretManager: Send + Sync + 'static {
async fn put_secret(&self, secret_name: &str, secret_value: Bytes) -> Result<()>;
async fn get_secret(&self, secret_name: &str) -> Result<Bytes>;
async fn delete_secret(&self, secret_name: &str) -> Result<()>;
}
pub trait ProvidesSecretManager: Send + Sync + 'static {
fn secret_manager(&self) -> &dyn SecretManager;
}
#[async_trait::async_trait]
impl<T: SecretManager> SecretManager for Arc<T> {
async fn put_secret(&self, secret_name: &str, secret_value: Bytes) -> Result<()> {
T::put_secret(self, secret_name, secret_value).await
}
async fn get_secret(&self, secret_name: &str) -> Result<Bytes> {
T::get_secret(self, secret_name).await
}
async fn delete_secret(&self, secret_name: &str) -> Result<()> {
T::delete_secret(self, secret_name).await
}
}
#[async_trait::async_trait]
impl<T: ProvidesSecretManager> SecretManager for T {
async fn put_secret(&self, secret_name: &str, secret_value: Bytes) -> Result<()> {
self.secret_manager()
.put_secret(secret_name, secret_value)
.await
}
async fn get_secret(&self, secret_name: &str) -> Result<Bytes> {
self.secret_manager().get_secret(secret_name).await
}
async fn delete_secret(&self, secret_name: &str) -> Result<()> {
self.secret_manager().delete_secret(secret_name).await
}
}