From 2b9742b99e380483b154ce0bec307cc3abfd9d29 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Sat, 16 Nov 2019 14:06:02 +0100 Subject: [PATCH] Slightly simplify ruma_api! expansion code --- ruma-api-macros/src/api/request.rs | 73 ++++++++++++++--------------- ruma-api-macros/src/api/response.rs | 36 ++++++-------- 2 files changed, 48 insertions(+), 61 deletions(-) diff --git a/ruma-api-macros/src/api/request.rs b/ruma-api-macros/src/api/request.rs index e4862249..6e637200 100644 --- a/ruma-api-macros/src/api/request.rs +++ b/ruma-api-macros/src/api/request.rs @@ -194,14 +194,10 @@ impl ToTokens for Request { let request_struct_body = if self.fields.is_empty() { quote!(;) } else { - let fields = self.fields.iter().map(|request_field| { - let field = request_field.field(); - let span = field.span(); - - let stripped_field = strip_serde_attrs(field); - - quote_spanned!(span=> #stripped_field) - }); + let fields = self + .fields + .iter() + .map(|request_field| strip_serde_attrs(request_field.field())); quote! { { @@ -221,16 +217,7 @@ impl ToTokens for Request { struct RequestBody(#ty); } } else if self.has_body_fields() { - let fields = self - .fields - .iter() - .filter_map(|request_field| match *request_field { - RequestField::Body(ref field) => { - let span = field.span(); - Some(quote_spanned!(span=> #field)) - } - _ => None, - }); + let fields = self.fields.iter().filter_map(RequestField::as_body_field); quote! { /// Data in the request body. @@ -244,17 +231,7 @@ impl ToTokens for Request { }; let request_path_struct = if self.has_path_fields() { - let fields = self - .fields - .iter() - .filter_map(|request_field| match *request_field { - RequestField::Path(ref field) => { - let span = field.span(); - - Some(quote_spanned!(span=> #field)) - } - _ => None, - }); + let fields = self.fields.iter().filter_map(RequestField::as_path_field); quote! { /// Data in the request path. @@ -272,16 +249,7 @@ impl ToTokens for Request { }; let request_query_struct = if self.has_query_fields() { - let fields = self - .fields - .iter() - .filter_map(|request_field| match *request_field { - RequestField::Query(ref field) => { - let span = field.span(); - Some(quote_spanned!(span=> #field)) - } - _ => None, - }); + let fields = self.fields.iter().filter_map(RequestField::as_query_field); quote! { /// Data in the request's query string. @@ -374,6 +342,33 @@ impl RequestField { self.kind() == RequestFieldKind::Query } + /// Return the contained field if this response field is a body kind. + fn as_body_field(&self) -> Option<&Field> { + if let RequestField::Body(field) = self { + Some(field) + } else { + None + } + } + + /// Return the contained field if this response field is a path kind. + fn as_path_field(&self) -> Option<&Field> { + if let RequestField::Path(field) = self { + Some(field) + } else { + None + } + } + + /// Return the contained field if this response field is a query kind. + fn as_query_field(&self) -> Option<&Field> { + if let RequestField::Query(field) = self { + Some(field) + } else { + None + } + } + /// Gets the inner `Field` value. fn field(&self) -> &Field { match *self { diff --git a/ruma-api-macros/src/api/response.rs b/ruma-api-macros/src/api/response.rs index a5e3e632..e785a006 100644 --- a/ruma-api-macros/src/api/response.rs +++ b/ruma-api-macros/src/api/response.rs @@ -172,14 +172,10 @@ impl ToTokens for Response { let response_struct_body = if self.fields.is_empty() { quote!(;) } else { - let fields = self.fields.iter().map(|response_field| { - let field = response_field.field(); - let span = field.span(); - - let stripped_field = strip_serde_attrs(field); - - quote_spanned!(span=> #stripped_field) - }); + let fields = self + .fields + .iter() + .map(|response_field| strip_serde_attrs(response_field.field())); quote! { { @@ -199,16 +195,7 @@ impl ToTokens for Response { struct ResponseBody(#ty); } } else if self.has_body_fields() { - let fields = self - .fields - .iter() - .filter_map(|response_field| match *response_field { - ResponseField::Body(ref field) => { - let span = field.span(); - Some(quote_spanned!(span=> #field)) - } - _ => None, - }); + let fields = self.fields.iter().filter_map(ResponseField::as_body_field); quote! { /// Data in the response body. @@ -253,10 +240,7 @@ impl ResponseField { /// Whether or not this response field is a body kind. fn is_body(&self) -> bool { - match *self { - ResponseField::Body(_) => true, - _ => false, - } + self.as_body_field().is_some() } /// Whether or not this response field is a header kind. @@ -267,6 +251,14 @@ impl ResponseField { } } + /// Return the contained field if this response field is a body kind. + fn as_body_field(&self) -> Option<&Field> { + match self { + ResponseField::Body(field) => Some(field), + _ => None, + } + } + /// Whether or not this response field is a newtype body kind. fn is_newtype_body(&self) -> bool { match *self {