Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions examples/simple.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
use std::io;

#[derive(Debug, snafu::Snafu)]
enum OuterError {
#[snafu(display("Get failed"))]
Get { source: GetError },
}

#[derive(Debug, snafu::Snafu)]
enum GetError {
#[snafu(display("IO failure"))]
Io { source: io::Error },
}

fn main() {
let err = io::Error::new(io::ErrorKind::BrokenPipe, "pipe is broken");
let err = GetError::Io { source: err };
let err = OuterError::Get { source: err };

println!("display normal: {err}");
println!("display alt : {err:#}");
}
2 changes: 2 additions & 0 deletions snafu-derive/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1796,6 +1796,7 @@ impl<'a> quote::ToTokens for DisplayImpl<'a> {
.collect();

let display = Display {
crate_root: &self.0.crate_root,
arms: &arms,
original_generics: &self.0.provided_generics_without_defaults(),
parameterized_error_name: &self.0.parameterized_name(),
Expand Down Expand Up @@ -1989,6 +1990,7 @@ impl NamedStructInfo {
let arm = quote! { #arm };

let display_impl = Display {
crate_root: &self.crate_root,
arms: &[arm],
original_generics: &original_generics,
parameterized_error_name: &parameterized_struct_name,
Expand Down
13 changes: 12 additions & 1 deletion snafu-derive/src/shared.rs
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,7 @@ pub mod display {
const FORMATTER_ARG: StaticIdent = StaticIdent("__snafu_display_formatter");

pub(crate) struct Display<'a> {
pub(crate) crate_root: &'a dyn ToTokens,
pub(crate) arms: &'a [TokenStream],
pub(crate) original_generics: &'a [TokenStream],
pub(crate) parameterized_error_name: &'a dyn ToTokens,
Expand All @@ -470,6 +471,7 @@ pub mod display {
impl ToTokens for Display<'_> {
fn to_tokens(&self, stream: &mut TokenStream) {
let Self {
crate_root,
arms,
original_generics,
parameterized_error_name,
Expand All @@ -487,6 +489,15 @@ pub mod display {
match *self {
#(#arms),*
}

if #FORMATTER_ARG.alternate() {
let chain = #crate_root::ChainCompat::new(self).skip(1);
for item in chain {
write!(#FORMATTER_ARG, ": {item}")?;
}
}

Ok(())
}
}
};
Expand Down Expand Up @@ -561,7 +572,7 @@ pub mod display {

let match_arm = quote! {
#pattern_ident { #(ref #field_names),* } => {
write!(#FORMATTER_ARG, #format, #shorthand_assignments)
write!(#FORMATTER_ARG, #format, #shorthand_assignments)?;
}
};

Expand Down