1use rand::prelude::*;
2use serde::{Deserialize, Serialize};
3
4#[derive(Deserialize, Serialize, Eq, PartialEq)]
5#[serde(untagged)]
6pub enum Secret {
7 Single(String),
8 Multi(Vec<Entry>),
9}
10
11impl Default for Secret {
12 fn default() -> Self {
13 let s: String = rand::thread_rng()
14 .sample_iter(&rand::distributions::Alphanumeric)
15 .take(32)
16 .map(char::from)
17 .collect();
18 Self::Single(s)
19 }
20}
21
22impl Secret {
23 pub fn find_name(&self, s: &str) -> Option<&str> {
24 match self {
25 Secret::Single(x) => {
26 if x == s {
27 return Some("_");
28 }
29 }
30 Secret::Multi(vals) => {
31 for x in vals {
32 match x {
33 Entry::SecretOnly(_) => return Some("_"),
34 Entry::Map(m) => {
35 if m.value == s {
36 return Some(&m.name);
37 }
38 }
39 }
40 }
41 }
42 }
43 None
44 }
45 pub fn find_trigger_secret(&self, trig: &str) -> Option<&str> {
46 if let Secret::Multi(ref vals) = self {
47 for x in vals {
48 if let Entry::Map(m) = x {
49 if m.name == trig {
50 return Some(&m.value);
51 }
52 }
53 }
54 }
55 None
56 }
57}
58
59#[derive(Deserialize, Serialize, Eq, PartialEq)]
60#[serde(untagged)]
61pub enum Entry {
62 SecretOnly(String),
63 Map(EntryMap),
64}
65
66#[derive(Deserialize, Serialize, Eq, PartialEq)]
67#[serde(deny_unknown_fields)]
68pub struct EntryMap {
69 pub name: String,
70 pub value: String,
71}