rci/
secret.rs

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}