From e783288ef0efd8d7420a4fc6ef8bd96bc87f0cad Mon Sep 17 00:00:00 2001 From: Devin Ragotzy Date: Thu, 6 Aug 2020 16:16:17 -0400 Subject: [PATCH] Limit when RequestQuery impls Deserialize and impl Outgoing --- ruma-api-macros/src/api/request.rs | 17 +++++++++++++---- ruma-api-macros/src/util.rs | 16 ++++++++++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/ruma-api-macros/src/api/request.rs b/ruma-api-macros/src/api/request.rs index a05c1e35..fd53bca4 100644 --- a/ruma-api-macros/src/api/request.rs +++ b/ruma-api-macros/src/api/request.rs @@ -422,29 +422,37 @@ impl ToTokens for Request { let request_query_struct = if let Some(f) = self.query_map_field() { let field = Field { ident: None, colon_token: None, ..f.clone() }; - let lifetime = self.query_lifetimes(); + let (derive_deserialize, lifetime) = if self.has_query_lifetimes() { + (TokenStream::new(), self.query_lifetimes()) + } else { + (quote!(::ruma_api::exports::serde::Deserialize), TokenStream::new()) + }; quote! { /// Data in the request's query string. #[derive( Debug, ::ruma_api::Outgoing, - ::ruma_api::exports::serde::Deserialize, ::ruma_api::exports::serde::Serialize, + #derive_deserialize )] struct RequestQuery #lifetime (#field); } } else if self.has_query_fields() { let fields = self.fields.iter().filter_map(RequestField::as_query_field); - let lifetime = self.query_lifetimes(); + let (derive_deserialize, lifetime) = if self.has_query_lifetimes() { + (TokenStream::new(), self.query_lifetimes()) + } else { + (quote!(::ruma_api::exports::serde::Deserialize), TokenStream::new()) + }; quote! { /// Data in the request's query string. #[derive( Debug, ::ruma_api::Outgoing, - ::ruma_api::exports::serde::Deserialize, ::ruma_api::exports::serde::Serialize, + #derive_deserialize )] struct RequestQuery #lifetime { #(#fields),* @@ -460,6 +468,7 @@ impl ToTokens for Request { pub struct Request #request_generics #request_def #request_body_struct + #request_query_struct }; diff --git a/ruma-api-macros/src/util.rs b/ruma-api-macros/src/util.rs index 1925a40c..2de19b79 100644 --- a/ruma-api-macros/src/util.rs +++ b/ruma-api-macros/src/util.rs @@ -5,8 +5,8 @@ use quote::quote; use std::collections::BTreeSet; use syn::{ AngleBracketedGenericArguments, GenericArgument, Ident, Lifetime, - ParenthesizedGenericArguments, PathArguments, Type, TypeGroup, TypeParen, TypePath, - TypeReference, TypeTuple, + ParenthesizedGenericArguments, PathArguments, Type, TypeArray, TypeBareFn, TypeGroup, + TypeParen, TypePath, TypePtr, TypeReference, TypeSlice, TypeTuple, }; use crate::api::{metadata::Metadata, request::Request}; @@ -51,6 +51,18 @@ pub fn collect_lifetime_ident(lifetimes: &mut BTreeSet, ty: &Type) { } Type::Paren(TypeParen { elem, .. }) => collect_lifetime_ident(lifetimes, &*elem), Type::Group(TypeGroup { elem, .. }) => collect_lifetime_ident(lifetimes, &*elem), + Type::Ptr(TypePtr { elem, .. }) => collect_lifetime_ident(lifetimes, &*elem), + Type::Slice(TypeSlice { elem, .. }) => collect_lifetime_ident(lifetimes, &*elem), + Type::Array(TypeArray { elem, .. }) => collect_lifetime_ident(lifetimes, &*elem), + Type::BareFn(TypeBareFn { + lifetimes: Some(syn::BoundLifetimes { lifetimes: fn_lifetimes, .. }), + .. + }) => { + for lt in fn_lifetimes { + let syn::LifetimeDef { lifetime, .. } = lt; + lifetimes.insert(lifetime.clone()); + } + } _ => {} } }