Skip to main content

mesa_dev/resources/
commits.rs

1//! Commit operations.
2//!
3//! Access via [`MesaClient::commits`](crate::MesaClient::commits):
4//!
5//! ```rust,no_run
6//! # use mesa_dev::{Mesa, MesaError};
7//! # async fn run() -> Result<(), MesaError> {
8//! # let client = Mesa::new("key");
9//! let commit = client.commits("my-org", "my-repo").get("abc123").await?;
10//! println!("Commit: {}", commit.message);
11//! # Ok(())
12//! # }
13//! ```
14
15use 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/// Query parameters for listing commits.
28///
29/// # Example
30///
31/// ```rust
32/// use mesa_dev::resources::ListCommitsParams;
33///
34/// let params = ListCommitsParams {
35///     ref_: Some("main".to_owned()),
36///     ..Default::default()
37/// };
38/// ```
39#[derive(Debug, Clone, Default)]
40pub struct ListCommitsParams {
41    /// Pagination parameters.
42    pub pagination: PaginationParams,
43    /// Optional ref (branch name or SHA) to list commits from.
44    pub ref_: Option<String>,
45}
46
47/// Operations on commits within a repository.
48pub 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    /// Create a new commit.
60    ///
61    /// # Errors
62    ///
63    /// Returns [`MesaError`] if the API request fails.
64    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    /// List commits with pagination and optional ref filter.
72    ///
73    /// # Errors
74    ///
75    /// Returns [`MesaError`] if the API request fails.
76    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    /// Return a [`PageStream`] that iterates over all commits.
95    ///
96    /// Optionally filter by ref (branch name or SHA).
97    #[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    /// Get a single commit by SHA.
108    ///
109    /// # Errors
110    ///
111    /// Returns [`MesaError`] if the API request fails.
112    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}