Skip to main content

ephemeris_forge_github/reconcile/
actions.rs

1use ephemeris_forge::RepoRef;
2
3use super::Client;
4use crate::Live;
5use crate::api::model::actions::routes::ActionsGroup;
6use crate::api::{Api, ForgeError};
7use crate::config::actions::Actions;
8use crate::live::ActionsLive;
9use crate::operation::actions::Group;
10
11impl<A: Api> Client<A> {
12    pub(super) async fn read_actions(
13        &self,
14        repository: &RepoRef,
15        config: Option<&Actions>,
16        live: &mut Live,
17    ) -> Result<(), ForgeError> {
18        let Some(actions) = config else {
19            return Ok(());
20        };
21        let live = &mut live.actions;
22        self.read_group(repository, actions.permissions.as_ref(), live)
23            .await?;
24        self.read_group(repository, actions.selected_actions.as_ref(), live)
25            .await?;
26        self.read_group(repository, actions.workflow.as_ref(), live)
27            .await?;
28        self.read_group(repository, actions.access.as_ref(), live)
29            .await?;
30        self.read_group(
31            repository,
32            actions.artifact_and_log_retention.as_ref(),
33            live,
34        )
35        .await?;
36        self.read_group(
37            repository,
38            actions.fork_pr_contributor_approval.as_ref(),
39            live,
40        )
41        .await?;
42        self.read_group(
43            repository,
44            actions.fork_pr_workflows_private_repos.as_ref(),
45            live,
46        )
47        .await?;
48        if actions.cache.is_some()
49            && let Some(cache) = self.api.actions_cache(repository).await?
50        {
51            live.set(cache);
52        }
53        self.read_group(repository, actions.oidc_subject.as_ref(), live)
54            .await
55    }
56
57    async fn read_group<G: ActionsGroup>(
58        &self,
59        repository: &RepoRef,
60        declared: Option<&G>,
61        live: &mut ActionsLive,
62    ) -> Result<(), ForgeError> {
63        if declared.is_some()
64            && let Some(group) = self.api.actions_group::<G>(repository).await?
65        {
66            live.set(group);
67        }
68        Ok(())
69    }
70
71    pub(super) async fn apply_actions(
72        &self,
73        repository: &RepoRef,
74        group: &Group,
75    ) -> Result<(), ForgeError> {
76        match group {
77            Group::Permissions(group) => self.api.set_actions_group(repository, group).await,
78            Group::AllowList(group) => self.api.set_actions_group(repository, group).await,
79            Group::Workflow(group) => self.api.set_actions_group(repository, group).await,
80            Group::Access(group) => self.api.set_actions_group(repository, group).await,
81            Group::ArtifactAndLogRetention(group) => {
82                self.api.set_actions_group(repository, group).await
83            }
84            Group::ForkPrContributorApproval(group) => {
85                self.api.set_actions_group(repository, group).await
86            }
87            Group::ForkPrWorkflowsPrivateRepos(group) => {
88                self.api.set_actions_group(repository, group).await
89            }
90            Group::Cache(group) => self.api.set_actions_cache(repository, group).await,
91            Group::OidcSubject(group) => self.api.set_actions_group(repository, group).await,
92        }
93    }
94}