Skip to main content

ephemeris_forge_github/reconcile/
environments.rs

1use ephemeris_forge::{Mode, RepoRef};
2
3use super::Client;
4use crate::api::{Api, ForgeError};
5use crate::operation::environments::Operation;
6use crate::{Environments, Live};
7
8impl<A: Api> Client<A> {
9    pub(super) async fn read_environments(
10        &self,
11        repository: &RepoRef,
12        config: Option<&Environments>,
13        live: &mut Live,
14    ) -> Result<(), ForgeError> {
15        let Some(config) = config else {
16            return Ok(());
17        };
18        if !reads_environments(config) {
19            return Ok(());
20        }
21        live.environments = self.api.environments(repository).await?;
22        for environment in &mut live.environments {
23            let declared = config.environments.get(environment.name.as_str());
24            let custom = |policy: Option<crate::DeploymentBranchPolicy>| {
25                policy.is_some_and(|policy| policy.custom_branch_policies)
26            };
27            if declared.is_some_and(|declared| custom(declared.deployment_branch_policy))
28                && custom(environment.deployment_branch_policy)
29            {
30                environment.branch_policies = self
31                    .api
32                    .branch_policies(repository, &environment.name)
33                    .await?;
34            }
35        }
36        Ok(())
37    }
38
39    pub(super) async fn apply_environments(
40        &self,
41        repository: &RepoRef,
42        operation: &Operation,
43    ) -> Result<(), ForgeError> {
44        match operation {
45            Operation::Put { name, body } => self.api.put_environment(repository, name, body).await,
46            Operation::Delete { name } => self.api.delete_environment(repository, name).await,
47            Operation::CreateBranchPolicy {
48                environment,
49                policy,
50            } => {
51                self.api
52                    .create_branch_policy(repository, environment, policy)
53                    .await
54            }
55            Operation::DeleteBranchPolicy {
56                environment,
57                id,
58                name: _,
59            } => {
60                self.api
61                    .delete_branch_policy(repository, environment, *id)
62                    .await
63            }
64        }
65    }
66}
67
68/// Whether the environment settings need the repository's environments.
69pub(super) fn reads_environments(config: &Environments) -> bool {
70    config.mode == Mode::Owned || !config.environments.is_empty()
71}