Skip to main content

ephemeris_forge_github/api/http/
rulesets.rs

1use ephemeris_forge::{RepoRef, encode};
2use facet_value::Value;
3use reqwest::Method;
4
5use crate::Ruleset as Definition;
6use crate::api::HttpApi;
7use crate::api::error::ForgeError;
8use crate::api::model::{Ruleset, RulesetResponse, RulesetSummary};
9use crate::api::operations::RulesetsApi;
10use crate::api::request::RulesetBody;
11
12impl RulesetsApi for HttpApi {
13    async fn create_ruleset(
14        &self,
15        repository: &RepoRef,
16        name: &str,
17        ruleset: &Definition,
18    ) -> Result<(), ForgeError> {
19        self.empty(
20            Method::POST,
21            &repository.path("rulesets"),
22            Some(encode(&RulesetBody::new(name, ruleset, &[]))),
23        )
24        .await
25    }
26
27    async fn delete_ruleset(&self, repository: &RepoRef, id: u64) -> Result<(), ForgeError> {
28        self.empty(
29            Method::DELETE,
30            &repository.path(&format!("rulesets/{id}")),
31            None,
32        )
33        .await
34    }
35
36    async fn rulesets(&self, repository: &RepoRef) -> Result<Vec<Ruleset>, ForgeError> {
37        let summaries: Vec<RulesetSummary> = self
38            .paged(&repository.path("rulesets?includes_parents=false"))
39            .await
40            .map_err(unavailable)?;
41        let mut rulesets = Vec::with_capacity(summaries.len());
42        for summary in summaries {
43            let detail: RulesetResponse = self
44                .send(
45                    Method::GET,
46                    &repository.path(&format!("rulesets/{}", summary.id)),
47                    None,
48                )
49                .await?;
50            rulesets.push(detail.try_into()?);
51        }
52        Ok(rulesets)
53    }
54
55    async fn update_ruleset(
56        &self,
57        repository: &RepoRef,
58        id: u64,
59        name: &str,
60        ruleset: &Definition,
61        unmanaged_rules: &[Value],
62    ) -> Result<(), ForgeError> {
63        self.empty(
64            Method::PUT,
65            &repository.path(&format!("rulesets/{id}")),
66            Some(encode(&RulesetBody::new(name, ruleset, unmanaged_rules))),
67        )
68        .await
69    }
70}
71
72fn unavailable(error: ForgeError) -> ForgeError {
73    if let ForgeError::Unprocessable { request, body: _ } = error {
74        return ForgeError::CapabilityUnavailable { request };
75    }
76    error
77}