extern crate bugsnag;
#[macro_use]
extern crate lazy_static;
use std::panic;
use std::sync::{Arc, Mutex};
struct GlobalInstanceWrapper {
instance: Option<Arc<Mutex<bugsnag::Bugsnag>>>,
}
impl GlobalInstanceWrapper {
pub fn new() -> GlobalInstanceWrapper {
GlobalInstanceWrapper { instance: None }
}
pub fn instance(&mut self) -> Option<Arc<Mutex<bugsnag::Bugsnag>>> {
self.instance.clone()
}
pub fn set_instance(&mut self, instance: bugsnag::Bugsnag) {
self.instance = Some(Arc::new(Mutex::new(instance)))
}
}
lazy_static! {
static ref INSTANCE: Mutex<GlobalInstanceWrapper> = Mutex::new(GlobalInstanceWrapper::new());
}
pub fn global_instance() -> Option<Arc<Mutex<bugsnag::Bugsnag>>> {
match INSTANCE.lock() {
Ok(mut res) => res.instance(),
Err(_) => None,
}
}
pub fn to_global_instance(api: bugsnag::Bugsnag) {
if let Ok(mut res) = INSTANCE.lock() {
res.set_instance(api);
}
}
fn register_panic_handler_with_global_instance(api: bugsnag::Bugsnag) {
to_global_instance(api);
panic::set_hook(Box::new(|info| {
if let Some(api_mtx) = global_instance() {
if let Ok(api) = api_mtx.lock() {
if bugsnag::panic::handle(
&api,
&info,
Some(&["register_panic_handler_with_global_instance"]),
).is_err()
{
println!("Error at notifying bugsnag!");
}
}
}
}));
}
fn main() {
let mut api =
bugsnag::Bugsnag::new("api-key", concat!(env!("CARGO_MANIFEST_DIR"), "/examples"));
api.set_app_info(
Some(env!("CARGO_PKG_VERSION")),
Some("development"),
Some("rust"),
);
register_panic_handler_with_global_instance(api);
panic!("Hello from a Rust panic!");
}