Limit when RequestQuery impls Deserialize and impl Outgoing
This commit is contained in:
parent
770a68d49b
commit
e783288ef0
@ -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
|
||||
};
|
||||
|
||||
|
@ -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<Lifetime>, 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());
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user