macros: Only iterate fields once in EventContent derive
This commit is contained in:
parent
46bab5cca6
commit
0b10151bcb
@ -182,39 +182,37 @@ fn generate_redacted_event_content(
|
||||
let doc = format!("Redacted form of [`{}`]", ident);
|
||||
let redacted_ident = format_ident!("Redacted{}", ident);
|
||||
|
||||
let kept_redacted_fields =
|
||||
if let syn::Data::Struct(st) = &input.data {
|
||||
// this is to validate the `#[ruma_event(skip_redaction)]` attribute
|
||||
let kept_redacted_fields: Vec<syn::Field> = if let syn::Data::Struct(st) = &input.data {
|
||||
st.fields
|
||||
.iter()
|
||||
.flat_map(|f| &f.attrs)
|
||||
.filter(|a| a.path.is_ident("ruma_event"))
|
||||
.find_map(|a| {
|
||||
if let Err(e) = a.parse_args::<EventMeta>() {
|
||||
Some(Err(e))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.unwrap_or(Ok(()))?;
|
||||
|
||||
let mut fields: Vec<_> = st
|
||||
.fields
|
||||
.map(|f| {
|
||||
let mut keep_field = false;
|
||||
let attrs = f
|
||||
.attrs
|
||||
.iter()
|
||||
.filter(|f| {
|
||||
matches!(
|
||||
f.attrs.iter().find_map(|a| a.parse_args::<EventMeta>().ok()),
|
||||
Some(EventMeta::SkipRedaction)
|
||||
)
|
||||
})
|
||||
.cloned()
|
||||
.collect();
|
||||
.map(|a| -> syn::Result<_> {
|
||||
if a.path.is_ident("ruma_event") {
|
||||
if let EventMeta::SkipRedaction = a.parse_args()? {
|
||||
keep_field = true;
|
||||
}
|
||||
|
||||
// don't re-emit our `ruma_event` attributes
|
||||
for f in &mut fields {
|
||||
f.attrs.retain(|a| !a.path.is_ident("ruma_event"));
|
||||
Ok(None)
|
||||
} else {
|
||||
Ok(Some(a.clone()))
|
||||
}
|
||||
fields
|
||||
})
|
||||
.filter_map(Result::transpose)
|
||||
.collect::<syn::Result<_>>()?;
|
||||
|
||||
if keep_field {
|
||||
Ok(Some(syn::Field { attrs, ..f.clone() }))
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
})
|
||||
.filter_map(Result::transpose)
|
||||
.collect::<syn::Result<_>>()?
|
||||
} else {
|
||||
vec![]
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user