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#[derive(Clone, Debug)]
27pub struct ReposClient<'a> {
28 pub(super) org: &'a OrgClient<'a>,
29}
30
31impl<'a> ReposClient<'a> {
32 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 #[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 #[must_use]
70 pub fn at(&self, name: &'a str) -> RepoClient<'a> {
71 RepoClient {
72 org: self.org,
73 repo: name,
74 }
75 }
76}