greentic_secrets_spec/
backend.rs1use 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#[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#[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
38pub 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}