summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHayley James <hayleyjames109@gmail.com>2021-11-22 13:58:24 +0000
committerGitHub <noreply@github.com>2021-11-22 14:58:24 +0100
commit218dac4174121d462389ca0a1389ee1228b02bbe (patch)
treeb0f3fe63733dc22393addc05f688744e48a87b72
parent2daa257600a7deda30cec6aa2d5d325a41da8e98 (diff)
Support listing all workflow runs in a repository (#147)
-rw-r--r--examples/list_all_workflow_runs.rs30
-rw-r--r--src/api/workflows.rs60
2 files changed, 80 insertions, 10 deletions
diff --git a/examples/list_all_workflow_runs.rs b/examples/list_all_workflow_runs.rs
new file mode 100644
index 0000000..4b1015b
--- /dev/null
+++ b/examples/list_all_workflow_runs.rs
@@ -0,0 +1,30 @@
+use octocrab::Octocrab;
+
+#[tokio::main]
+async fn main() -> octocrab::Result<()> {
+ let octocrab = Octocrab::builder().build()?;
+ let runs = octocrab
+ .workflows("rust-lang-ci", "rust")
+ .list_all_runs()
+ .per_page(2)
+ .branch("master")
+ .event("push")
+ .status("success")
+ .send()
+ .await?;
+
+ for run in runs {
+ println!("Run:");
+ println!(" ID: {}", run.id);
+ println!(" Name: {}", run.name);
+ println!(" Event: {}", run.event);
+ println!(" Branch: {}", run.head_branch);
+ println!(" Created At: {}", run.created_at);
+ println!(" Commit:");
+ println!(" Author: {}", run.head_commit.author.name);
+ println!(" Message: {}", run.head_commit.message);
+ println!()
+ }
+
+ Ok(())
+}
diff --git a/src/api/workflows.rs b/src/api/workflows.rs
index 2b2e747..4e42e32 100644
--- a/src/api/workflows.rs
+++ b/src/api/workflows.rs
@@ -68,7 +68,34 @@ impl<'octo> WorkflowsHandler<'octo> {
/// # }
/// ```
pub fn list_runs(&self, workflow_file_or_id: impl Into<String>) -> ListRunsBuilder<'_, '_> {
- ListRunsBuilder::new(self, workflow_file_or_id.into())
+ ListRunsBuilder::new(
+ self,
+ ListRunsRequestType::ByWorkflow(workflow_file_or_id.into()),
+ )
+ }
+
+ /// List runs for the specified owner and repository.
+ /// ```no_run
+ /// # async fn run() -> octocrab::Result<()> {
+ /// let octocrab = octocrab::Octocrab::default();
+ ///
+ /// let runs = octocrab.workflows("owner", "repo")
+ /// .list_all_runs()
+ /// // Optional Parameters
+ /// .actor("octocat")
+ /// .branch("master")
+ /// .event("pull_request")
+ /// .status("success")
+ /// .per_page(100)
+ /// .page(1u8)
+ /// // Send the request
+ /// .send()
+ /// .await?;
+ /// # Ok(())
+ /// # }
+ /// ```
+ pub fn list_all_runs(&self) -> ListRunsBuilder<'_, '_> {
+ ListRunsBuilder::new(self, ListRunsRequestType::ByRepo)
}
/// List job results in the specified run.
@@ -136,12 +163,18 @@ impl<'octo, 'b> ListWorkflowsBuilder<'octo, 'b> {
}
}
+/// The type of list workflow runs request.
+pub(crate) enum ListRunsRequestType {
+ ByRepo,
+ ByWorkflow(String),
+}
+
#[derive(serde::Serialize)]
pub struct ListRunsBuilder<'octo, 'b> {
#[serde(skip)]
handler: &'b WorkflowsHandler<'octo>,
#[serde(skip)]
- workflow_id: String,
+ r#type: ListRunsRequestType,
#[serde(skip_serializing_if = "Option::is_none")]
actor: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
@@ -159,10 +192,10 @@ pub struct ListRunsBuilder<'octo, 'b> {
}
impl<'octo, 'b> ListRunsBuilder<'octo, 'b> {
- pub(crate) fn new(handler: &'b WorkflowsHandler<'octo>, workflow_id: String) -> Self {
+ pub(crate) fn new(handler: &'b WorkflowsHandler<'octo>, r#type: ListRunsRequestType) -> Self {
Self {
handler,
- workflow_id,
+ r#type,
actor: None,
branch: None,
event: None,
@@ -219,12 +252,19 @@ impl<'octo, 'b> ListRunsBuilder<'octo, 'b> {
/// Sends the actual request.
pub async fn send(self) -> Result<Page<models::workflows::Run>> {
- let url = format!(
- "repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs",
- owner = self.handler.owner,
- repo = self.handler.repo,
- workflow_id = self.workflow_id
- );
+ let url = match self.r#type {
+ ListRunsRequestType::ByRepo => format!(
+ "/repos/{owner}/{repo}/actions/runs",
+ owner = self.handler.owner,
+ repo = self.handler.repo
+ ),
+ ListRunsRequestType::ByWorkflow(ref workflow_id) => format!(
+ "repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs",
+ owner = self.handler.owner,
+ repo = self.handler.repo,
+ workflow_id = workflow_id
+ ),
+ };
self.handler.crab.get(url, Some(&self)).await
}
}