Skip to main content

mesa_dev/client/
repos.rs

1use crate::low_level::apis::{repos_api, Error};
2use crate::models;
3
4use super::pagination::{paginate, PaginatedResponse};
5use super::{OrgClient, RepoClient};
6
7use futures_core::Stream;
8
9impl PaginatedResponse for models::GetByOrgRepos200Response {
10    type Item = models::GetByOrgRepos200ResponseReposInner;
11
12    fn items(self) -> Vec<Self::Item> {
13        self.repos
14    }
15
16    fn next_cursor(&self) -> Option<&str> {
17        self.next_cursor.as_deref()
18    }
19
20    fn has_more(&self) -> bool {
21        self.has_more
22    }
23}
24
25/// Client for listing and creating repositories (`/{org}/repos`).
26#[derive(Clone, Debug)]
27pub struct ReposClient<'a> {
28    pub(super) org: &'a OrgClient<'a>,
29}
30
31impl<'a> ReposClient<'a> {
32    /// List repositories in the organization.
33    ///
34    /// Returns an async stream that automatically paginates through all results,
35    /// yielding one repository at a time. Pass `limit` to control the page size
36    /// of each underlying API request, or `None` for the server default.
37    pub fn list(
38        &self,
39        limit: Option<u8>,
40    ) -> impl Stream<
41        Item = Result<
42            models::GetByOrgRepos200ResponseReposInner,
43            Error<repos_api::GetByOrgReposError>,
44        >,
45    > + 'a {
46        tracing::debug!(org = self.org.org, limit, "listing repos");
47        let config = self.org.config;
48        let org = self.org.org;
49
50        paginate(limit, move |cursor, lim| async move {
51            repos_api::get_by_org_repos(config, Some(org), cursor.as_deref(), lim).await
52        })
53    }
54
55    /// Create a new repository.
56    ///
57    /// # Errors
58    ///
59    /// Returns an error if the API request fails.
60    #[tracing::instrument(skip(self, request), fields(org = self.org.org), err(Debug))]
61    pub async fn create(
62        &self,
63        request: models::PostByOrgReposRequest,
64    ) -> Result<models::PostByOrgRepos201Response, Error<repos_api::PostByOrgReposError>> {
65        repos_api::post_by_org_repos(self.org.config, self.org.org, Some(request)).await
66    }
67
68    /// Navigate to a specific repository.
69    #[must_use]
70    pub fn at(&self, name: &'a str) -> RepoClient<'a> {
71        RepoClient {
72            org: self.org,
73            repo: name,
74        }
75    }
76}