]>
git.proxmox.com Git - cargo.git/blob - vendor/anyhow/src/fmt.rs
1 use crate::chain
::Chain
;
2 use crate::error
::ErrorImpl
;
4 use core
::fmt
::{self, Debug, Write}
;
7 pub(crate) unsafe fn display(this
: Ref
<Self>, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
8 write
!(f
, "{}", Self::error(this
))?
;
11 for cause
in Self::chain(this
).skip(1) {
12 write
!(f
, ": {}", cause
)?
;
19 pub(crate) unsafe fn debug(this
: Ref
<Self>, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
20 let error
= Self::error(this
);
23 return Debug
::fmt(error
, f
);
26 write
!(f
, "{}", error
)?
;
28 if let Some(cause
) = error
.source() {
29 write
!(f
, "\n\nCaused by:")?
;
30 let multiple
= cause
.source().is_some();
31 for (n
, error
) in Chain
::new(cause
).enumerate() {
33 let mut indented
= Indented
{
35 number
: if multiple { Some(n) }
else { None }
,
38 write
!(indented
, "{}", error
)?
;
42 #[cfg(any(backtrace, feature = "backtrace"))]
44 use crate::backtrace
::BacktraceStatus
;
46 let backtrace
= Self::backtrace(this
);
47 if let BacktraceStatus
::Captured
= backtrace
.status() {
48 let mut backtrace
= backtrace
.to_string();
50 if backtrace
.starts_with("stack backtrace:") {
51 // Capitalize to match "Caused by:"
52 backtrace
.replace_range(0..1, "S");
54 // "stack backtrace:" prefix was removed in
55 // https://github.com/rust-lang/backtrace-rs/pull/286
56 writeln
!(f
, "Stack backtrace:")?
;
58 backtrace
.truncate(backtrace
.trim_end().len());
59 write
!(f
, "{}", backtrace
)?
;
67 struct Indented
<'a
, D
> {
69 number
: Option
<usize>,
73 impl<T
> Write
for Indented
<'_
, T
>
77 fn write_str(&mut self, s
: &str) -> fmt
::Result
{
78 for (i
, line
) in s
.split('
\n'
).enumerate() {
82 Some(number
) => write
!(self.inner
, "{: >5}: ", number
)?
,
83 None
=> self.inner
.write_str(" ")?
,
86 self.inner
.write_char('
\n'
)?
;
87 if self.number
.is_some() {
88 self.inner
.write_str(" ")?
;
90 self.inner
.write_str(" ")?
;
94 self.inner
.write_str(line
)?
;
107 let input
= "verify\nthis";
108 let expected
= " 2: verify\n this";
109 let mut output
= String
::new();
119 assert_eq
!(expected
, output
);
124 let input
= "verify\nthis";
125 let expected
= " 12: verify\n this";
126 let mut output
= String
::new();
136 assert_eq
!(expected
, output
);
141 let input
= "verify\nthis";
142 let expected
= " verify\n this";
143 let mut output
= String
::new();
153 assert_eq
!(expected
, output
);