]>
git.proxmox.com Git - rustc.git/blob - vendor/anyhow/src/fmt.rs
1 use crate::chain
::Chain
;
2 use crate::error
::ErrorImpl
;
3 use core
::fmt
::{self, Debug, Write}
;
6 pub(crate) fn display(&self, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
7 write
!(f
, "{}", self.error())?
;
10 for cause
in self.chain().skip(1) {
11 write
!(f
, ": {}", cause
)?
;
18 pub(crate) fn debug(&self, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
19 let error
= self.error();
22 return Debug
::fmt(error
, f
);
25 write
!(f
, "{}", error
)?
;
27 if let Some(cause
) = error
.source() {
28 write
!(f
, "\n\nCaused by:")?
;
29 let multiple
= cause
.source().is_some();
30 for (n
, error
) in Chain
::new(cause
).enumerate() {
32 let mut indented
= Indented
{
34 number
: if multiple { Some(n) }
else { None }
,
37 write
!(indented
, "{}", error
)?
;
43 use std
::backtrace
::BacktraceStatus
;
45 let backtrace
= self.backtrace();
46 if let BacktraceStatus
::Captured
= backtrace
.status() {
47 let mut backtrace
= backtrace
.to_string();
49 if backtrace
.starts_with("stack backtrace:") {
50 // Capitalize to match "Caused by:"
51 backtrace
.replace_range(0..1, "S");
53 // "stack backtrace:" prefix was removed in
54 // https://github.com/rust-lang/backtrace-rs/pull/286
55 writeln
!(f
, "Stack backtrace:")?
;
57 backtrace
.truncate(backtrace
.trim_end().len());
58 write
!(f
, "{}", backtrace
)?
;
66 struct Indented
<'a
, D
> {
68 number
: Option
<usize>,
72 impl<T
> Write
for Indented
<'_
, T
>
76 fn write_str(&mut self, s
: &str) -> fmt
::Result
{
77 for (i
, line
) in s
.split('
\n'
).enumerate() {
81 Some(number
) => write
!(self.inner
, "{: >5}: ", number
)?
,
82 None
=> self.inner
.write_str(" ")?
,
85 self.inner
.write_char('
\n'
)?
;
86 if self.number
.is_some() {
87 self.inner
.write_str(" ")?
;
89 self.inner
.write_str(" ")?
;
93 self.inner
.write_str(line
)?
;
106 let input
= "verify\nthis";
107 let expected
= " 2: verify\n this";
108 let mut output
= String
::new();
118 assert_eq
!(expected
, output
);
123 let input
= "verify\nthis";
124 let expected
= " 12: verify\n this";
125 let mut output
= String
::new();
135 assert_eq
!(expected
, output
);
140 let input
= "verify\nthis";
141 let expected
= " verify\n this";
142 let mut output
= String
::new();
152 assert_eq
!(expected
, output
);