use std::panic::PanicInfo;
use url::Url;
use crate::utils::terminal::{Colorize, Link, Stream};
use super::validate::validate_repository;
#[derive(Debug)]
pub struct PackageMetadata<'a> {
pub pkg_name: &'a str,
pub crate_name: &'a str,
pub version: &'a str,
pub repository: &'a str,
}
pub fn handler<F>(hook_fn: F, metadata: PackageMetadata<'static>)
where
F: Fn(&PanicInfo<'_>, &PackageMetadata) + Sync + Send + 'static,
{
let prev_hook = std::panic::take_hook();
std::panic::set_hook(Box::new(move |panic_info| {
prev_hook(panic_info);
hook_fn(panic_info, &metadata);
}));
}
pub fn suggest_issue_tracker(info: &PanicInfo<'_>, metadata: &PackageMetadata) {
if cfg!(not(feature = "color")) {
colored::control::set_override(false);
}
let mut report_url = None;
if !&metadata.repository.is_empty() {
if let Some(provider) = validate_repository(&Url::parse(metadata.repository).unwrap()) {
report_url = Some(provider.build_issue_url(info, metadata));
}
}
println!(
"{}",
format!(
"\n---------------------- {} ----------------------\n",
"Crash Detected".bold()
)
.red()
);
if let Some(url) = report_url {
println!(
"{}",
"This application has issue tracker support enabled.".italic()
);
println!(
"{}",
"Click the link below to report this crash to the developers.".bold()
);
if crate::utils::terminal::on(Stream::Stdout)
&& !std::env::var("TERM_PROGRAM")
.unwrap_or("unknown".to_string())
.contains("vscode")
{
let link = Link::new("Report Crash", url.as_str());
println!("\n[{}]", link.to_string().cyan().bold());
} else {
println!("\n{}", url.to_string().cyan().bold());
}
} else {
if cfg!(debug_assertions) {
println!(
"{}",
"This application has issue tracker support enabled.".italic()
);
println!("However, it was not possible to determine the repository URL.");
println!(
"Please add a `{}` key to your {}.",
"repository".bright_green().bold(),
"Cargo.toml".cyan().bold()
);
println!(
"{}",
"\nThere is also a chance your repository service is not supported\nYou can request support at: https://github.com/ewpratten/crashreport-rs".italic()
);
} else {
println!(
"{}",
"This application has issue tracker support enabled.".italic()
);
println!("However, it was not possible to determine the issue tracker URL.");
}
}
println!(
"{}",
"\n------------------------------------------------------------\n".red()
)
}