secret_vault/
vault_viewer.rs1use 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}