From a3fae4424c3263cab0153baf135f4797904a7faa Mon Sep 17 00:00:00 2001 From: Cheese-Space Date: Sun, 29 Mar 2026 22:56:03 +0200 Subject: [PATCH 1/3] add enum and functions for setting backtrace visibility --- src/lib.rs | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 0b5f69f..87d47eb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -650,7 +650,49 @@ pub trait Context: context::private::Sealed { pub fn Ok(value: T) -> Result { Result::Ok(value) } - +#[cfg(feature = "std")] +/// Enum for backtrace visibility. +/// +/// See set_backtrace_visibility() for usage examples. +/// Note: BacktraceVisibility is not available in no_std. +pub enum BacktraceVisibility { + /// Visible backtrace for panics and errors. + PanicAndError, + /// Only show backtrace for panics. + PanicOnly +} +#[inline] +#[cfg(feature = "std")] +/// Sets backtrace visibility. +/// +/// See BackTraceVisibility for more info. +/// Note: set_backtrace_visibility is not available in no_std. +/// +/// # example +/// ``` +/// use anyhow::{bail, BacktraceVisibility::*, set_backtrace_visibility}; +/// fn main() -> anyhow::Result<()> { +/// set_backtrace_visibility(PanicOnly); +/// bail!("you shall not see a backtrace!"); +/// } +/// ``` +pub fn set_backtrace_visibility(visibility: BacktraceVisibility) { + use std::env; + use crate::BacktraceVisibility::*; + match visibility { + PanicAndError => { + unsafe { + env::set_var("RUST_BACKTRACE", "1"); + } + } + PanicOnly => { + unsafe { + env::set_var("RUST_BACKTRACE", "1"); + env::set_var("RUST_LIB_BACKTRACE", "0"); + } + } + } +} // Not public API. Referenced by macro-generated code. #[doc(hidden)] pub mod __private { From 56a61544741db6b7a1131e90ed5685550cbdc9bf Mon Sep 17 00:00:00 2001 From: Cheese_space <99285740+Cheese-Space@users.noreply.github.com> Date: Mon, 30 Mar 2026 16:38:07 +0200 Subject: [PATCH 2/3] fix formatting so tests pass --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 87d47eb..3a698c4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -665,11 +665,11 @@ pub enum BacktraceVisibility { #[cfg(feature = "std")] /// Sets backtrace visibility. /// -/// See BackTraceVisibility for more info. +/// See BackTraceVisibility for more info. /// Note: set_backtrace_visibility is not available in no_std. /// /// # example -/// ``` +/// ``` no_run /// use anyhow::{bail, BacktraceVisibility::*, set_backtrace_visibility}; /// fn main() -> anyhow::Result<()> { /// set_backtrace_visibility(PanicOnly); From 180e54fe5f95a0840e6031a745a29d2f60ed952b Mon Sep 17 00:00:00 2001 From: Cheese_space <99285740+Cheese-Space@users.noreply.github.com> Date: Mon, 30 Mar 2026 16:46:21 +0200 Subject: [PATCH 3/3] remove unused unsafe block --- src/lib.rs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 3a698c4..97dc9b6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -680,16 +680,10 @@ pub fn set_backtrace_visibility(visibility: BacktraceVisibility) { use std::env; use crate::BacktraceVisibility::*; match visibility { - PanicAndError => { - unsafe { - env::set_var("RUST_BACKTRACE", "1"); - } - } + PanicAndError => env::set_var("RUST_BACKTRACE", "1"), PanicOnly => { - unsafe { - env::set_var("RUST_BACKTRACE", "1"); - env::set_var("RUST_LIB_BACKTRACE", "0"); - } + env::set_var("RUST_BACKTRACE", "1"); + env::set_var("RUST_LIB_BACKTRACE", "0"); } } }