diff options
author | Hayley James <hayleyjames109@gmail.com> | 2021-11-22 13:58:24 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-22 14:58:24 +0100 |
commit | 218dac4174121d462389ca0a1389ee1228b02bbe (patch) | |
tree | b0f3fe63733dc22393addc05f688744e48a87b72 | |
parent | 2daa257600a7deda30cec6aa2d5d325a41da8e98 (diff) |
Support listing all workflow runs in a repository (#147)
-rw-r--r-- | examples/list_all_workflow_runs.rs | 30 | ||||
-rw-r--r-- | src/api/workflows.rs | 60 |
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 } } |