From 04f55db4b6b42d0a5d4b6194bd7e7217d763ae93 Mon Sep 17 00:00:00 2001 From: RoxasShadow Date: Sat, 14 Apr 2018 15:23:15 +0200 Subject: [PATCH] Allow sending arbitrary custom metadata #6 --- src/lib.rs | 52 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 3d4bcd16..6e0a4018 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,6 +11,7 @@ use std::{thread, fmt, panic, error}; use std::borrow::ToOwned; use std::sync::Arc; use backtrace::Backtrace; +use serde_json::value::Value as JsonValue; /// Report an error. Any type that implements `error::Error` is accepted. #[macro_export] @@ -236,7 +237,10 @@ pub struct ReportErrorBuilder<'a> { /// The title shown in the dashboard for this report. #[serde(skip_serializing_if = "Option::is_none")] - title: Option + title: Option, + + /// Custom arbitrary metadata. + metadata: Option } impl<'a> ReportErrorBuilder<'a> { @@ -274,6 +278,9 @@ impl<'a> ReportErrorBuilder<'a> { /// Set the security level of the report. `Level::ERROR` is the default value. add_generic_field!(with_level, level, Into); + /// Set arbitrary custom metadata to be attached to the error report. + add_field!(with_metadata, metadata, JsonValue); + /// Set the title to show in the dashboard for this report. add_generic_field!(with_title, title, Into); @@ -307,7 +314,10 @@ impl<'a> ToString for ReportErrorBuilder<'a> { .unwrap_or(Level::ERROR) .to_string(), "language": "rust", - "title": self.title + "title": self.title, + "custom": self.metadata + .to_owned() + .unwrap_or_else(|| json!({})) } }).to_string() } @@ -321,13 +331,19 @@ pub struct ReportMessageBuilder<'a> { message: &'a str, /// The severity level of the error. `Level::ERROR` is the default value. - level: Option + level: Option, + + /// Custom arbitrary metadata. + metadata: Option } impl<'a> ReportMessageBuilder<'a> { /// Set the security level of the report. `Level::ERROR` is the default value add_generic_field!(with_level, level, Into); + /// Set arbitrary custom metadata to be attached to the error report. + add_field!(with_metadata, metadata, JsonValue); + /// Send the message to Rollbar. pub fn send(&mut self) -> thread::JoinHandle> { let client = self.report_builder.client; @@ -358,7 +374,10 @@ impl<'a> ToString for ReportMessageBuilder<'a> { "level": self.level .to_owned() .unwrap_or(Level::INFO) - .to_string() + .to_string(), + "custom": self.metadata + .to_owned() + .unwrap_or_else(|| json!({})) } }).to_string() } @@ -392,7 +411,8 @@ impl<'a> ReportBuilder<'a> { report_builder: self, trace: trace, level: None, - title: Some(message.to_owned()) + title: Some(message.to_owned()), + metadata: None } } @@ -406,7 +426,8 @@ impl<'a> ReportBuilder<'a> { report_builder: self, trace: trace, level: None, - title: Some(format!("{}", error)) + title: Some(format!("{}", error)), + metadata: None } } @@ -422,7 +443,8 @@ impl<'a> ReportBuilder<'a> { report_builder: self, trace: trace, level: None, - title: Some(message) + title: Some(message), + metadata: None } } @@ -431,7 +453,8 @@ impl<'a> ReportBuilder<'a> { ReportMessageBuilder { report_builder: self, message: message, - level: None + level: None, + metadata: None } } @@ -647,6 +670,7 @@ mod tests { } } }, + "custom": {}, "level": "info", "language": "rust", "title": "attempt to divide by zero" @@ -670,9 +694,8 @@ mod tests { .get_mut(0).unwrap() .get_mut("lineno").unwrap() = line_number.to_owned(); - normalize_frames!(payload, expected_payload, 1); - assert_eq!(expected_payload.to_string(), payload.to_string()); + assert_eq!(expected_payload, payload); } #[test] @@ -714,6 +737,7 @@ mod tests { } } }, + "custom": {}, "level": "warning", "language": "rust", "title": "w" @@ -722,7 +746,7 @@ mod tests { let mut payload: Value = serde_json::from_str(&*payload).unwrap(); normalize_frames!(payload, expected_payload, 2); - assert_eq!(expected_payload.to_string(), payload.to_string()); + assert_eq!(expected_payload, payload); } } } @@ -734,6 +758,9 @@ mod tests { let payload = client.build_report() .from_message("hai") .with_level("warning") + .with_metadata(json!({ + "foo": "bar" + })) .to_string(); let expected_payload = json!({ @@ -745,6 +772,9 @@ mod tests { "body": "hai" } }, + "custom": { + "foo": "bar" + }, "level": "warning" } }).to_string();