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