1use crate::types::*;
2use zeroize::{Zeroize, ZeroizeOnDrop};
3
4#[derive(Debug, Clone, Serialize, Deserialize, Zeroize, ZeroizeOnDrop)]
6pub struct SecretEntry {
7 pub value: String,
9 #[zeroize(skip)]
11 pub metadata: SecretMetadata,
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
16pub struct SecretMetadata {
17 pub created_at: DateTime<Utc>,
18 pub modified_at: DateTime<Utc>,
19 pub version: u32,
20 #[serde(default)]
21 pub tags: Vec<String>,
22 #[serde(default)]
23 pub description: Option<String>,
24}
25
26impl Default for SecretMetadata {
27 fn default() -> Self {
28 Self::new()
29 }
30}
31
32impl SecretMetadata {
33 pub fn new() -> Self {
34 let now = Utc::now();
35 Self {
36 created_at: now,
37 modified_at: now,
38 version: 1,
39 tags: Vec::new(),
40 description: None,
41 }
42 }
43
44 pub fn bump_version(&mut self) {
45 self.version += 1;
46 self.modified_at = Utc::now();
47 }
48}
49
50impl SecretEntry {
51 pub fn new(value: String) -> Self {
52 Self {
53 value,
54 metadata: SecretMetadata::new(),
55 }
56 }
57}