ephemeris_forge_github/api/http/
environments.rs1use ephemeris_forge::{RepoRef, encode, path_segment};
2use reqwest::Method;
3
4use super::PAGE_SIZE;
5use crate::BranchPolicy as Policy;
6use crate::api::HttpApi;
7use crate::api::error::ForgeError;
8use crate::api::model::{
9 BranchPolicy, BranchPolicyPage, Environment, EnvironmentPage, EnvironmentResponse,
10};
11use crate::api::operations::EnvironmentsApi;
12use crate::api::request::EnvironmentBody;
13
14impl EnvironmentsApi for HttpApi {
15 async fn branch_policies(
16 &self,
17 repository: &RepoRef,
18 environment: &str,
19 ) -> Result<Vec<BranchPolicy>, ForgeError> {
20 self.paged_in(
21 &format!(
22 "{}/deployment-branch-policies",
23 path(repository, environment)
24 ),
25 PAGE_SIZE,
26 |page: BranchPolicyPage| page.branch_policies,
27 )
28 .await
29 }
30
31 async fn create_branch_policy(
32 &self,
33 repository: &RepoRef,
34 environment: &str,
35 policy: &Policy,
36 ) -> Result<(), ForgeError> {
37 self.empty(
38 Method::POST,
39 &format!(
40 "{}/deployment-branch-policies",
41 path(repository, environment)
42 ),
43 Some(encode(policy)),
44 )
45 .await
46 }
47
48 async fn delete_branch_policy(
49 &self,
50 repository: &RepoRef,
51 environment: &str,
52 id: u64,
53 ) -> Result<(), ForgeError> {
54 self.empty(
55 Method::DELETE,
56 &format!(
57 "{}/deployment-branch-policies/{id}",
58 path(repository, environment)
59 ),
60 None,
61 )
62 .await
63 }
64
65 async fn delete_environment(
66 &self,
67 repository: &RepoRef,
68 environment: &str,
69 ) -> Result<(), ForgeError> {
70 self.empty(Method::DELETE, &path(repository, environment), None)
71 .await
72 }
73
74 async fn environments(&self, repository: &RepoRef) -> Result<Vec<Environment>, ForgeError> {
75 let responses = self
76 .paged_in(
77 &format!("{}/environments", base(repository)),
78 PAGE_SIZE,
79 |page: EnvironmentPage| page.environments,
80 )
81 .await?;
82 Ok(responses
83 .into_iter()
84 .map(EnvironmentResponse::into)
85 .collect())
86 }
87
88 async fn put_environment(
89 &self,
90 repository: &RepoRef,
91 environment: &str,
92 settings: &EnvironmentBody,
93 ) -> Result<(), ForgeError> {
94 self.empty(
95 Method::PUT,
96 &path(repository, environment),
97 Some(encode(settings)),
98 )
99 .await
100 }
101}
102
103fn base(repository: &RepoRef) -> String {
104 repository.path("")
105}
106
107pub(super) fn path(repository: &RepoRef, environment: &str) -> String {
108 format!(
109 "{}/environments/{}",
110 base(repository),
111 path_segment(environment)
112 )
113}