use crate::event::{Cause, Event};
use crate::level::Level;
pub fn capture_anyhow(err: &anyhow::Error) -> Option<String> {
capture_anyhow_at_level(err, Level::Error)
}
pub fn capture_anyhow_at_level(err: &anyhow::Error, level: Level) -> Option<String> {
crate::with_client(|client| {
let cfg = client.config();
if !cfg.enabled() || level < cfg.min_level {
return None;
}
let mut event = Event::new(level, err.to_string());
let causes: Vec<Cause> = err
.chain()
.skip(1)
.take(5)
.map(|c| Cause {
class: None,
message: c.to_string(),
})
.collect();
if !causes.is_empty() {
if let Ok(v) = serde_json::to_value(&causes) {
event.set_metadata("exception_causes", v);
}
}
let rendered = format!("{}", err.backtrace());
if !rendered.is_empty() && !rendered.starts_with("disabled") {
let frames = crate::backtrace::parse_std_backtrace(&rendered, cfg);
if !frames.is_empty() {
event.backtrace = Some(crate::backtrace::frames_to_string(&frames));
if let Ok(v) = serde_json::to_value(&frames) {
event.set_metadata("exception_frames", v);
}
} else {
event.backtrace = Some(rendered);
}
}
crate::finalize_and_capture(client, event)
})
.flatten()
}