coodev_runner/runner/
secret.rs1use crate::error;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
5pub struct RepositorySecret {
6 pub key: String,
7 pub value: String,
8 pub repository: String,
9}
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
12pub struct OrganizationSecret {
13 pub key: String,
14 pub value: String,
15 pub organization: String,
16}
17
18#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
19pub struct GlobalSecret {
20 pub key: String,
21 pub value: String,
22}
23
24#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
25pub enum Secret {
26 Repository(RepositorySecret),
27 Organization(OrganizationSecret),
28 Global(GlobalSecret),
29}
30
31pub struct SecretBuilder {
32 pub key: String,
33 pub owner: Option<String>,
34 pub repository: Option<String>,
35 pub value: Option<String>,
36}
37
38impl SecretBuilder {
39 pub fn repository(&mut self, repository: impl Into<String>) -> &mut Self {
40 self.repository = Some(repository.into());
41
42 self
43 }
44
45 pub fn owner(&mut self, owner: impl Into<String>) -> &mut Self {
46 self.owner = Some(owner.into());
47
48 self
49 }
50
51 pub fn value(&mut self, value: impl Into<String>) -> &mut Self {
52 self.value = Some(value.into());
53
54 self
55 }
56
57 pub fn build(&self) -> crate::Result<Secret> {
58 let key = self.key.clone();
59 let value = self.value.clone().ok_or({
60 error::Error::workflow_config_error(
61 "Secret value is required. Please set secret value by Secret::new(key).value(value)",
62 )
63 })?;
64
65 match (self.owner.clone(), self.repository.clone()) {
66 (Some(owner), Some(repository)) => Ok(Secret::Repository(RepositorySecret {
67 key,
68 value,
69 repository: format!("{}/{}", owner, repository),
70 })),
71 (Some(owner), None) => Ok(Secret::Organization(OrganizationSecret {
72 key,
73 value,
74 organization: owner,
75 })),
76 (None, None) => Ok(Secret::Global(GlobalSecret { key, value })),
77 (None, Some(_)) => Err(error::Error::workflow_config_error(
78 "Repository owner is required. Please set repository owner by Secret::new(key).owner(owner)"
79 )),
80 }
81 }
82}
83
84impl Secret {
85 pub fn new(key: impl Into<String>) -> SecretBuilder {
86 SecretBuilder {
87 key: key.into(),
88 owner: None,
89 repository: None,
90 value: None,
91 }
92 }
93}