greentic_secrets_spec/
backend.rs

1use crate::error::Result;
2use crate::types::{Scope, SecretListItem, SecretRecord};
3use crate::uri::SecretUri;
4#[cfg(feature = "serde")]
5use serde::{Deserialize, Serialize};
6#[cfg(feature = "std")]
7use std::sync::Arc;
8
9/// Version metadata describing a specific revision of a secret.
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
12pub struct SecretVersion {
13    pub version: u64,
14    pub deleted: bool,
15}
16
17impl SecretVersion {
18    pub fn is_deleted(&self) -> bool {
19        self.deleted
20    }
21}
22
23/// Versioned record returned by backends.
24#[derive(Debug, Clone, PartialEq, Eq)]
25#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
26pub struct VersionedSecret {
27    pub version: u64,
28    pub deleted: bool,
29    pub record: Option<SecretRecord>,
30}
31
32impl VersionedSecret {
33    pub fn record(&self) -> Option<&SecretRecord> {
34        self.record.as_ref()
35    }
36}
37
38/// Storage interface implemented by provider backends.
39pub trait SecretsBackend: Send + Sync {
40    fn put(&self, record: SecretRecord) -> Result<SecretVersion>;
41    fn get(&self, uri: &SecretUri, version: Option<u64>) -> Result<Option<VersionedSecret>>;
42    fn list(
43        &self,
44        scope: &Scope,
45        category_prefix: Option<&str>,
46        name_prefix: Option<&str>,
47    ) -> Result<Vec<SecretListItem>>;
48    fn delete(&self, uri: &SecretUri) -> Result<SecretVersion>;
49    fn versions(&self, uri: &SecretUri) -> Result<Vec<SecretVersion>>;
50    fn exists(&self, uri: &SecretUri) -> Result<bool>;
51}
52
53#[cfg(feature = "std")]
54impl<T> SecretsBackend for Arc<T>
55where
56    T: SecretsBackend + ?Sized,
57{
58    fn put(&self, record: SecretRecord) -> Result<SecretVersion> {
59        (**self).put(record)
60    }
61
62    fn get(&self, uri: &SecretUri, version: Option<u64>) -> Result<Option<VersionedSecret>> {
63        (**self).get(uri, version)
64    }
65
66    fn list(
67        &self,
68        scope: &Scope,
69        category_prefix: Option<&str>,
70        name_prefix: Option<&str>,
71    ) -> Result<Vec<SecretListItem>> {
72        (**self).list(scope, category_prefix, name_prefix)
73    }
74
75    fn delete(&self, uri: &SecretUri) -> Result<SecretVersion> {
76        (**self).delete(uri)
77    }
78
79    fn versions(&self, uri: &SecretUri) -> Result<Vec<SecretVersion>> {
80        (**self).versions(uri)
81    }
82
83    fn exists(&self, uri: &SecretUri) -> Result<bool> {
84        (**self).exists(uri)
85    }
86}
87
88impl<T> SecretsBackend for Box<T>
89where
90    T: SecretsBackend + ?Sized,
91{
92    fn put(&self, record: SecretRecord) -> Result<SecretVersion> {
93        (**self).put(record)
94    }
95
96    fn get(&self, uri: &SecretUri, version: Option<u64>) -> Result<Option<VersionedSecret>> {
97        (**self).get(uri, version)
98    }
99
100    fn list(
101        &self,
102        scope: &Scope,
103        category_prefix: Option<&str>,
104        name_prefix: Option<&str>,
105    ) -> Result<Vec<SecretListItem>> {
106        (**self).list(scope, category_prefix, name_prefix)
107    }
108
109    fn delete(&self, uri: &SecretUri) -> Result<SecretVersion> {
110        (**self).delete(uri)
111    }
112
113    fn versions(&self, uri: &SecretUri) -> Result<Vec<SecretVersion>> {
114        (**self).versions(uri)
115    }
116
117    fn exists(&self, uri: &SecretUri) -> Result<bool> {
118        (**self).exists(uri)
119    }
120}