secret_vault/
vault_viewer.rs

1use crate::errors::*;
2use crate::vault_store::SecretVaultStore;
3use crate::*;
4use async_trait::async_trait;
5use std::sync::Arc;
6
7#[async_trait]
8pub trait SecretVaultView {
9    async fn get_secret(&self, secret_name: &SecretName) -> SecretVaultResult<Option<Secret>> {
10        self.get_secret_with_version(secret_name, None).await
11    }
12
13    async fn require_secret(&self, secret_name: &SecretName) -> SecretVaultResult<Secret> {
14        self.require_secret_with_version(secret_name, None).await
15    }
16
17    async fn get_secret_with_version(
18        &self,
19        secret_name: &SecretName,
20        secret_version: Option<&SecretVersion>,
21    ) -> SecretVaultResult<Option<Secret>> {
22        self.get_secret_by_ref(
23            &SecretVaultRef::new(secret_name.clone()).opt_secret_version(secret_version.cloned()),
24        )
25        .await
26    }
27
28    async fn require_secret_with_version(
29        &self,
30        secret_name: &SecretName,
31        secret_version: Option<&SecretVersion>,
32    ) -> SecretVaultResult<Secret> {
33        self.require_secret_by_ref(
34            &SecretVaultRef::new(secret_name.clone()).opt_secret_version(secret_version.cloned()),
35        )
36        .await
37    }
38
39    async fn require_secret_by_ref(
40        &self,
41        secret_ref: &SecretVaultRef,
42    ) -> SecretVaultResult<Secret> {
43        match self.get_secret_by_ref(secret_ref).await? {
44            Some(secret) => Ok(secret),
45            None => Err(SecretVaultError::DataNotFoundError(
46                SecretVaultDataNotFoundError::new(
47                    SecretVaultErrorPublicGenericDetails::new("SECRET_NOT_FOUND".into()),
48                    format!("Secret {secret_ref:?} doesn't exist in vault but was required"),
49                ),
50            )),
51        }
52    }
53
54    async fn get_secret_by_ref(
55        &self,
56        secret_ref: &SecretVaultRef,
57    ) -> SecretVaultResult<Option<Secret>>;
58}
59
60#[derive(Clone)]
61pub struct SecretVaultViewer<E>
62where
63    E: SecretVaultEncryption,
64{
65    store: Arc<SecretVaultStore<E>>,
66}
67
68impl<E> SecretVaultViewer<E>
69where
70    E: SecretVaultEncryption,
71{
72    pub fn new(store: Arc<SecretVaultStore<E>>) -> Self {
73        Self { store }
74    }
75}
76
77#[async_trait]
78impl<E> SecretVaultView for SecretVaultViewer<E>
79where
80    E: SecretVaultEncryption + Send + Sync,
81{
82    async fn get_secret_by_ref(
83        &self,
84        secret_ref: &SecretVaultRef,
85    ) -> SecretVaultResult<Option<Secret>> {
86        self.store.get_secret(&secret_ref.key).await
87    }
88}