Skip to main content

ephemeris_forge_github/api/request/
rulesets.rs

1mod rules;
2
3use facet::Facet;
4use facet_value::Value;
5
6use self::rules::{RuleEntry, rule_entries};
7use crate::{ActorType, BypassActor, BypassMode, Enforcement, Ruleset as Definition, Target};
8
9/// The body that creates or replaces a ruleset.
10#[derive(Facet)]
11pub(crate) struct RulesetBody<'a> {
12    name: &'a str,
13    target: &'a Target,
14    enforcement: Enforcement,
15    bypass_actors: Vec<BypassActorBody>,
16    conditions: Conditions<'a>,
17    rules: Vec<RuleEntry<'a>>,
18}
19
20#[derive(Facet)]
21struct BypassActorBody {
22    actor_id: Option<i64>,
23    actor_type: ActorType,
24    bypass_mode: BypassMode,
25}
26
27#[derive(Facet)]
28struct Conditions<'a> {
29    ref_name: RefName<'a>,
30}
31
32#[derive(Facet)]
33struct RefName<'a> {
34    exclude: &'a [String],
35    include: &'a [String],
36}
37
38impl<'a> RulesetBody<'a> {
39    pub(crate) fn new(
40        name: &'a str,
41        ruleset: &'a Definition,
42        unmanaged_rules: &'a [Value],
43    ) -> Self {
44        Self {
45            name,
46            target: &ruleset.target,
47            enforcement: ruleset.enforcement,
48            bypass_actors: ruleset
49                .bypass_actors
50                .iter()
51                .map(BypassActorBody::from)
52                .collect(),
53            conditions: Conditions {
54                ref_name: RefName {
55                    exclude: &ruleset.exclude,
56                    include: &ruleset.include,
57                },
58            },
59            rules: rule_entries(&ruleset.rules, unmanaged_rules),
60        }
61    }
62}
63
64impl From<&BypassActor> for BypassActorBody {
65    fn from(actor: &BypassActor) -> Self {
66        Self {
67            actor_id: actor.wire_id(),
68            actor_type: actor.actor_type,
69            bypass_mode: actor.bypass_mode,
70        }
71    }
72}