summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert O'Callahan <roc@pernos.co>2021-11-22 20:52:41 +1300
committerGitHub <noreply@github.com>2021-11-22 08:52:41 +0100
commita40b2aa13ed46f9a0ac1cb92145a012151538267 (patch)
tree2cea3d49125f0df7d8d63056ccb0a807bd909aea
parente04e7a8f1942add2b3330f00420040ffeb5854d6 (diff)
Add support for listing commit statuses (#159)
-rw-r--r--src/api/repos.rs7
-rw-r--r--src/api/repos/status.rs46
2 files changed, 52 insertions, 1 deletions
diff --git a/src/api/repos.rs b/src/api/repos.rs
index f4bd3e6..e94b9f4 100644
--- a/src/api/repos.rs
+++ b/src/api/repos.rs
@@ -13,7 +13,7 @@ mod generate;
use crate::{models, params, Octocrab, Result};
pub use file::UpdateFileBuilder;
pub use releases::ReleasesHandler;
-pub use status::CreateStatusBuilder;
+pub use status::{CreateStatusBuilder, ListStatusesBuilder};
pub use tags::ListTagsBuilder;
pub use generate::GenerateRepositoryBuilder;
@@ -252,6 +252,11 @@ impl<'octo> RepoHandler<'octo> {
CreateStatusBuilder::new(self, sha, state)
}
+ /// List statuses for a reference.
+ pub fn list_statuses(&self, sha: String) -> ListStatusesBuilder<'_, '_> {
+ ListStatusesBuilder::new(self, sha)
+ }
+
/// List events on this repository.
///
/// Takes an optional etag which allows for efficient polling. Here is a quick example to poll a
diff --git a/src/api/repos/status.rs b/src/api/repos/status.rs
index bd3f7a4..2e39f72 100644
--- a/src/api/repos/status.rs
+++ b/src/api/repos/status.rs
@@ -71,3 +71,49 @@ impl<'octo, 'r> CreateStatusBuilder<'octo, 'r> {
self.handler.crab.put(url, Some(&self)).await
}
}
+
+#[derive(serde::Serialize)]
+pub struct ListStatusesBuilder<'octo, 'r> {
+ #[serde(skip)]
+ handler: &'r RepoHandler<'octo>,
+ #[serde(skip)]
+ sha: String,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ per_page: Option<u8>,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ page: Option<u32>,
+}
+
+impl<'octo, 'r> ListStatusesBuilder<'octo, 'r> {
+ pub fn new(handler: &'r RepoHandler<'octo>, sha: String) -> Self {
+ Self {
+ handler,
+ sha,
+ per_page: None,
+ page: None,
+ }
+ }
+
+ /// Results per page (max 100).
+ pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
+ self.per_page = Some(per_page.into());
+ self
+ }
+
+ /// Page number of the results to fetch.
+ pub fn page(mut self, page: impl Into<u32>) -> Self {
+ self.page = Some(page.into());
+ self
+ }
+
+ /// Sends the actual request.
+ pub async fn send(self) -> crate::Result<crate::Page<crate::models::Status>> {
+ let url = format!(
+ "repos/{owner}/{repo}/commits/{sha}/statuses",
+ owner = self.handler.owner,
+ repo = self.handler.repo,
+ sha = self.sha,
+ );
+ self.handler.crab.get(url, Some(&self)).await
+ }
+}