Skip to main content

ephemeris_forge_github/api/http/
environments.rs

1use 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}