diff --git a/ruma-api-macros/src/api/attribute.rs b/ruma-api-macros/src/api/attribute.rs index 0e8c55ee..b587fe65 100644 --- a/ruma-api-macros/src/api/attribute.rs +++ b/ruma-api-macros/src/api/attribute.rs @@ -14,23 +14,27 @@ pub enum Meta { } impl Meta { - /// Check if the given attribute is a ruma_api attribute. If it is, parse it, if not, return - /// it unchanged. Panics if the argument is an invalid ruma_api attribute. - pub fn from_attribute(attr: syn::Attribute) -> Result { + /// Check if the given attribute is a ruma_api attribute. If it is, parse it. + /// + /// # Panics + /// + /// Panics if the given attribute is a ruma_api attribute, but fails to parse. + pub fn from_attribute(attr: &syn::Attribute) -> Option { match &attr.path { syn::Path { leading_colon: None, segments, } => { if segments.len() == 1 && segments[0].ident == "ruma_api" { - Ok(attr - .parse_args() - .expect("ruma_api! could not parse request field attributes")) + Some( + attr.parse_args() + .expect("ruma_api! could not parse request field attributes"), + ) } else { - Err(attr) + None } } - _ => Err(attr), + _ => None, } } } diff --git a/ruma-api-macros/src/api/request.rs b/ruma-api-macros/src/api/request.rs index c8e04e40..a4c271a7 100644 --- a/ruma-api-macros/src/api/request.rs +++ b/ruma-api-macros/src/api/request.rs @@ -134,10 +134,10 @@ impl From> for Request { let mut field_kind = RequestFieldKind::Body; let mut header = None; - field.attrs = field.attrs.into_iter().filter_map(|attr| { + field.attrs.retain(|attr| { let meta = match Meta::from_attribute(attr) { - Ok(meta) => meta, - Err(attr) => return Some(attr), + Some(meta) => meta, + None => return true, }; match meta { @@ -163,8 +163,8 @@ impl From> for Request { } } - None - }).collect(); + false + }); if field_kind == RequestFieldKind::Body { assert!( diff --git a/ruma-api-macros/src/api/response.rs b/ruma-api-macros/src/api/response.rs index 9f1754d5..b0ad5165 100644 --- a/ruma-api-macros/src/api/response.rs +++ b/ruma-api-macros/src/api/response.rs @@ -104,10 +104,10 @@ impl From> for Response { let mut field_kind = ResponseFieldKind::Body; let mut header = None; - field.attrs = field.attrs.into_iter().filter_map(|attr| { + field.attrs.retain(|attr| { let meta = match Meta::from_attribute(attr) { - Ok(meta) => meta, - Err(attr) => return Some(attr), + Some(meta) => meta, + None => return true, }; match meta { @@ -131,8 +131,8 @@ impl From> for Response { } } - None - }).collect(); + false + }); match field_kind { ResponseFieldKind::Body => {