ruma-api-macros: Rewrite a few leftover errors without spans

This commit is contained in:
Jonas Platte 2019-11-18 22:52:14 +01:00
parent 9b3eef4f8d
commit 6b14591d31
No known key found for this signature in database
GPG Key ID: 7D261D771D915378
4 changed files with 38 additions and 15 deletions

View File

@ -28,16 +28,15 @@ impl Meta {
/// # Panics
///
/// Panics if the given attribute is a ruma_api attribute, but fails to parse.
pub fn from_attribute(attr: &syn::Attribute) -> Option<Self> {
pub fn from_attribute(attr: &syn::Attribute) -> syn::Result<Option<Self>> {
match &attr.path {
syn::Path {
leading_colon: None,
segments,
} if segments.len() == 1 && segments[0].ident == "ruma_api" => Some(
attr.parse_args()
.expect("ruma_api! could not parse request field attributes"),
),
_ => None,
} if segments.len() == 1 && segments[0].ident == "ruma_api" => {
attr.parse_args().map(Some)
}
_ => Ok(None),
}
}
}

View File

@ -46,13 +46,32 @@ impl TryFrom<RawApi> for Api {
response: raw_api.response.try_into()?,
};
assert!(
!(res.metadata.method == "GET"
&& (res.request.has_body_fields() || res.request.newtype_body_field().is_some())),
"GET endpoints can't have body fields"
);
let newtype_body_field = res.request.newtype_body_field();
if res.metadata.method == "GET"
&& (res.request.has_body_fields() || newtype_body_field.is_some())
{
let mut combined_error: Option<syn::Error> = None;
let mut add_error = |field| {
let error = syn::Error::new_spanned(field, "GET endpoints can't have body fields");
if let Some(combined_error_ref) = &mut combined_error {
combined_error_ref.combine(error);
} else {
combined_error = Some(error);
}
};
Ok(res)
for field in res.request.body_fields() {
add_error(field);
}
if let Some(field) = newtype_body_field {
add_error(field);
}
Err(combined_error.unwrap())
} else {
Ok(res)
}
}
}

View File

@ -23,7 +23,7 @@ impl Request {
let append_stmts = self.header_fields().map(|request_field| {
let (field, header_name) = match request_field {
RequestField::Header(field, header_name) => (field, header_name),
_ => panic!("expected request field to be header variant"),
_ => unreachable!("expected request field to be header variant"),
};
let field_name = &field.ident;
@ -62,6 +62,11 @@ impl Request {
self.fields.iter().any(|field| field.is_query())
}
/// Produces an iterator over all the body fields.
pub fn body_fields(&self) -> impl Iterator<Item = &Field> {
self.fields.iter().filter_map(|field| field.as_body_field())
}
/// Produces an iterator over all the header fields.
pub fn header_fields(&self) -> impl Iterator<Item = &RequestField> {
self.fields.iter().filter(|field| field.is_header())
@ -135,7 +140,7 @@ impl TryFrom<RawRequest> for Request {
let mut header = None;
for attr in mem::replace(&mut field.attrs, Vec::new()) {
let meta = match Meta::from_attribute(&attr) {
let meta = match Meta::from_attribute(&attr)? {
Some(m) => m,
None => {
field.attrs.push(attr);

View File

@ -105,7 +105,7 @@ impl TryFrom<RawResponse> for Response {
let mut header = None;
for attr in mem::replace(&mut field.attrs, Vec::new()) {
let meta = match Meta::from_attribute(&attr) {
let meta = match Meta::from_attribute(&attr)? {
Some(m) => m,
None => {
field.attrs.push(attr);