Skip to content

Commit 652923b

Browse files
committed
fix: generic errors
1 parent b63e3d4 commit 652923b

File tree

2 files changed

+42
-12
lines changed

2 files changed

+42
-12
lines changed

n0-error-macros/src/lib.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ fn generate_enum_impls(
546546
});
547547

548548
quote! {
549-
impl ::n0_error::StackError for #enum_ident #generics {
549+
impl #impl_generics ::n0_error::StackError for #enum_ident #ty_generics #where_clause {
550550
fn as_std(&self) -> &(dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static) {
551551
self
552552
}
@@ -579,21 +579,21 @@ fn generate_enum_impls(
579579
}
580580
}
581581

582-
impl #impl_generics ::core::convert::From<#enum_ident> for ::n0_error::AnyError #ty_generics #where_clause {
583-
fn from(value: #enum_ident) -> ::n0_error::AnyError {
582+
impl #impl_generics ::core::convert::From<#enum_ident #ty_generics> for ::n0_error::AnyError #where_clause {
583+
fn from(value: #enum_ident #ty_generics) -> ::n0_error::AnyError {
584584
::n0_error::AnyError::from_stack(value)
585585
}
586586
}
587587

588-
impl ::std::fmt::Display for #enum_ident #generics {
588+
impl #impl_generics ::std::fmt::Display for #enum_ident #ty_generics #where_clause {
589589
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
590590
use ::n0_error::{SourceFormat, StackError};
591591
let sources = f.alternate().then_some(SourceFormat::OneLine);
592592
write!(f, "{}", self.report().sources(sources))
593593
}
594594
}
595595

596-
impl ::std::fmt::Debug for #enum_ident #generics {
596+
impl #impl_generics ::std::fmt::Debug for #enum_ident #ty_generics #where_clause {
597597
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
598598
use ::n0_error::StackErrorExt;
599599
if f.alternate() {
@@ -608,7 +608,7 @@ fn generate_enum_impls(
608608
}
609609
}
610610

611-
impl ::std::error::Error for #enum_ident #generics {
611+
impl #impl_generics ::std::error::Error for #enum_ident #ty_generics #where_clause {
612612
fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
613613
match self {
614614
#( #match_std_source_arms )*
@@ -807,7 +807,7 @@ fn generate_struct_impl(
807807
#constructor
808808
}
809809

810-
impl ::n0_error::StackError for #item_ident #generics {
810+
impl #impl_generics ::n0_error::StackError for #item_ident #ty_generics #where_clause {
811811
fn as_std(&self) -> &(dyn ::std::error::Error + ::std::marker::Send + ::std::marker::Sync + 'static) {
812812
self
813813
}
@@ -832,21 +832,21 @@ fn generate_struct_impl(
832832
}
833833

834834

835-
impl #impl_generics ::core::convert::From<#item_ident> for ::n0_error::AnyError #ty_generics #where_clause {
836-
fn from(value: #item_ident) -> ::n0_error::AnyError {
835+
impl #impl_generics ::core::convert::From<#item_ident #ty_generics> for ::n0_error::AnyError #where_clause {
836+
fn from(value: #item_ident #ty_generics) -> ::n0_error::AnyError {
837837
::n0_error::AnyError::from_stack(value)
838838
}
839839
}
840840

841-
impl ::std::fmt::Display for #item_ident #generics {
841+
impl #impl_generics ::std::fmt::Display for #item_ident #ty_generics #where_clause {
842842
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
843843
use ::n0_error::{SourceFormat, StackError};
844844
let sources = f.alternate().then_some(SourceFormat::OneLine);
845845
write!(f, "{}", self.report().sources(sources))
846846
}
847847
}
848848

849-
impl ::std::fmt::Debug for #item_ident #generics {
849+
impl #impl_generics ::std::fmt::Debug for #item_ident #ty_generics #where_clause {
850850
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
851851
if f.alternate() {
852852
#get_debug
@@ -858,7 +858,7 @@ fn generate_struct_impl(
858858
}
859859
}
860860

861-
impl ::std::error::Error for #item_ident #generics {
861+
impl #impl_generics ::std::error::Error for #item_ident #ty_generics #where_clause {
862862
fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
863863
#get_std_source
864864
}

src/tests.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,3 +482,33 @@ pub fn test_skip_transparent_errors() {
482482
println!("#### no bt, not transparent, display");
483483
println!("{}", err_a(false).unwrap_err());
484484
}
485+
486+
#[test]
487+
fn test_generics() {
488+
#[add_meta]
489+
#[derive(Error)]
490+
#[display("failed at {}", list.iter().map(|e| e.to_string()).collect::<Vec<_>>().join(", "))]
491+
struct GenericError<E: std::fmt::Display + std::fmt::Debug + Send + Sync + 'static> {
492+
list: Vec<E>,
493+
}
494+
495+
#[add_meta]
496+
#[derive(Error)]
497+
enum GenericEnumError<E: std::fmt::Display + std::fmt::Debug + Send + Sync + 'static> {
498+
Foo,
499+
Bar {
500+
list: Vec<E>,
501+
},
502+
#[display("failed at {other}")]
503+
Baz {
504+
other: Box<E>,
505+
},
506+
}
507+
508+
let err = GenericError::new(vec!["foo", "bar"]);
509+
assert_eq!(format!("{err}"), "failed at foo, bar");
510+
let err = e!(GenericEnumError::Baz {
511+
other: Box::new("foo")
512+
});
513+
assert_eq!(format!("{err}"), "failed at foo");
514+
}

0 commit comments

Comments
 (0)