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}