mesa_dev/resources/
commits.rs1use std::sync::Arc;
16
17use http::Method;
18
19use crate::client::MesaClient;
20use crate::error::MesaError;
21use crate::http_client::HttpClient;
22use crate::models::{
23 Commit, CommitSummary, CreateCommitRequest, ListCommitsResponse, PaginationParams,
24};
25use crate::pagination::PageStream;
26
27#[derive(Debug, Clone, Default)]
40pub struct ListCommitsParams {
41 pub pagination: PaginationParams,
43 pub ref_: Option<String>,
45}
46
47pub struct CommitsResource<'c, C: HttpClient> {
49 client: &'c MesaClient<C>,
50 org: String,
51 repo: String,
52}
53
54impl<'c, C: HttpClient> CommitsResource<'c, C> {
55 pub(crate) fn new(client: &'c MesaClient<C>, org: String, repo: String) -> Self {
56 Self { client, org, repo }
57 }
58
59 pub async fn create(&self, req: &CreateCommitRequest) -> Result<CommitSummary, MesaError> {
65 let path = format!("/{}/{}/commits", self.org, self.repo);
66 self.client
67 .request(Method::POST, &path, &[], Some(req))
68 .await
69 }
70
71 pub async fn list(&self, params: &ListCommitsParams) -> Result<ListCommitsResponse, MesaError> {
77 let path = format!("/{}/{}/commits", self.org, self.repo);
78 let mut query: Vec<(&str, String)> = Vec::new();
79 if let Some(ref cursor) = params.pagination.cursor {
80 query.push(("cursor", cursor.clone()));
81 }
82 if let Some(limit) = params.pagination.limit {
83 query.push(("limit", limit.to_string()));
84 }
85 if let Some(ref r) = params.ref_ {
86 query.push(("ref", r.clone()));
87 }
88 let query_refs: Vec<(&str, &str)> = query.iter().map(|(k, v)| (*k, v.as_str())).collect();
89 self.client
90 .request(Method::GET, &path, &query_refs, None::<&()>)
91 .await
92 }
93
94 #[must_use]
98 pub fn list_all(&self, ref_: Option<&str>) -> PageStream<C, ListCommitsResponse> {
99 let path = format!("/{}/{}/commits", self.org, self.repo);
100 let extra = match ref_ {
101 Some(r) => vec![("ref".to_owned(), r.to_owned())],
102 None => Vec::new(),
103 };
104 PageStream::new(Arc::clone(&self.client.inner), path, extra)
105 }
106
107 pub async fn get(&self, sha: &str) -> Result<Commit, MesaError> {
113 let path = format!("/{}/{}/commits/{sha}", self.org, self.repo);
114 self.client
115 .request(Method::GET, &path, &[], None::<&()>)
116 .await
117 }
118}