ephemeris_forge_github/reconcile/
environments.rs1use 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
68pub(super) fn reads_environments(config: &Environments) -> bool {
70 config.mode == Mode::Owned || !config.environments.is_empty()
71}