Slightly simplify ruma_api! expansion code

This commit is contained in:
Jonas Platte 2019-11-16 14:06:02 +01:00
parent 69ee18e0a9
commit 2b9742b99e
No known key found for this signature in database
GPG Key ID: 7D261D771D915378
2 changed files with 48 additions and 61 deletions

View File

@ -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 {

View File

@ -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 {