Skip to main content

adk_auth/secrets/
provider.rs

1//! Secret provider trait definition.
2//!
3//! The [`SecretProvider`] trait defines the interface for retrieving secrets
4//! from external secret management services.
5
6use adk_core::AdkError;
7use async_trait::async_trait;
8
9/// Trait for retrieving secrets from an external secret management service.
10///
11/// Implementations are provided for AWS Secrets Manager (`aws-secrets` feature),
12/// Azure Key Vault (`azure-keyvault` feature), and GCP Secret Manager
13/// (`gcp-secrets` feature).
14///
15/// # Example
16///
17/// ```rust,ignore
18/// use adk_auth::secrets::SecretProvider;
19///
20/// async fn use_secret(provider: &dyn SecretProvider) -> Result<(), AdkError> {
21///     let api_key = provider.get_secret("my-api-key").await?;
22///     println!("retrieved secret of length {}", api_key.len());
23///     Ok(())
24/// }
25/// ```
26#[async_trait]
27pub trait SecretProvider: Send + Sync {
28    /// Retrieve a secret value by name.
29    ///
30    /// # Errors
31    ///
32    /// Returns an [`AdkError`] with the appropriate error category:
33    /// - `Unauthorized` for authentication failures
34    /// - `Unavailable` for network errors
35    /// - `NotFound` when the secret does not exist
36    async fn get_secret(&self, name: &str) -> Result<String, AdkError>;
37}
38
39/// Adapter that wraps a [`SecretProvider`] as a
40/// [`SecretService`](adk_core::SecretService) for use with the runner's
41/// [`InvocationContext`].
42///
43/// # Example
44///
45/// ```rust,ignore
46/// use adk_auth::secrets::{SecretProvider, SecretServiceAdapter};
47/// use adk_runner::InvocationContext;
48/// use std::sync::Arc;
49///
50/// let provider: Arc<dyn SecretProvider> = /* ... */;
51/// let service = Arc::new(SecretServiceAdapter::new(provider));
52/// let ctx = InvocationContext::new(/* ... */)?.with_secret_service(service);
53/// ```
54pub struct SecretServiceAdapter {
55    inner: std::sync::Arc<dyn SecretProvider>,
56}
57
58impl SecretServiceAdapter {
59    /// Create a new adapter wrapping the given secret provider.
60    pub fn new(provider: std::sync::Arc<dyn SecretProvider>) -> Self {
61        Self { inner: provider }
62    }
63}
64
65#[async_trait]
66impl adk_core::SecretService for SecretServiceAdapter {
67    async fn get_secret(&self, name: &str) -> adk_core::Result<String> {
68        self.inner.get_secret(name).await
69    }
70}