use std::sync::LazyLock;
#[doc(hidden)]
pub fn normalize(s: String) -> String {
let trimmed = s.trim().to_string();
trimmed.replace("\r\n", "\n")
}
#[doc(hidden)]
pub fn scrub_path(s: String, path: &std::path::Path, replacement: &str) -> String {
s.replace(&path.display().to_string(), replacement)
.replace("\\", "/")
}
static BACKTRACE_ENABLED: LazyLock<bool> = LazyLock::new(|| {
use std::backtrace::{Backtrace, BacktraceStatus};
Backtrace::capture().status() == BacktraceStatus::Captured
});
#[doc(hidden)]
pub fn strip_backtrace(s: String) -> String {
if !*BACKTRACE_ENABLED {
return s;
}
let mut in_stacktrace = false;
let mut lines = Vec::new();
for line in s.lines() {
if in_stacktrace {
if line.is_empty() {
in_stacktrace = false;
lines.push(line)
}
} else if line == "Stack backtrace:" {
in_stacktrace = true;
if let Some(previous) = lines.last() {
if previous.is_empty() {
lines.pop();
}
}
} else {
lines.push(line);
}
}
lines.join("\n")
}