Skip to main content

aws_lite_rs/api/
secretsmanager.rs

1//! AWS Secrets Manager API client.
2//!
3//! Thin wrapper over generated ops. All URL construction and HTTP methods
4//! are in `ops::secretsmanager::SecretsmanagerOps`. This layer adds:
5//! - Ergonomic method signatures
6
7use crate::{
8    AwsHttpClient, Result,
9    ops::secretsmanager::SecretsmanagerOps,
10    types::secretsmanager::{
11        DeleteSecretRequest, DeleteSecretResponse, ListSecretsRequest, ListSecretsResponse,
12        RotateSecretRequest, RotateSecretResponse,
13    },
14};
15
16/// Client for the AWS Secrets Manager API
17pub struct SecretsmanagerClient<'a> {
18    ops: SecretsmanagerOps<'a>,
19}
20
21impl<'a> SecretsmanagerClient<'a> {
22    /// Create a new AWS Secrets Manager API client
23    pub(crate) fn new(client: &'a AwsHttpClient) -> Self {
24        Self {
25            ops: SecretsmanagerOps::new(client),
26        }
27    }
28
29    /// Lists the secrets that are stored by Secrets Manager in the current account and Region.
30    pub async fn list_secrets(&self, body: &ListSecretsRequest) -> Result<ListSecretsResponse> {
31        self.ops.list_secrets(body).await
32    }
33
34    /// Deletes a secret and all of its versions.
35    pub async fn delete_secret(&self, body: &DeleteSecretRequest) -> Result<DeleteSecretResponse> {
36        self.ops.delete_secret(body).await
37    }
38
39    /// Configures and starts the asynchronous process of rotating the secret.
40    pub async fn rotate_secret(&self, body: &RotateSecretRequest) -> Result<RotateSecretResponse> {
41        self.ops.rotate_secret(body).await
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[tokio::test]
50    async fn list_secrets_returns_secret_list() {
51        let mut mock = crate::MockClient::new();
52        mock.expect_post("/").returning_json(serde_json::json!({
53            "SecretList": [
54                {
55                    "ARN": "arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-AbCd",
56                    "Name": "my-secret",
57                    "Description": "My test secret",
58                    "RotationEnabled": false,
59                    "CreatedDate": 1700000000.0,
60                    "LastChangedDate": 1700001000.0
61                }
62            ],
63            "NextToken": null
64        }));
65        let client = crate::AwsHttpClient::from_mock(mock);
66        let result = client
67            .secretsmanager()
68            .list_secrets(&ListSecretsRequest::default())
69            .await
70            .unwrap();
71        assert_eq!(result.secret_list.len(), 1);
72        let entry = &result.secret_list[0];
73        assert_eq!(
74            entry.arn.as_deref(),
75            Some("arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-AbCd")
76        );
77        assert_eq!(entry.name.as_deref(), Some("my-secret"));
78        assert_eq!(entry.rotation_enabled, Some(false));
79        assert_eq!(entry.created_date, Some(1700000000.0));
80    }
81
82    #[tokio::test]
83    async fn delete_secret_returns_arn_and_name() {
84        let mut mock = crate::MockClient::new();
85        mock.expect_post("/").returning_json(serde_json::json!({
86            "ARN": "arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-AbCd",
87            "Name": "my-secret",
88            "DeletionDate": 1700086400.0
89        }));
90        let client = crate::AwsHttpClient::from_mock(mock);
91        let result = client
92            .secretsmanager()
93            .delete_secret(&DeleteSecretRequest {
94                secret_id: "my-secret".to_string(),
95                force_delete_without_recovery: Some(true),
96                ..Default::default()
97            })
98            .await
99            .unwrap();
100        assert_eq!(
101            result.arn.as_deref(),
102            Some("arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-AbCd")
103        );
104        assert_eq!(result.name.as_deref(), Some("my-secret"));
105        assert_eq!(result.deletion_date, Some(1700086400.0));
106    }
107
108    #[tokio::test]
109    async fn rotate_secret_returns_arn_and_version() {
110        let mut mock = crate::MockClient::new();
111        mock.expect_post("/").returning_json(serde_json::json!({
112            "ARN": "arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-AbCd",
113            "Name": "my-secret",
114            "VersionId": "abc-version-123"
115        }));
116        let client = crate::AwsHttpClient::from_mock(mock);
117        let result = client
118            .secretsmanager()
119            .rotate_secret(&RotateSecretRequest {
120                secret_id: "my-secret".to_string(),
121                ..Default::default()
122            })
123            .await
124            .unwrap();
125        assert_eq!(
126            result.arn.as_deref(),
127            Some("arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-AbCd")
128        );
129        assert_eq!(result.name.as_deref(), Some("my-secret"));
130        assert_eq!(result.version_id.as_deref(), Some("abc-version-123"));
131    }
132}