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