ephemeris_forge_github/config/
actions.rs1use std::num::NonZeroU32;
4
5use facet::Facet;
6
7#[derive(Clone, Debug, Eq, Facet, PartialEq)]
9#[facet(deny_unknown_fields)]
10pub struct Actions {
11 pub permissions: Option<Permissions>,
13 pub selected_actions: Option<AllowList>,
15 pub workflow: Option<Workflow>,
17 pub access: Option<Access>,
20 pub artifact_and_log_retention: Option<ArtifactAndLogRetention>,
22 pub fork_pr_contributor_approval: Option<ForkPrContributorApproval>,
24 pub fork_pr_workflows_private_repos: Option<ForkPrWorkflowsPrivateRepos>,
26 pub cache: Option<Cache>,
28 pub oidc_subject: Option<OidcSubject>,
30}
31
32#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
34#[repr(u8)]
35pub enum ActionScope {
36 #[facet(rename = "all")]
38 All,
39 #[facet(rename = "local_only")]
41 LocalOnly,
42 #[facet(rename = "selected")]
44 Selected,
45}
46
47#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
49#[repr(u8)]
50pub enum TokenPermissions {
51 #[facet(rename = "read")]
53 Read,
54 #[facet(rename = "write")]
56 Write,
57}
58
59#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
61#[repr(u8)]
62pub enum AccessLevel {
63 #[facet(rename = "none")]
65 None,
66 #[facet(rename = "user")]
68 User,
69 #[facet(rename = "organization")]
71 Organization,
72}
73
74#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
76#[repr(u8)]
77pub enum ApprovalPolicy {
78 #[facet(rename = "first_time_contributors_new_to_github")]
80 FirstTimeContributorsNewToGithub,
81 #[facet(rename = "first_time_contributors")]
83 FirstTimeContributors,
84 #[facet(rename = "all_external_contributors")]
86 AllExternalContributors,
87}
88
89#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
91#[facet(deny_unknown_fields)]
92pub struct Permissions {
93 pub enabled: bool,
95 pub allowed_actions: ActionScope,
97 pub sha_pinning_required: bool,
99}
100
101#[derive(Clone, Debug, Eq, Facet, PartialEq)]
103#[facet(deny_unknown_fields)]
104pub struct AllowList {
105 pub github_owned_allowed: bool,
107 pub verified_allowed: bool,
109 pub patterns_allowed: Vec<String>,
111}
112
113impl AllowList {
114 pub(crate) fn normalized(mut self) -> Self {
115 self.patterns_allowed.sort_unstable();
116 self.patterns_allowed.dedup();
117 self
118 }
119}
120
121#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
123#[facet(deny_unknown_fields)]
124pub struct Workflow {
125 pub default_workflow_permissions: TokenPermissions,
127 pub can_approve_pull_request_reviews: bool,
129}
130
131#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
133#[facet(deny_unknown_fields)]
134pub struct Access {
135 pub access_level: AccessLevel,
137}
138
139#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
141#[facet(deny_unknown_fields)]
142pub struct ArtifactAndLogRetention {
143 pub days: NonZeroU32,
145}
146
147#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
149#[facet(deny_unknown_fields)]
150pub struct ForkPrContributorApproval {
151 pub approval_policy: ApprovalPolicy,
153}
154
155#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
157#[facet(deny_unknown_fields)]
158#[expect(
159 clippy::struct_excessive_bools,
160 reason = "these are independent GitHub switches"
161)]
162pub struct ForkPrWorkflowsPrivateRepos {
163 pub run_workflows_from_fork_pull_requests: bool,
165 pub send_write_tokens_to_workflows: bool,
167 pub send_secrets_and_variables: bool,
169 pub require_approval_for_fork_pr_workflows: bool,
171}
172
173#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
175#[facet(deny_unknown_fields)]
176pub struct Cache {
177 pub max_cache_retention_days: NonZeroU32,
179 pub max_cache_size_gb: NonZeroU32,
181}
182
183#[derive(Clone, Debug, Eq, Facet, PartialEq)]
185#[facet(deny_unknown_fields)]
186pub struct OidcSubject {
187 pub use_default: bool,
189 pub include_claim_keys: Vec<String>,
191 pub use_immutable_subject: bool,
193}