ephemeris_forge_github/reconcile/
actions.rs1use 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}