Bladeren bron

Un-ad-hoc `review_requested` handler

Use the `issue_handlers!` instead
Maybe Waffle 1 jaar geleden
bovenliggende
commit
9563afffd8
2 gewijzigde bestanden met toevoegingen van 44 en 44 verwijderingen
  1. 1 14
      src/handlers.rs
  2. 43 30
      src/handlers/review_requested.rs

+ 1 - 14
src/handlers.rs

@@ -108,20 +108,6 @@ pub async fn handle(ctx: &Context, event: &Event) -> Vec<HandlerError> {
         }
     }
 
-    if let Some(config) = config
-        .as_ref()
-        .ok()
-        .and_then(|c| c.review_requested.as_ref())
-    {
-        if let Err(e) = review_requested::handle(ctx, event, config).await {
-            log::error!(
-                "failed to process event {:?} with review_requested handler: {:?}",
-                event,
-                e
-            )
-        }
-    }
-
     if let Some(ghr_config) = config
         .as_ref()
         .ok()
@@ -179,6 +165,7 @@ issue_handlers! {
     mentions,
     no_merges,
     notify_zulip,
+    review_requested,
 }
 
 macro_rules! command_handlers {

+ 43 - 30
src/handlers/review_requested.rs

@@ -1,39 +1,52 @@
 use crate::config::ReviewRequestedConfig;
-use crate::github::{Event, IssuesAction, IssuesEvent, Label};
+use crate::github::{IssuesAction, IssuesEvent, Label};
 use crate::handlers::Context;
 
-pub(crate) async fn handle(
+pub(crate) struct ReviewRequestedInput {}
+
+pub(crate) async fn parse_input(
+    _ctx: &Context,
+    event: &IssuesEvent,
+    _config: Option<&ReviewRequestedConfig>,
+) -> Result<Option<ReviewRequestedInput>, String> {
+    // PR author requests a review from one of the assignees
+
+    let IssuesAction::ReviewRequested { requested_reviewer } = &event.action else {
+        return Ok(None);
+    };
+
+    if event.sender != event.issue.user {
+        return Ok(None);
+    }
+
+    if !event.issue.assignees.contains(requested_reviewer) {
+        return Ok(None);
+    }
+
+    Ok(Some(ReviewRequestedInput {}))
+}
+
+pub(crate) async fn handle_input(
     ctx: &Context,
-    event: &Event,
     config: &ReviewRequestedConfig,
+    event: &IssuesEvent,
+    ReviewRequestedInput {}: ReviewRequestedInput,
 ) -> anyhow::Result<()> {
-    // PR author requests a review from one of the assignees
-    if let Event::Issue(IssuesEvent {
-        action,
-        issue,
-        sender,
-        ..
-    }) = event
-    {
-        if let IssuesAction::ReviewRequested { requested_reviewer } = action {
-            if *sender == issue.user && issue.assignees.contains(requested_reviewer) {
-                issue
-                    .add_labels(
-                        &ctx.github,
-                        config
-                            .add_labels
-                            .iter()
-                            .cloned()
-                            .map(|name| Label { name })
-                            .collect(),
-                    )
-                    .await?;
-
-                for label in &config.remove_labels {
-                    issue.remove_label(&ctx.github, label).await?;
-                }
-            }
-        }
+    event
+        .issue
+        .add_labels(
+            &ctx.github,
+            config
+                .add_labels
+                .iter()
+                .cloned()
+                .map(|name| Label { name })
+                .collect(),
+        )
+        .await?;
+
+    for label in &config.remove_labels {
+        event.issue.remove_label(&ctx.github, label).await?;
     }
 
     Ok(())