mod aws;
mod azure;
mod gcp;
mod k8s;
mod resolver;
mod vault;
pub use aws::AwsSmSecretProvider;
pub use azure::AzureKeyVaultProvider;
pub use gcp::GcpSecretManager;
pub use k8s::K8sSecretProvider;
pub use resolver::resolve_keychain_entry;
pub use vault::VaultSecretProvider;
use std::sync::Arc;
use async_trait::async_trait;
use crate::error::{AppError, AppResult};
#[derive(Debug, Clone)]
pub struct SecretValue {
pub value: String,
pub version: Option<String>,
}
#[derive(Debug, Clone)]
pub struct SecretRef {
pub name: String,
pub project: Option<String>,
pub version: Option<String>,
}
#[async_trait]
pub trait SecretProvider: Send + Sync {
fn provider(&self) -> &'static str;
async fn fetch(&self, secret: &SecretRef) -> AppResult<SecretValue>;
}
pub fn build_secret_provider(provider: &str) -> AppResult<Arc<dyn SecretProvider>> {
match provider {
"gcp" => Ok(Arc::new(GcpSecretManager::from_env()?)),
"k8s" | "kubernetes" => Ok(Arc::new(K8sSecretProvider::from_env()?)),
"vault" => Ok(Arc::new(VaultSecretProvider::from_env()?)),
"aws" | "aws_sm" => Ok(Arc::new(AwsSmSecretProvider::from_env()?)),
"azure" | "azure_kv" => Ok(Arc::new(AzureKeyVaultProvider::from_env()?)),
other => Err(AppError::Config(format!(
"unsupported keychain secret provider '{other}' (supported: gcp, k8s, vault, aws, azure)"
))),
}
}