Skip to content

Commit 5e65f54

Browse files
committed
refactor field filtering
1 parent a969f5f commit 5e65f54

1 file changed

Lines changed: 25 additions & 29 deletions

File tree

custom_debug_derive/src/lib.rs

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,58 @@
1+
use crate::filter_ext::FilterExt;
12
use itertools::Itertools;
23
use proc_macro2::TokenStream;
34
use quote::quote;
45
use syn::spanned::Spanned;
56
use syn::{parse_str, Fields, Ident, Lit, Meta, NestedMeta, Path, Result};
67
use synstructure::{decl_derive, AddBounds, BindingInfo, Structure, VariantInfo};
78

9+
mod filter_ext;
810
#[cfg(test)]
911
mod tests;
1012

1113
decl_derive!([Debug, attributes(debug)] => custom_debug_derive);
1214

1315
fn custom_debug_derive(mut structure: Structure) -> Result<TokenStream> {
16+
filter_out_skipped_fields(&mut structure)?;
17+
1418
structure.add_bounds(AddBounds::Fields);
1519

16-
let skip_ident: Ident = parse_str("skip").unwrap();
20+
let match_arms =
21+
structure.each_variant(|variant| generate_match_arm_body(variant).into_stream());
22+
23+
Ok(structure.gen_impl(quote! {
24+
gen impl ::core::fmt::Debug for @Self {
25+
fn fmt(&self, fmt: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
26+
match self {
27+
#match_arms
28+
}
29+
}
30+
}
31+
}))
32+
}
1733

18-
let mut filter_err = None;
34+
fn filter_out_skipped_fields(structure: &mut Structure) -> Result<()> {
35+
let skip_ident: Ident = parse_str("skip").unwrap();
1936

20-
structure.filter(|binding| {
37+
structure.try_filter(|binding| {
2138
for meta in get_metas(binding) {
22-
let meta = match meta {
23-
Ok(meta) => meta,
24-
Err(err) => {
25-
filter_err = Some(err);
26-
return false;
27-
}
28-
};
39+
let meta = meta?;
2940

3041
if let NestedMeta::Meta(Meta::Path(ref path)) = meta {
3142
if path
3243
.get_ident()
3344
.map(|ident| ident == &skip_ident)
3445
.unwrap_or(false)
3546
{
36-
return false;
47+
return Ok(false);
3748
}
3849
}
3950
}
4051

41-
true
42-
});
43-
44-
if let Some(filter_err) = filter_err {
45-
return Err(filter_err);
46-
}
47-
48-
let match_arms =
49-
structure.each_variant(|variant| generate_match_arm_body(variant).into_stream());
52+
Ok(true)
53+
})?;
5054

51-
Ok(structure.gen_impl(quote! {
52-
gen impl ::core::fmt::Debug for @Self {
53-
fn fmt(&self, fmt: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
54-
match self {
55-
#match_arms
56-
}
57-
}
58-
}
59-
}))
55+
Ok(())
6056
}
6157

6258
fn generate_match_arm_body(variant: &VariantInfo) -> Result<TokenStream> {

0 commit comments

Comments
 (0)