From 8b09d7a602e05227673510468ef65255dd1f4f7a Mon Sep 17 00:00:00 2001 From: kngwyu Date: Fri, 17 Aug 2018 17:13:15 +0900 Subject: [PATCH 1/3] Allow variant with no #fail attribute If a variant doesn't have fail atrribute, use its' name to display --- failure_derive/src/lib.rs | 14 +++++++------- failure_derive/tests/tests.rs | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/failure_derive/src/lib.rs b/failure_derive/src/lib.rs index 230d2ee..9c0c5d8 100644 --- a/failure_derive/src/lib.rs +++ b/failure_derive/src/lib.rs @@ -69,14 +69,14 @@ fn fail_derive(s: synstructure::Structure) -> TokenStream { } fn display_body(s: &synstructure::Structure) -> Option { - let mut msgs = s.variants().iter().map(|v| find_error_msg(&v.ast().attrs)); - if msgs.all(|msg| msg.is_none()) { - return None; - } - Some(s.each_variant(|v| { - let msg = - find_error_msg(&v.ast().attrs).expect("All variants must have display attribute."); + let msg = match find_error_msg(&v.ast().attrs) { + Some(msg) => msg, + None => { + let variant_name = v.ast().ident.to_string(); + return quote!( return write!(f, "{}", #variant_name)); + } + }; if msg.nested.is_empty() { panic!("Expected at least one argument to fail attribute"); } diff --git a/failure_derive/tests/tests.rs b/failure_derive/tests/tests.rs index 4e73255..a632276 100644 --- a/failure_derive/tests/tests.rs +++ b/failure_derive/tests/tests.rs @@ -53,3 +53,27 @@ fn enum_error() { let s = format!("{}", EnumError::UnitVariant); assert_eq!(&s[..], "An error has occurred."); } + +#[derive(Debug, Fail)] +enum EnumWithNoAttr { + #[fail(display = "Error: {}", _0)] + TupleVariant(usize), + UnitVariant, +} + +#[test] +fn enum_with_no_attr() { + let s = format!("{}", EnumWithNoAttr::TupleVariant(4)); + assert_eq!(&s[..], "Error: 4"); + let s = format!("{}", EnumWithNoAttr::UnitVariant); + assert_eq!(&s[..], "UnitVariant"); +} + +#[derive(Debug, Fail)] +struct StructWithNoAttr; + +#[test] +fn struct_with_no_attr() { + let s = format!("{}", StructWithNoAttr {}); + assert_eq!(&s[..], "StructWithNoAttr"); +} From 489255974d4a2bb36dce1ee6b1c8034993a17bc0 Mon Sep 17 00:00:00 2001 From: kngwyu Date: Sat, 18 Aug 2018 11:39:23 +0900 Subject: [PATCH 2/3] Use Debug::fmt instead of variant name --- failure_derive/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/failure_derive/src/lib.rs b/failure_derive/src/lib.rs index 9c0c5d8..e22f1c0 100644 --- a/failure_derive/src/lib.rs +++ b/failure_derive/src/lib.rs @@ -73,8 +73,7 @@ fn display_body(s: &synstructure::Structure) -> Option let msg = match find_error_msg(&v.ast().attrs) { Some(msg) => msg, None => { - let variant_name = v.ast().ident.to_string(); - return quote!( return write!(f, "{}", #variant_name)); + return quote!(return write!(f, "{:?}", self)); } }; if msg.nested.is_empty() { From 49fd080596f83a38a884821ad4f8d36d1f8fbae9 Mon Sep 17 00:00:00 2001 From: kngwyu Date: Sat, 18 Aug 2018 11:40:08 +0900 Subject: [PATCH 3/3] Add --all flag to travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 61d8965..f52b5cd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,6 @@ rust: - nightly cache: cargo script: - - cargo test + - cargo test --all - cargo test --features backtrace - cargo check --no-default-features