ephemeris_forge_github/api/http/
rulesets.rs1use 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}