mesa_dev/resources/
repos.rs1use std::sync::Arc;
18
19use http::Method;
20
21use crate::client::MesaClient;
22use crate::error::MesaError;
23use crate::http_client::HttpClient;
24use crate::models::{
25 CreateRepoRequest, ListReposResponse, PaginationParams, RenameRepoRequest, Repo,
26 SuccessResponse,
27};
28use crate::pagination::PageStream;
29
30pub struct ReposResource<'c, C: HttpClient> {
32 client: &'c MesaClient<C>,
33 org: String,
34}
35
36impl<'c, C: HttpClient> ReposResource<'c, C> {
37 pub(crate) fn new(client: &'c MesaClient<C>, org: String) -> Self {
38 Self { client, org }
39 }
40
41 pub async fn create(&self, req: &CreateRepoRequest) -> Result<Repo, MesaError> {
47 let path = format!("/{}/repos", self.org);
48 self.client
49 .request(Method::POST, &path, &[], Some(req))
50 .await
51 }
52
53 pub async fn list(&self, params: &PaginationParams) -> Result<ListReposResponse, MesaError> {
59 let path = format!("/{}/repos", self.org);
60 let mut query = Vec::new();
61 if let Some(ref cursor) = params.cursor {
62 query.push(("cursor", cursor.as_str()));
63 }
64 if let Some(limit) = params.limit {
65 let limit_str = limit.to_string();
66 return self
68 .client
69 .request::<ListReposResponse>(
70 Method::GET,
71 &path,
72 &[&query[..], &[("limit", &limit_str)]].concat(),
73 None::<&()>,
74 )
75 .await;
76 }
77 self.client
78 .request(Method::GET, &path, &query, None::<&()>)
79 .await
80 }
81
82 #[must_use]
84 pub fn list_all(&self) -> PageStream<C, ListReposResponse> {
85 let path = format!("/{}/repos", self.org);
86 PageStream::new(Arc::clone(&self.client.inner), path, Vec::new())
88 }
89
90 pub async fn get(&self, repo: &str) -> Result<Repo, MesaError> {
96 let path = format!("/{}/{repo}", self.org);
97 self.client
98 .request(Method::GET, &path, &[], None::<&()>)
99 .await
100 }
101
102 pub async fn rename(&self, repo: &str, req: &RenameRepoRequest) -> Result<Repo, MesaError> {
108 let path = format!("/{}/{repo}", self.org);
109 self.client
110 .request(Method::PATCH, &path, &[], Some(req))
111 .await
112 }
113
114 pub async fn delete(&self, repo: &str) -> Result<SuccessResponse, MesaError> {
120 let path = format!("/{}/{repo}", self.org);
121 self.client
122 .request(Method::DELETE, &path, &[], None::<&()>)
123 .await
124 }
125}