use std::error::Error;
use crate::protocol::{Event, Exception, Level};
use crate::types::Uuid;
use crate::Hub;
impl Hub {
#[allow(unused)]
pub fn capture_error<E: Error + ?Sized>(&self, error: &E) -> Uuid {
with_client_impl! {{
self.inner.with(|stack| {
let top = stack.top();
if top.client.is_some() {
let event = event_from_error(error);
self.capture_event(event)
} else {
Uuid::nil()
}
})
}}
}
}
#[allow(unused_variables)]
pub fn capture_error<E: Error + ?Sized>(error: &E) -> Uuid {
Hub::with_active(|hub| hub.capture_error(error))
}
pub fn event_from_error<E: Error + ?Sized>(err: &E) -> Event<'static> {
let mut exceptions = vec![exception_from_error(err)];
let mut source = err.source();
while let Some(err) = source {
exceptions.push(exception_from_error(err));
source = err.source();
}
exceptions.reverse();
Event {
exception: exceptions.into(),
level: Level::Error,
..Default::default()
}
}
fn exception_from_error<E: Error + ?Sized>(err: &E) -> Exception {
let dbg = format!("{:?}", err);
Exception {
ty: parse_type_from_debug(&dbg).to_owned(),
value: Some(err.to_string()),
..Default::default()
}
}
pub fn parse_type_from_debug(d: &str) -> &str {
d.split(&[' ', '(', '{', '\r', '\n'][..])
.next()
.unwrap()
.trim()
}
#[test]
fn test_parse_type_from_debug() {
use parse_type_from_debug as parse;
#[derive(Debug)]
struct MyStruct;
let err = format!("{:?}", MyStruct);
assert_eq!(parse(&err), "MyStruct");
let err = format!("{:?}", "NaN".parse::<usize>().unwrap_err());
assert_eq!(parse(&err), "ParseIntError");
let err = format!(
"{:?}",
sentry_types::ParseDsnError::from(sentry_types::ParseProjectIdError::EmptyValue)
);
assert_eq!(parse(&err), "InvalidProjectId");
let err = format!(
"{:#?}",
anyhow::Error::from("NaN".parse::<usize>().unwrap_err())
);
assert_eq!(parse(&err), "ParseIntError");
let err = format!(
"{:?}",
failure::Error::from("NaN".parse::<usize>().unwrap_err())
);
assert_eq!(parse(&err), "ParseIntError");
}