aboutsummaryrefslogtreecommitdiff
path: root/vendor/backtrace-ext/examples
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/backtrace-ext/examples')
-rw-r--r--vendor/backtrace-ext/examples/miette.rs99
1 files changed, 0 insertions, 99 deletions
diff --git a/vendor/backtrace-ext/examples/miette.rs b/vendor/backtrace-ext/examples/miette.rs
deleted file mode 100644
index ae41982..0000000
--- a/vendor/backtrace-ext/examples/miette.rs
+++ /dev/null
@@ -1,99 +0,0 @@
-use std::fmt::Write;
-
-use backtrace::Backtrace;
-use miette::{Context, Diagnostic, Report};
-use thiserror::Error;
-
-type Result<T> = std::result::Result<T, Report>;
-
-#[inline(never)]
-fn main() {
- set_panic_hook();
- do_thing();
-}
-
-#[inline(never)]
-fn do_thing() {
- panic!("ooopssie!!!");
-}
-
-/// Tells miette to render panics using its rendering engine.
-pub fn set_panic_hook() {
- std::panic::set_hook(Box::new(move |info| {
- let mut message = "Something went wrong".to_string();
- let payload = info.payload();
- if let Some(msg) = payload.downcast_ref::<&str>() {
- message = msg.to_string();
- }
- if let Some(msg) = payload.downcast_ref::<String>() {
- message = msg.clone();
- }
- let mut report: Result<()> = Err(Panic(message).into());
- if let Some(loc) = info.location() {
- report = report
- .with_context(|| format!("at {}:{}:{}", loc.file(), loc.line(), loc.column()));
- }
- if let Err(err) = report.with_context(|| "Main thread panicked.".to_string()) {
- eprintln!("Error: {:?}", err);
- }
- }));
-}
-
-#[derive(Debug, Error, Diagnostic)]
-#[error("{0}{}", Panic::backtrace())]
-#[diagnostic(help("set the `RUST_BACKTRACE=1` environment variable to display a backtrace."))]
-struct Panic(String);
-
-impl Panic {
- fn backtrace() -> String {
- if let Ok(var) = std::env::var("RUST_BACKTRACE") {
- if !var.is_empty() && var != "0" {
- const HEX_WIDTH: usize = std::mem::size_of::<usize>() + 2;
- // Padding for next lines after frame's address
- const NEXT_SYMBOL_PADDING: usize = HEX_WIDTH + 6;
- let mut backtrace = String::new();
- let trace = Backtrace::new();
- let frames = backtrace_ext::short_frames_strict(&trace).enumerate();
- for (idx, (frame, sub_frames)) in frames {
- let ip = frame.ip();
- let _ = write!(backtrace, "\n{:4}: {:2$?}", idx, ip, HEX_WIDTH);
-
- let symbols = frame.symbols();
- if symbols.is_empty() {
- let _ = write!(backtrace, " - <unresolved>");
- continue;
- }
-
- for (idx, symbol) in symbols[sub_frames].iter().enumerate() {
- // Print symbols from this address,
- // if there are several addresses
- // we need to put it on next line
- if idx != 0 {
- let _ = write!(backtrace, "\n{:1$}", "", NEXT_SYMBOL_PADDING);
- }
-
- if let Some(name) = symbol.name() {
- let _ = write!(backtrace, " - {}", name);
- } else {
- let _ = write!(backtrace, " - <unknown>");
- }
-
- // See if there is debug information with file name and line
- if let (Some(file), Some(line)) = (symbol.filename(), symbol.lineno()) {
- let _ = write!(
- backtrace,
- "\n{:3$}at {}:{}",
- "",
- file.display(),
- line,
- NEXT_SYMBOL_PADDING
- );
- }
- }
- }
- return backtrace;
- }
- }
- "".into()
- }
-}