فهرست منبع

Try to better respond with errors

Mark Rousskov 6 سال پیش
والد
کامیت
0f25e04b16
2فایلهای تغییر یافته به همراه33 افزوده شده و 4 حذف شده
  1. 27 3
      src/main.rs
  2. 6 1
      src/registry.rs

+ 27 - 3
src/main.rs

@@ -59,16 +59,40 @@ impl<'a, 'r> request::FromRequest<'a, 'r> for Event {
     }
 }
 
+#[derive(Debug)]
+struct WebhookError(Error);
+
+impl<'r> rocket::response::Responder<'r> for WebhookError {
+    fn respond_to(self, _: &Request) -> rocket::response::Result<'r> {
+        let body = format!("{:?}", self.0);
+        rocket::Response::build()
+            .header(rocket::http::ContentType::Plain)
+            .sized_body(std::io::Cursor::new(body))
+            .ok()
+    }
+}
+
+impl From<Error> for WebhookError {
+    fn from(e: Error) -> WebhookError {
+        WebhookError(e)
+    }
+}
+
 #[post("/github-hook", data = "<payload>")]
-fn webhook(event: Event, payload: SignedPayload, reg: State<HandleRegistry>) -> Result<(), Error> {
+fn webhook(
+    event: Event,
+    payload: SignedPayload,
+    reg: State<HandleRegistry>,
+) -> Result<(), WebhookError> {
     match event {
         Event::IssueComment => {
             let payload = payload
                 .deserialize::<IssueCommentEvent>()
-                .context("IssueCommentEvent failed to deserialize")?;
+                .context("IssueCommentEvent failed to deserialize")
+                .map_err(Error::from)?;
 
             let event = registry::Event::IssueComment(payload);
-            reg.handle(&event)?;
+            reg.handle(&event).map_err(Error::from)?;
         }
         // Other events need not be handled
         Event::Other => {}

+ 6 - 1
src/registry.rs

@@ -18,7 +18,12 @@ impl HandleRegistry {
 
     pub fn handle(&self, event: &Event) -> Result<(), Error> {
         for h in &self.handlers {
-            h.handle_event(event)?;
+            match h.handle_event(event) {
+                Ok(()) => {}
+                Err(e) => {
+                    eprintln!("event handling failed: {:?}", e);
+                }
+            }
         }
         Ok(())
     }