coodev_runner/runner/
secret.rs

1use 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}